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:为什么输入输出依赖项任务必须依赖于输入依赖项任务?
我只是让你注意到,通过这个规则,你将获得变量的确定性值x和y运行结束时(假设你负责同步对内存的访问).如果task3依赖于task1而不是task2,那么这个确定性将不会成立(并且inout依赖性将等同于in依赖性).
问题3:为了使它们独立,我需要做什么?
将inout:x依赖项转换为in:x依赖项并同步对xvia atomic子句的访问.这样你就可以运行:
x == 2 和 y == 2x == 2 和 y == 3取决于task2是否在task3之前执行.
| 归档时间: |
|
| 查看次数: |
4324 次 |
| 最近记录: |