4

OpenMPプログラムでさまざまなスレッドのIDを取得したい。以下のコードで同じスレッドIDを取得するのはなぜですか?

#pragma omp task untied
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
#pragma omp task untied
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);
 ....

id1との両方で「0」を取得するのはなぜid2ですか?

4

2 に答える 2

2

あなたのコードで:

#pragma omp task untied
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
#pragma omp task untied
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);

{}この命令しか使っていないので、omp_get_thread_num();タスクになってしまいます。

ところで、task pragmaは から利用できることOpenMP 3.0に注意してください。したがって、GCC が 4.4 より古いバージョンの場合、タスク ディレクティブは無視されます。

次のことを試してください。

#pragma omp parallel region
{
  #pragma omp single
  {
   #pragma omp task untied
   {
     id1 = omp_get_thread_num(); printf("TID:%d\n",id1);
     foo_par(A);
   }

   #pragma omp task untied
   {
     id2 = omp_get_thread_num(); printf("TID:%d\n",id2);
     foo_par(B);
   }
 }
}

タスクが 1 つのスレッドのみによって作成されるように、single コンストラクトが必要です。そうしないと、各タスクが N 回 (N == スレッド数) 作成されます。

1 つのスレッド「X」が作業を終了し、プール内の別のタスクを要求できる場合、チーム内の別のスレッドより前に開始される可能性があることに注意してください。つまり、たとえば 2 つの異なるタスクを定義したとしても、それらのタスクは同じスレッドによって実行される可能性があります。

于 2013-02-10T19:37:41.243 に答える
1

試す

#pragma omp task untied
if (omp_get_thread_num() == 1)
  foo_par(A);
else
  foo_par(B);

GDB を使用して、複数のスレッドを持つプログラムをデバッグできます。これを使用してコードをステップ実行し、omp_get_thread_num()各スレッドの値を確認します。ただし、デバッグ中に明らかになります。

于 2013-02-14T15:54:12.587 に答える