128

これら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)
{
   ...
}
4

7 に答える 7

90

これらは同等です。

#pragma omp parallelスレッドのグループを生成し#pragma omp for、生成されたスレッド間でループの繰り返しを分割します。#pragma omp parallel forfusedディレクティブを使用すると、両方を同時に実行できます。

于 2011-09-26T03:08:48.340 に答える
76

違いはないと思います。一方は他方のショートカットです。正確な実装では、それらの処理が異なる場合がありますが。

結合された並列ワークシェアリング構造は、1 つのワークシェアリング構造を含み、他のステートメントを含まない並列構造を指定するためのショートカットです。許可された句は、並列およびワークシェアリング コントラクトに許可された句の和集合です。

http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdfから取得

OpenMP の仕様は次のとおりです。

https://openmp.org/specifications/

于 2009-09-30T20:20:21.690 に答える
34

分離されたparalleland 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
}
于 2013-08-24T19:01:56.377 に答える
12

特定の例の両方のバージョンは同等ですが、他の回答で既に述べたように、それらの間にはまだ1つの小さな違いがあります。最初のバージョンには、「omp for」の最後に遭遇する不要な暗黙のバリアが含まれています。もう 1 つの暗黙のバリアは、並列領域の最後にあります。「omp for」に「nowait」を追加すると、少なくとも OpenMP の観点からは、2 つのコードが同等になります。これについて言及したのは、OpenMP コンパイラが 2 つのケースでわずかに異なるコードを生成する可能性があるためです。

于 2016-07-12T09:57:06.017 に答える
8

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

于 2012-06-22T21:42:43.413 に答える