openMP/ompSs允许定义具有特定输入和输出的任务,以便可以定义不同任务之间的依赖关系。
然而,大多数示例都将不同的功能作为通过依赖关系相互连接的任务。那么基于for的标准并行程序呢?是否有可能定义依赖关系,即在连续“并行”区域的迭代之间?
发布于 2016-11-25 04:16:34
您不需要函数来定义依赖关系。
让我们以非交换操作为例,比如连接,这里的inout依赖关系将确保任务总是按顺序执行。
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行的顺序可能会改变,但是连接总是按顺序发生的(即字母和数字的顺序总是正确的)。
https://stackoverflow.com/questions/40486137
复制相似问题