Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带嵌套循环和函数调用的openmp_C++_Openmp - Fatal编程技术网

C++ 带嵌套循环和函数调用的openmp

C++ 带嵌套循环和函数调用的openmp,c++,openmp,C++,Openmp,我有几个嵌套的循环,我把第一个放在并行模式下apar和mpar是在循环中修改其值的结构,然后调用functionbreakLogic,该函数生成一个结构,我将其存储在这些结构的预创建向量中。 一,二。。。已在函数的前面声明 我已经尝试包括有序和关键,以确保准确性,但我仍然得到不正确的结果 #pragma omp parallel for ordered private(appFlip, atur, apar, mpar, i, j, k, l, m, n) shared(rawFlip) for

我有几个嵌套的循环,我把第一个放在并行模式下
apar
mpar
是在循环中修改其值的结构,然后调用function
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);
              }
         }
    }
#用于有序私有(应用翻转、atur、apar、mpar、i、j、k、l、m、n)共享(rawFlip)的pragma omp并行

对于(i=0;i您可以通过一些修改来并行处理原始代码

  • apar
    mpar
    设置为
    firstprivate
    apar
    mpar
    应为线程局部变量,并在为
区域输入
并行时初始化

  • 删除所有
    关键
    有序
    子句,包括
    并行for
    指令中的子句。它们没有按预期工作

  • i
    j
    k
    l
    m
    n
    计算
    iter
    ,以消除依赖关系

  • 更新 有关OpenMP的更多详细信息,请参见此处,特别是
    private
    firstprivate
    之间的区别


    请注意,您的代码中没有条件,因此可以直接计算正确的
    itr
    值,而不是在最里面的循环中使用增量,因此您可以摆脱
    有序的
    。然后您还需要使
    apar
    mpar
    私有
    ,除非有这些str的成员线程之间共享的结构。使用私有变量,您还可以摆脱
    关键的
    结构。请注意,最外层的
    关键的
    保护整个循环,因此内部的
    关键的
    是表面的。我是否需要将l、m、n、o也设为私有的?如果使用,r0用于解除对AppFlip的引用然后在使用变量时定义所有变量(例如for(int i=0;…)不要担心显式声明所有内容都是公共的和私有的。这只适用于仍在使用ANSI/gnu89 C的用户。请记住,并行结构内部定义的所有内容都是私有的,外部定义的所有内容都是共享的。这将使您的代码更干净,我个人认为更容易理解。不要将性能与未在上进行优化的RMACE。您所说的“不在上进行优化的情况下比较性能”是什么意思?并行性性能改进的全部目的不是吗?谢谢Eric!我的一个小错误/类型,apar.three依赖于apar.three。这会改变什么吗?并在并行构造中保持所有i…n为私有?另一个问题?你没有提到任何关于atur、appFlip等的内容。保持它们私有或firstprivate会产生任何dif吗引用?将它们作为现有代码保留为私有是可以的。只有在输入并行for区域时要初始化它们时,才可以将它们设置为
    firstprivate
    。像
    j
    这样的变量在代码中显式初始化,因此
    firstprivate
    没有用。
    iter=(((i*twoL+j)*threeL+k)*fourL+m)*fiveL+n;
    sinResVec[itr] = atur;