私はこのようなコードを持っています:
#pragma omp parallel
{
#pragma omp single
{
int x;
#pragma omp task depend(inout:x)
{
for (int i = 1; i < 16; i++)
{
#pragma omp task
DoComputationOnPartition(i);
}
#pragma omp taskwait
}
for (int i = 1; i < 16; i++)
{
#pragma omp task depend(in:x)
{
OperateOnPartition(i);
}
}
#pragma omp task depend(inout:x)
{
for (int i =1; i < 16; i++) x++;
}
for (int i = 1; i < 16; i++)
{
#pragma omp task depend(in:x)
{
OperateOnPartition(i);
}
}
#pragma omp taskwait
}
}
そして、私が見つけたのは、マスタースレッドが最初のタスク内にネストされた DoComputationOnPartition のタスクを実行できないことです。誰かがそれを説明できますか?それはうまくいくはずですよね?#pragma omp taskwait はスケジューリング ポイントであるため、チームのどのスレッドでもタスクを取得できる必要があります。マスター スレッドは最後の taskwait に到達し、ネストされたタスクを取得できるはずです。それらには、それを可能にするのに十分な長さがあります。
ありがとう。