我试图让OpenMP任务依赖项工作,但无济于事。 我们来看这个简化的例子:
int main()
{
int x=0;
#pragma omp parallel
#pragma omp single
{
#pragma omp task depend(in:x)
{
#pragma omp critical
cout << "Read the value " << x << "\n";
}
#pragma omp task depend(out:x)
{
x = 3;
#pragma omp critical
cout << "Set the value to " << x << "\n";
}
}
return 0;
}
据我所知(在OpenMP规范中),依赖(in:x)任务应该只在所有depend(out:x)任务解决后执行,因此预期输出为
Set the value to 3
Read the value 3
然而,这些任务是以语义顺序执行的,忽略了depend子句,我得到的是:
Read the value 0
Set the value to 3
我正在使用-fopenmp标志使用g ++ - 7(SUSE Linux)7.3.1 20180323 [gcc-7-branch revision 258812]进行编译。此版本的编译器应该可以访问OpenMP 4.5。
这是对我的任务依赖的误解,还是还有其他什么在这里发挥?
答案 0 :(得分:1)
任务依赖的概念可能会产生误导。
最好的方法是将它们视为指示不同任务如何访问数据的方式,而不是控制执行顺序的方式。
源代码中的任务顺序与depend子句一起描述了可能的4种情况之一:写入后读取,读取后读取,< em>写入后写入,读取后读取。
在您的示例中,您正在描述写后读情况:您告诉编译器第二个任务将覆盖变量x,但第一个任务将x作为输入,如图所示按depend(in:x)
。因此,编译器将在第二个之前执行第一个任务,以防止覆盖初始值。
如果您查看英特尔的文档here,会有一个简短的示例,其中显示了任务顺序(在源代码中)如何在确定依赖关系图(以及执行顺序)中发挥作用)。
有关此问题的另一个信息页面here。