これら2つの違いは何ですか?
[あ]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
これら2つの違いは何ですか?
[あ]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
これらは同等です。
#pragma omp parallel
スレッドのグループを生成し#pragma omp for
、生成されたスレッド間でループの繰り返しを分割します。#pragma omp parallel for
fusedディレクティブを使用すると、両方を同時に実行できます。
違いはないと思います。一方は他方のショートカットです。正確な実装では、それらの処理が異なる場合がありますが。
結合された並列ワークシェアリング構造は、1 つのワークシェアリング構造を含み、他のステートメントを含まない並列構造を指定するためのショートカットです。許可された句は、並列およびワークシェアリング コントラクトに許可された句の和集合です。
http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdfから取得
OpenMP の仕様は次のとおりです。
分離されたparallel
and for
hereを使用する例を次に示します。for
つまり、複数のスレッドでサイクルを実行する前に、OpenMP スレッド プライベート配列の動的割り当てに使用できます。場合によっては、同じ初期化を行うことはできませんparallel for
。
UPD: 質問の例では、単一のプラグマと 2 つのプラグマの間に違いはありません。しかし実際には、parallel ディレクティブと for ディレクティブを分離することで、よりスレッドを意識した動作を行うことができます。たとえば、いくつかのコード:
#pragma omp parallel
{
double *data = (double*)malloc(...); // this data is thread private
#pragma omp for
for(1...100) // first parallelized cycle
{
}
#pragma omp single
{} // make some single thread processing
#pragma omp for // second parallelized cycle
for(1...100)
{
}
#pragma omp single
{} // make some single thread processing again
free(data); // free thread private data
}
特定の例の両方のバージョンは同等ですが、他の回答で既に述べたように、それらの間にはまだ1つの小さな違いがあります。最初のバージョンには、「omp for」の最後に遭遇する不要な暗黙のバリアが含まれています。もう 1 つの暗黙のバリアは、並列領域の最後にあります。「omp for」に「nowait」を追加すると、少なくとも OpenMP の観点からは、2 つのコードが同等になります。これについて言及したのは、OpenMP コンパイラが 2 つのケースでわずかに異なるコードを生成する可能性があるためです。
g++ 4.7.0 で for ループを使用して使用すると、まったく異なるランタイムが表示されます。
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)rand() / double(RAND_MAX)) * 5;
double r2 = ((double)rand() / double(RAND_MAX)) * 5;
x.push_back(r1);
y.push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
シリアル コード (いいえopenmp
) は 79 ミリ秒で実行されます。"parallel for" コードは 29 ミリ秒で実行されます。を省略してfor
を使用する#pragma omp parallel
と、ランタイムは最大 179 ミリ秒になり、シリアル コードよりも遅くなります。(マシンのハードウェア同時実行数は 8)
コードはへのリンクlibgomp