web-dev-qa-db-ja.com

もともとそのように設計されていないプログラムのマルチスレッド機能を抽象化することは可能でしょうか?

もともとそのように設計されていなかったプログラムに(またはさらに)マルチコアのスレッド化機能を提供することは可能でしょうか?

そして、「仮想」CPUコア(またはハイパースレッディングを備えたi7の場合は、仮想「仮想コア」)を作成することにより、プログラムからは、プログラムはそれを単一のコア/スレッドとして認識しますが、この仮想コアの反対側にあります。独自に複数のコア/スレッドに作業を分割するプログラム/ツール/ユーティリティですか?また、マルチコアサポート用にすでに設計されているプログラムでは、使用可能なコアの数を増やすことができる仮想コア。

ムーアの法則の「上限」に逆らってCPUが実行される代わりに、コア数が増加し、全体的なCPU速度が増加する傾向と、これらを利用するためにソフトウェア開発で一見遅いか、または追随するプッシュを考えると、これは有用だと思いますCPUコア数の増加。

このようなことはおそらく簡単ではないか、簡単に実現することはできないと思いますが、それが実現可能かどうかはほとんど疑問です。

4
Coldblackice

命令型/手続き型のスタイルで記述されたプログラムの場合、個別のスレッドが共有データにアクセスする可能性があるため、これはほぼ不可能であり、より粒度の高い並列処理の正しいセマンティクスを簡単に保証することはできません。

機能的なスタイルで記述されたプログラムは、通常、共有状態がはるかに少ないため、自動的に並列化できますが、新しいスレッドを作成するオーバーヘッドが全体的な実行時間の改善によっていつ恩恵を受けるかを自動的に決定することは依然として困難です。

8

通常のアプリケーションプログラムにはスレッドがあります。プロセッサが複数のコアを備えているのか、レプラコーンの軍隊を使って物事を成し遂げるのかは関係ありません。重要なのは、アプリケーションによって実装されるタスクと、機能を維持しながらこれらを並行して実行できるかどうかです。

一部のアプリケーションは、スレッドから利益を得るために再加工できますが、他のアプリケーションはできません。それはすべてロジックに依存します。

2
Martin Maat

あなたが手に入れる最も近いものは、C、C++、そしてFORTANの OpenMP のようなものだと思います。このライブラリでは、コードブロックの前にプラグマを1つまたは2つ挿入するだけで、forループなどのいくつかの構成を並列化できます。

void simple(int n, float *a, float *b)
{
    int i;
    // This assumes the blocks pointed to by a and b don't overlap
#pragma omp parallel for
    for (i = 1; i < n; i++) /* i is private by default */
        b[i] = (a[i] + a[i-1]) / 2.0;
}

しかし、それは魔法ではありません。他の答えが指摘しているように、並列処理の難しい部分は、実行のスレッド間で共有データへのアクセスを処理する方法を理解することです。いくつかの問題は、スレッド間でデータを共有する必要がありません。その場合、OpenMPは既存のコードを並列化することを簡単にします。ただし一般的には、データがスレッド間で共有されていることを認識し、適切な構造を選択してそのデータへのアクセスを規制する必要があります。これには、非常に困難で深い思考が必要になる場合があり、既存のコードの大幅なリファクタリングが必要になる場合があります。

1

これは最近のすべてのOSの基本であり、CPUを仮想化するための抽象化はプロセスであり、軽量プロセスも一般的にはスレッドとして知られ、さらに軽量バージョンは一般にファイバー/グリーンスレッドとして知られています。

プロセス(または軽量プロセス、またはグリーンスレッド)内で実行されている各プログラムは、仮想化されたCPUコア内で実行され、まるでそのCPUを単独で制御しているかのようです。プロセスの抽象化により、システムは、実行準備ができていないか、CPU時間の公平な配分を使い果たしたプロセスをプリエンプトすることにより、限られた数の物理CPUコアを多数のプロセスと共有できます。

0
Lie Ryan