質問

の違いは何ですから。

[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の仕様はこちらです:

https://openmp.org/specifications/

他のヒント

これらは同等です。

#pragma omp parallel スレッドのグループをスポーンします #pragma omp for 産卵スレッド間でループ反復を分割します。あなたは融合して両方のことを一度に行うことができます #pragma omp parallel for 指令。

こちらではの使用例を分離 parallelfor こちらの.短で使用できるダイナミックな割り当ての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つ以上のスレッドはありません。非スレッドプログラムのように、プログラムを開始して実行するマスタースレッド。

https://bisqwit.iki.fi/story/howto/openmp/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top