我有一个使用OpenMP并行化的外部for循环。但是在这个for循环中,有一些代码段也可以并行执行。
我可以使用OpenMP的sections子句来并行化吗?这甚至可能吗?由于for循环的每次迭代都只由一个线程运行,我可以(在每次迭代中)要求多个线程并行运行某些代码段吗?其余的代码应该由一个线程运行,即已经分配了该循环迭代的线程。
对于前。我有以下代码:
omp_p = omp_get_max_threads();
omp_set_nested(1);
#pragma omp parallel for num_threads(omp_p/2)
for(int p=0;p<omp_p/2;p++){
size_t a = (p*N)/(omp_p/2);
size_t b = ((p+1)*N)/(omp_p/2);
for(int i=a;i<b;i++){
/*Work on A[a]->A[b]*/
for(int j=0;j<n;j++){
for(int k=0;k<N;k++){
/*Serial code*/
#pragma omp parallel sections
{
#pragma omp section
{
}
#pragma omp section
{
}
}
/*Serial work*/
#pragma omp parallel sections
{
#pragma omp section
{
}
#pragma omp section
{
}
}
/*Serial code*/
}
}
}
}
这导致程序比我根本没有使用并行部分要慢得多。
答案 0 :(得分:1)
应该可以嵌套OMP。但是我担心,由于以下原因,你可能不会看到任何性能提升: