あなたのコードで:
#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 つの異なるタスクを定義したとしても、それらのタスクは同じスレッドによって実行される可能性があります。