5

私はopenmpを使用していますが、プログラムは次のようになります。

\#pragma omp parallel for

for(x = 0, y = 0, x < 5, x++, y++)

     function(x, y, fp);

void function(int x , int y, FILE* fp);
{
   fprintf(fp, "(%d, %d)\n", x y);
}

ファイルの内容を

(0, 0)
(2, 2)
(1, 1)
(3, 3)
(4, 4)

順序は重要ではありませんが、座標x、yは順番になっている必要があります。つまり、プログラムは(2、3)のようなものを生成しないようにする必要があります。この動作は常に保証されていますか?Linuxでgccコンパイラを使用しています。

4

1 に答える 1

3

あなたの質問には互換性のない仮定があります。OpenMpはC標準の一部ではないため、C仕様ではOpenMpのスレッドモデルについて何も述べておらず、適切な機能の安全性について何も保証できません。最近まで、Cにはスレッドモデルさえありませんでした。

C11には独自のスレッドモデルがあり、そのスレッドモデルでは、IOストリームで動作する関数はスレッドセーフです。

各ストリームには、実行の複数のスレッドがストリームにアクセスするときのデータの競合を防ぎ、複数のスレッドによって実行されるストリーム操作のインターリーブを制限するために使用されるロックが関連付けられています。一度に1つのスレッドのみがこのロックを保持できます。ロックは再入可能です。1つのスレッドが特定の時間に複数回ロックを保持する場合があります。

C11を完全に実装するコンパイラはまだ存在しないと思いますが、通常、POSIXシステムのCライブラリはこの特定の要件を満たします。そのような準拠する実装がある場合、そのスレッドモデルがC11のモデルと一致するかどうかを文書化するために、その上に配置されるのはOpenMp実装次第です。

于 2012-05-12T18:21:54.727 に答える