OpenMP多个for循环

时间:2012-11-27 09:05:51

标签: c loops openmp nested-loops

我的代码看起来像这样:

for(i=0; i<max;i++){
   for(j=0; j<max2;j++)
     //stuff
}

for(i=0; i<max;i++){
   for(j=0; j<max2;j++)
     //other stuff
}

for(i=0; i<max;i++){
   for(j=0; j<max2;j++)
     //final stuff
}

我想使用OpenMP并行化这个。什么是最好的方法?我尝试在开头#pragma omp parallel private(i)#pragma omp for每个j循环之前做 #pragma omp parallel private(i) { for(i=0; i<max;i++){ #pragma omp for for (j=0; j<max2;j++){ //and so on and so forth 。这就是我的意思:

for

问题是,这对我没有任何性能提升。我怀疑这是因为3个{{1}}循环并不是并行运行的...如果我能让这3个同时运行,我想我可以获得性能提升。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

快速解决方法是创建一个迭代部分并将其平行:

#pragma omp for
for (k=0;k<3;k++){
  if (k==0) do_stuff();
  if (k==1) do_other_stuff();
  if (k==2) do_other_other_stuff();
}

更好的解决方法是使用omp sections指令。 (解决方案取自here

#pragma omp parallel sections
{
  #pragma omp section
  {
     /* Executes in thread 1 */
     do_stuff();
  } 
  #pragma omp section
  {
    /* Executes in thread 2 */ 
    do_other_stuff();   
  } 
  #pragma omp section
  {
    /* Executes in thread 3 */
    do_other_other_stuff();
  }   
}