openmp与嵌套循环和函数调用

时间:2013-10-24 11:08:11

标签: c++ openmp

我有几个嵌套循环,我将第一个置于并行模式。 aparmpar是在循环中修改其值的结构,然后调用函数breakLogic生成一个结构,我将其存储在这些结构的预先创建的向量中。 一,二......已在函数的早期声明。

我试图包含有序和关键以确保准确性,但我仍然得到不正确的结果。

#pragma omp parallel for ordered private(appFlip, atur, apar, mpar, i, j, k, l, m, n) shared(rawFlip)
for(i=0; i<oneL; i++)
    {
         initialize mpar
         #pragma omp critical
         apar.one = one[i];
         for(j=0; j<twoL; j++)
         {
             apar.two = two[j];
             for(k=0; k<threeL; k++)
             {
                  apar.three = floor(three[k]*apar.two);
                  appFlip = applyParamSin(rawFlip, apar);
                  for(l=0; l< fourL; l++)
                  {
                      mpar.four = four[l];
                      for(m=0; m<fiveL; m++)
                      {
                          mpar.five = five[m];
                          for(n=0; n<sixL; n++)
                          {
                              mpar.six = add[n];
                              atur = breakLogic(appFlip,  mpar, dt);
                              #pragma omp ordered
                              {
                                  sinResVec[itr] = atur;
                                  itr++;
                              }
                          }
                      }
                  }
                  r0(appFlip);
              }
         }
    }

或者这段代码不利于并行?是否有任何g ++工具可以为并行处理配置代码并指出潜在问题?

此修改后的代码有效,但没有提高性能。

1 个答案:

答案 0 :(得分:1)

原始代码可以通过一些修改来并行。

  • aparmpar设为firstprivateaparmpar应为线程局部变量,并在进入parallel for区域时进行初始化;

  • 删除所有criticalordered条款,包括parallel for指令中的条款。他们没有像你期望的那样工作;

  • 使用iterijklm计算n以删除依赖。

iter=(((i*twoL+j)*threeL+k)*fourL+m)*fiveL+n;
sinResVec[itr] = atur;

更新

有关OpenMP的详细信息,请参阅此处,尤其是privatefirstprivate之间的差异。

http://msdn.microsoft.com/en-us/library/tt15eb9t.aspx