上下文:
假设我有一个带有非固定分支因子f
的函数b
。执行从深度0开始,并在给定的固定深度处停止。我希望并行化f
的执行,这样,当深度为0时,深度为1 的每个分支及其在深度大于1 的整个执行将进入并执行到不同的线程(在同一个线程上)。
我使用OpenMP来实现这一点,但是我遇到了pragma对递归代码(更准确地说是代码中的变量)的影响。基本上,我的问题被简化为以下代码(行为不正确):
#include <stdio.h>
#include "omp.h"
int b = 6;
int maxDepth = 4;
void f(int depth) {
if (depth == maxDepth)
return;
{
int i;
for (i = 0; i < depth; i++) printf(" ");
}
printf("D %d TID %d\n", depth, omp_get_thread_num());
if (!depth) {
int i;
#pragma omp parallel for private(i)
for (i = 0; i < b; i++) {
f(depth+1);
}
}
else {
int i;
for (i = 0; i < b; i++) {
f(depth+1);
}
}
}
int main() {
omp_set_num_threads(4);
f(0);
printf("\n");
return 0;
}
关于上面的代码,我应该如何使用编译指示设置变量的隐私(shared
,private
),我应该应用哪些变量,以及为什么
答案 0 :(得分:0)
尝试使用任务,而不是#pragma omp for
指令。
在最新的OpenMP标准中,有一个新的循环指令用于创建任务:#pragma omp taskloop
。
实现相同目标的另一种方法是将您的函数f()
分成两部分:
void f(int depth) {
int i;
#pragma omp parallel private(i)
{
//#pragma omp for or ...
#pragma omp single
#pragma omp taskloop
for (i = 0; i < b; i++) {
f_nontopmost(depth+1);
}
// taskloop will implicitly wait for all created tasks
// at the end
}
}
void f_nontopmost(int depth) {
if (depth == maxDepth)
return;
int i;
// since we are in parallel section, we can still create tasks
#pragma omp taskloop
for (i = 0; i < b; i++) {
f(depth+1);
}
}