はコードです。並列領域の開始時に、myIdはプライベートに設定され、すべてのスレッドが正しいスレッドIDを持つようにします。 set_affinity()は、どのスレッドがどのコアで動作するかを制御します。私が持っている問題は、#pragma omp for schedule(static、1)です。OpenMPスレッド「背く」OMPバリア
ブロック:
if (myId<myConstant)
{
#pragma omp for schedule(static,1)
for(count = 0; count < AnotherConstant; count++)
{
//Do stuff, everything runs as it should
}
}
は、私は、スレッド、myConstant-1から0の一定数を超える配布するいくつかの作業を表します。これらのスレッドでは、スケジュール(静的、1)が行うような方法で、ループの反復を均等に分散したいと思う。これはすべて正しく実行されます。
コードが単一の領域に入ると、そこにあるすべてのコマンドが実行されます。しかし、私はmyConstantを2と指定します。次に3つ以上のスレッドで実行すると、単一マテリアルのすべてが正しく実行されますが、idが3以上のスレッドは単一の内部のすべてのコマンドが完了するまで待機しません。
すべてのスレッドによって実行されるタスクを作成するいくつかの関数が呼び出されます。 idが3以上のスレッド(一般的にはmyConstant以上)は引き続き、par_time()を実行しますが、他のスレッドは引き続き単一のスレッドで実行される関数によって作成されたタスクを実行します。 par_time()はスレッドごとにいくつかのデータを出力するだけです。
スケジュール(static、1)のプラグマompをコメントアウトして、単一のスレッドでforループを実行するだけであれば(if if(myId == 0)を変更するなど)、すべて動作します。だから私は、上記のスレッドがなぜ続いているのか分かりません。
紛らわしいことがあれば教えてください。それは具体的な問題です。 OMPを使って私のフロー制御の欠陥を誰かが見たかどうかを見ていました。
ええ、まあ、私は修正を見つけたと思うが、わからない。 if文をコメントアウトすると問題が解決され、AnotherConstantから0までのスレッドのみがforループ内で使用されているようです。しかしこれは保証ですか? inと同じように、idを持つスレッドがforループ内で使用されるか、AnotherConstantから常に0になります。 – WtLgi