OpenMP 4中的任务依赖性

tow*_*ism 4 c++ parallel-processing dependencies task openmp

以下代码基于OpenMP 4.0规范工作:

out和inout依赖类型.生成的任务将是所有先前生成的兄弟任务的从属任务,其引用入口,出口或入口依赖类型列表中的至少一个列表项.

这意味着task3变得依赖于task2.对?但它没有意义!为什么输入 - 输出依赖性任务应该是输入依赖性任务的依赖?

为了使它们独立,我需要做什么?ps:在Linux上使用g ++ 4.9进行代码测试.

#include <stdio.h>
#include <omp.h>
#include <unistd.h>
int main() {
int x,y;
#pragma omp parallel num_threads(10)
{
#pragma omp single nowait
 {
#pragma omp task depend (out:x)  //task1
  {
        x=1;
  }
#pragma omp task depend(in:x) depend(out:y)  //task2
  {
        sleep(2); //Does task3 wait for us? Yes!
        y=x+1;
  }
#pragma omp task depend (inout:x)  //task3
  {
        x++;
        printf("task3(x): %d\n" , x);
  }
#pragma omp task depend (in:x,y)  //task4
 {
        printf("task4 (x+y): %d\n" , x+y);
 }
 }
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mas*_*ano 13

问题1:这意味着task3变得依赖于task2.对?

根据OpenMP 4.0标准中的depend条款(强调我的):

任务依赖性是从depend 子句及其列表项的依赖类型派生的,其中依赖类型是以下之一:

依赖型.生成的任务将是所有先前生成的兄弟任务的从属任务,其引用out或inout依赖类型列表中的至少一个列表项.

out和inout依赖类型.生成的任务将是所有先前生成的兄弟任务的 从属任务,其引用入口,出口或入口依赖类型列表中的至少一个列表项 .

从以下描述:

  • 该条款depend(in:x)将产生依赖于所有与先前生成的任务的任务depend(out:x)depend(inout:x)
  • 该条款depend(out:x)或条款depend(inoout:x)将产生依赖于所有先前生成的任务提一个任务x一个在depend条款

将此应用于您的特定情况会产生这种依赖关系链:

       task1 (out:x) -> task2 (in:x,out:y) -> task4 (in:x,y)
                                   |            ^
                                   |            |
                                   > task3 (inout:x)   
Run Code Online (Sandbox Code Playgroud)

因此task3取决于task2的完成.


问题2:为什么输入输出依赖项任务必须依赖于输入依赖项任务?

我只是让你注意到,通过这个规则,你将获得变量的确定性值xy运行结束时(假设你负责同步对内存的访问).如果task3依赖于task1而不是task2,那么这个确定性将不会成立(并且inout依赖性将等同于in依赖性).


问题3:为了使它们独立,我需要做什么?

inout:x依赖项转换为in:x依赖项并同步对xvia atomic子句的访问.这样你就可以运行:

  • x == 2y == 2
  • x == 2y == 3

取决于task2是否在task3之前执行.

  • 伟大的解释。谢谢!所以,最后,这意味着 inout 和 out 的处理方式完全相同。对?它们可以互换使用! (2认同)