openMP / ompSs允许定义具有特定输入和输出的任务,以便可以定义不同任务之间的依赖关系。
然而,大多数示例具有不同的功能,因为任务通过依赖关系相互连接。标准的并行for-based程序怎么样?是否有可能定义依赖关系,即连续'并行'区域的迭代之间?
答案 0 :(得分:0)
您不需要函数来定义依赖项。
让我们举一个非交换操作,例如连接,这里char buf_n[11] = {0}, buf_l[11] = {0}, buf_u[11] = {0};
#pragma omp parallel
{
#pragma omp single
{
int i;
for (i=0; i < 10; i++)
{
#pragma omp task depend(inout:buf_n) firstprivate(i)
{
char add[] = {'0' + i};
strncat(buf_n, add, 1);
}
#pragma omp task depend(inout:buf_l) firstprivate(i)
{
char add[] = {'a' + i};
strncat(buf_l, add, 1);
}
#pragma omp task depend(inout:buf_u) firstprivate(i)
{
char add[] = {'A' + i};
strncat(buf_u, add, 1);
}
}
#pragma omp task depend(in:buf_n)
{
printf("buf (numbers) is %s\n", buf_n);
}
#pragma omp task depend(in:buf_l)
{
printf("buf (lowercase) is %s\n", buf_l);
}
#pragma omp task depend(in:buf_u)
{
printf("buf (uppercase) is %s\n", buf_u);
}
}
}
依赖关系将确保任务总是按顺序执行。
buf (lowercase) is abcdefghij
buf (uppercase) is ABCDEFGHIJ
buf (numbers) is 0123456789
这将始终返回如下内容:
error: cannot convert ‘std::vector<Node*>’ to ‘Node*’ for argument ‘1’ to ‘void printTree(Node*)’
行的顺序可能会改变,但是连接总是按顺序发生(即字母和数字总是按正确的顺序排列)。