2016-12-04 95 views
4

我想在并行外循环中运行一个包含for循环(应该并行运行)的函数。因此,它看起来像下面这样:嵌套并行for循环...“并行外循环”in“并行内循环作为函数”

void myfunction(){ 
    ... 
    #pragma omp parallel for 
    for (int i=0;i<10;i++){ 
     do something... 
    } 
} 


int main(){ 
    #pragma omp parallel for 
    for(int i=0;i<5;i++){ 
     myfunction(); 
    } 
} 

鉴于上面的代码,我想在main()功能循环创建5个并行线程,我想每个5个线程的创建另一个k个线程来运行其自己并行循环。

虽然我知道如果内部循环不在单独的函数中,我知道如何运行嵌套for循环,但我找不到解决这类问题的方法。

实际上,这段代码是用于并行5折交叉验证,其中每个折叠都有一个应该并行化的for循环。

任何人都可以帮助我吗?

+0

这是否与工作的功能?如果是这样,真正的问题是什么? – tadman

+0

@tadman对不起,但我不明白你的问题。我首先要创建5个线程,然后我想为每个线程运行一个并行for循环,每个线程应该独立运行。 – Mansumen

+0

你[搜索](http://stackoverflow.com/questions/13357065/openmp-and-nested-loops)? – Stargateur

回答

4

您需要enable nested parallelism

void myfunction(){ 

    #pragma omp parallel for 
    for (int i=0;i<10;i++){ 
     ... 
    } 
} 


int main(){ 

    omp_set_nested(1);  // Enable nested parallelism  
    omp_set_num_threads(5); // Use 5 threads for all parallel regions 

    #pragma omp parallel for 
    for(int i=0;i<5;i++) 
    { 

     myfunction(); 
    } 
}