1

スレッドやスレッドプールを使用する実装ではなく、明示的なスレッドオブジェクトなしで並行性を表現できるかどうかは疑問ですが、言語設計に関連する問題です。スレッドなしで並行性を表現する方法

Q1:スレッドオブジェクトがないと何が失われるのだろうと思いますが、そのような言語ではできないものはありますか?

Q2:これがどのように表現されるのか、スレッドの代替または補完としてどのような方法が提案または実装されたのだろうか?

+0

タスク、アクター、並列ループなどを含む多くの方法で並行性を表現できます。さまざまなパラレル列挙型など(これらはC#で私が知っているものです)私はそれらをすべてリストすることを求める質問はあまりにも広すぎると思います。 – svick

+0

@svickおそらく、私はそれがすべてではないと思う。並列列挙型は並列ループの特殊化ではありませんか?ループ並列化の脚注と並行して列挙できないでしょうか? – Martin

答えて

0

一つの可能​​性は

は、次のコード

for(int i=0; i < 100; i++) { 
    work(i); 
} 

の分離だろう「ノーマル」スレッドベースの方法を持って言うことができます(GPUだけでなく)MPI-プログラムの開発、モデルであり、 iteration-rangeを複数のサブセットに分割します。したがって、この

スレッド-1のようなもの:

for(int i=0; i < 50; i++) { 
    work(i); 
} 

スレッド-2:

for(int i=50; i < 100; i++) { 
    work(i); 
} 

しかしMPI/GPUで、あなたは別の何かをします。 考え方は、すべてのコアが同じ(GPU)を実行するか、少なくとも (MPI)のプログラムを実行するということです。相違点は、各コアが別のIDを使用してコードの動作を変更することです。

MPI-スタイル:(ない正確MPI-構文)

int rank = get_core_id(); 
int size = get_num_core(); 
int subset = 100/size; 
for (int i = rank * subset;i < (rand+1)*subset; i+) { 
    //each core will use a different range for i 
    work(i); 
} 

次の大きなものがコミュニケーションです。通常は、すべての同期化を手動で行う必要があります。 MPIはメッセージベースであり、古典的な共有メモリモデル(すべてのコアが同じメモリにアクセスできる)には完全には適していませんが、クラスタシステム(多くのコアとネットワークを組み合わせたもの)では優れています。これはスーパーコンピュータに限らず、基本的にはmpi形式のものを使用していますが、近年、新しいタイプのコアアーキテクチャ(複数のコア)が開発されました。それらはローカルでいわゆるNetwork-On-Chipを持っているので、各コアは同期に問題がなければメッセージを送受信できます。

MPIには単純なメッセージだけでなく、すべてのコアにデータを自動的に分散して収集するためのより高い構造が含まれています。 例:(再びないMPI-構文)

int rank = get_core_id(); 
int size = get_num_core(); 
int data[100]; 
int result; 
int results[size]; 
if (rank == 0) { //master-core only 
    fill_with_stuff(data); 
} 
scatter(0, data); //core-0 will send the data-content to all other cores 
result = work(rank, data); // every core works on the same data 
gather(0,result,results); //get all local results and store them in 
          //the results-array of core-0 

他のソリューションを使用すると、並列ブロックを宣言し、ここでのOpenMP-libary です。その高速な書き込みしていること、

//this will split the for-loop automatically in 4 threads 
#pragma omp parallel for num_threads(4) 
for(int i=0; i < 100; i++) { 
    work(i); 
} 

大きな利点がある:全体のスレッド部分はlibary自体

例によって行われます。それは あなた自身でスレッドを書くことでより良いパフォーマンスを得るかもしれませんが、 同期にもっと多くの時間と知識が必要です

関連する問題