OpenMP 4.5任务依赖性和执行顺序

时间:2018-05-25 16:02:37

标签: c++ openmp

我试图让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。

这是对我的任务依赖的误解,还是还有其他什么在这里发挥?

1 个答案:

答案 0 :(得分:1)

任务依赖的概念可能会产生误导。

最好的方法是将它们视为指示不同任务如何访问数据的方式,而不是控制执行顺序的方式。

源代码中的任务顺序与depend子句一起描述了可能的4种情况之一:写入后读取读取后读取,< em>写入后写入,读取后读取

在您的示例中,您正在描述写后读情况:您告诉编译器第二个任务将覆盖变量x,但第一个任务将x作为输入,如图所示按depend(in:x)。因此,编译器将在第二个之前执行第一个任务,以防止覆盖初始值。

如果您查看英特尔的文档here,会有一个简短的示例,其中显示了任务顺序(在源代码中)如何在确定依赖关系图(以及执行顺序)中发挥作用)。

有关此问题的另一个信息页面here