この質問は単純な好奇心からです。
OpenMP 仕様では、「実行モデル」セクションに次のように記載されています。
"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."
では、そのようなプログラムの例は何ですか?
この質問は単純な好奇心からです。
OpenMP 仕様では、「実行モデル」セクションに次のように記載されています。
"... it is possible and permitted to develop a program that executes correctly
as a parallel program but not as a sequential program ..."
では、そのようなプログラムの例は何ですか?
OpenMP は、基礎となるシリアル言語には存在しない追加のセマンティクスを導入します。明らかな例として、OpenMP セクションを考えてみましょう。シリアル プログラム セクションでは、最初から最後のコードまで、厳密に事前に定義された方法で実行される単純な連続したコード ブロックです。OpenMP では、セクションを処理するのに十分なスレッドがあれば、すべてのセクションを並行して実行できます。これは、シーケンシャルの場合には不可能な因果関係につながる可能性があります。たとえば、プログラムがシーケンシャルに実行される場合、後のコード ブロックは前のコード ブロックの実行に影響を与えることはできません。
非常に人工的な例:
int flag = 0;
#pragma omp parallel sections
{
#pragma omp section
{
while (!flag) {}
}
#pragma omp section
{
flag = 1;
}
}
OMP_NUM_THREADS
このコードは、2 つ以上の OpenMP スレッドで完全に実行され、シリアルとしてコンパイルされた場合、または1 に設定して実行された場合、無限while
ループに陥りflag
ます。シーケンシャル コードで。
シーケンシャル モデルは、OpenMP 呼び出しを単純にスタブ化します。これは、コードが実行されるように見えても、特定のアクションが実行されないことを意味します。
これは、問題を順番に解決できる可能性のあるアルゴリズムがないと言っているわけではありません。単純に、一部のプログラムは、AS WRITTEN では、通常の OpenMP 呼び出しが並列モードで動作しないと、正しい答えに到達しない可能性があります。