2016-11-15 50 views
0

上下文:分支使用OpenMP递归函数在顶层

假设我有一个非固定分支因子b函数f。执行从深度0开始,并在给定的固定深度停止。我想并行执行f,以便当深度为0时,深度为1 的每个分支及其深度大于1的整个执行将执行到不同的线程上(在同一线程上)。

我正在使用OpenMP来实现此目的,但我无法确定编译指示对递归代码(更精确地说是代码中的变量)的影响。基本上,我的问题归结为下面的代码(不正确行为):

#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

我强烈建议你看看OpenMP的任务递归probllems如这一个。 –

回答

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