我有一个使用 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*/
}
}
}
}
这会导致程序比我根本没有使用并行部分要慢得多。