使用ompss进行fork-join算法

时间:2016-11-08 11:47:12

标签: parallel-processing task openmp dataflow

openMP / ompSs允许定义具有特定输入和输出的任务,以便可以定义不同任务之间的依赖关系。

然而,大多数示例具有不同的功能,因为任务通过依赖关系相互连接。标准的并行for-based程序怎么样?是否有可能定义依赖关系,即连续'并行'区域的迭代之间?

1 个答案:

答案 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*)’

行的顺序可能会改变,但是连接总是按顺序发生(即字母和数字总是按正确的顺序排列)。