Openmp任务:执行顺序



由于我经常使用Openmp,所以我想到了这个问题。我在某个地方读到,在处理任务时,没有特定的方法来执行任务。就像这个例子中的

// Compile with: g++ -O3 test.cpp -fopenmp
#include <cstdio>
int main(){
int a = -3;
#pragma omp parallel num_threads(3)
{
#pragma omp task
a = 3;
#pragma omp task
a++;
}
printf("%dn", a);
return 0;
}

这是否意味着任何线程都可以执行第一个就绪任务(可以是三个a++或a=3中的一个(??

是的,任何线程都可以执行第一个就绪任务。如果不确定,可以使用depend子句添加任务依赖项。但是请注意,您只能在同一任务区域中指定依赖项(即,在同一父任务的兄弟任务之间,但不能与其他任务一起指定(。任务调度往往在不同的运行时实现之间发生显著变化(例如,GCC的GOMP与Clang/ICC的IOMP(。

注意,任务区域中的变量是隐式复制的(如使用firstprivate(,而不是parallel区域。然而,当它们在父并行部分中共享时,情况并非如此,就像@Laci在评论中指出的代码中一样(在这种情况下,它们由任务共享(。

另外请注意,#pragma omp single仅适用于下一条语句,即以下任务指令,而不适用于第二条指令。这意味着第二个任务指令应该生成3个任务(每个线程1个(。

最新更新