質問
の違いは何ですから。
[A]
#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)
{
...
}
解決
違いはないと思います。一方はもう一方のショートカットです。あなたの正確な実装はそれらを異なる方法で処理するかもしれませんが。
並列ワークシェアリングコンストラクトを組み合わせたものは、1つのワークシェアリングコンストラクトとその他のステートメントを含む並列コンストラクトを指定するためのショートカットです。許可された条項は、並行したワークシェアリングの貢献に許可された条項の結合です。
から取られた http://www.openmp.org/mp-documents/openmp3.0-summaryspec.pdf
OpenMPの仕様はこちらです:
他のヒント
これらは同等です。
#pragma omp parallel
スレッドのグループをスポーンします #pragma omp for
産卵スレッド間でループ反復を分割します。あなたは融合して両方のことを一度に行うことができます #pragma omp parallel for
指令。
こちらではの使用例を分離 parallel
や for
こちらの.短で使用できるダイナミックな割り当てのOpenMPのスレッド-民間の配列を実行する前に、 for
サイクルに複数のスレッド)。ことはできないのと同じ初期化に parallel for
ます。
UPD:ご質問のような例もあまり関係ありませんがシングルpragma二pragmas.が実践できるよりスレッドを意識し行動の分離並びを示しています。一部のコード例えば:
#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」の最後に遭遇する不必要な暗黙の障壁が含まれています。他の暗黙の障壁は、平行領域の終わりに見つけることができます。 「Nowait」を「for」に追加すると、少なくともOpenMPの観点から2つのコードが同等になります。 OpenMPコンパイラが2つのケースに対してわずかに異なるコードを生成できるため、これについて言及します。
G ++ 4.7.0でループを使用して使用すると、まったく異なるランタイムが見られます
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ミリ秒で実行。 「パラレルフォー」コードは29ミリ秒で実行されます。省略した場合 for
そして使用します #pragma omp parallel
, 、ランタイムは最大179ミリ秒までシュートしますが、これはシリアルコードよりも遅いです。 (マシンには8のHWの並行性があります)
コードがリンクします libgomp
明らかにたくさんの答えがありますが、これは非常にうまく答えます(ソースで)
#pragma omp for
ループの一部のみが、さまざまなスレッドに 現在のチーム。 チームは、プログラムを実行するスレッドのグループです。プログラムの開始時に、チームは 単一メンバー:マスタースレッド それがプログラムを実行します。スレッドの新しいチームを作成するには、並列キーワードを指定する必要があります。周囲のコンテキストで指定できます。
#pragma omp parallel { #pragma omp for for(int n = 0; n < 10; ++n) printf(" %d", n); }
と:
何:並行、for、およびチーム
並列、並列、およびの違いは次のとおりです。
チームは、現在実行しているスレッドのグループです。プログラムの開始時に、チームは単一のスレッドで構成されています。並列コンストラクトは、次のブロック/ステートメントの期間中、現在のスレッドを新しいスレッドチームに分割し、その後、チームは1つに戻ります。 For-Loopの作業を現在のチームのスレッド間で分割します。
スレッドを作成するのではなく、現在実行中のチームのスレッド間で作業を分割するだけです。並列は、一度に2つのコマンドの速記です:並列とfor。 Parallelは新しいチームを作成し、そのチームがループのさまざまな部分を処理するために分割します。プログラムに並列コンストラクトが含まれていない場合、1つ以上のスレッドはありません。非スレッドプログラムのように、プログラムを開始して実行するマスタースレッド。