私は OpenMP を初めて使用し、Microsoft Visual Studio 2010 に標準で付属している OpenMP 2.0 について読んだことから、グローバル変数は並列プログラミングで使用すると面倒でエラーが発生しやすいと見なされます。グローバル変数と静的グローバル変数を効率的に処理する方法をほとんど見つけていないか、まったく知らないので、私もこの感覚を採用しています。
実行されるコードのスニペットがありますが、並列ブロックで作成されたローカル変数のために、探している答えが得られません。1つの回答ではなく、8つの異なるプリントアウトを取得します(PCにスレッドがいくつあるかのため)。並列ブロックで作成されたローカル変数「リスト」が原因であることはわかっていますが、「リスト」変数を移動してグローバル変数にすると、このコードは実行されません。実際にはコードは実行されますが、答えが返ってきません。これは、グローバルな「リスト」変数を使用するように変更したいサンプル コードです。
#pragma omp parallel
{
vector<int> list;
#pragma omp for
for(int i = 0; i < 50000; i++)
{
list.push_back(i);
}
cout << list.size() << endl;
}
出力:
6250
6250
6250
6250
6250
6250
6250
6250
合計すると 50000 になりますが、50000 の答えは 1 つではなく、分割されています。
解決:
vector<int> list;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 50000; i++)
{
cout << i << endl;
#pragma omp critical
{
list.push_back(i);
}
}
}
cout << list.size() << endl;