在顶级

时间:2016-11-15 21:53:17

标签: c recursion parallel-processing openmp

上下文:

假设我有一个带有非固定分支因子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;
}

关于上面的代码,我应该如何使用编译指示设置变量的隐私(sharedprivate),我应该应用哪些变量,以及为什么

1 个答案:

答案 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);
    }
}