1

我的代码看起来像这样:

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

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

4

1 回答 1

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指令。(从这里采取的解决方案)

#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();
  }   
}
于 2012-11-27T11:41:22.760 回答