使用OpenMP进行并行化时的分段错误(并行)

时间:2014-03-27 13:03:38

标签: c++ openmp

当我运行我的代码时没有"并行为"它完美地运作。但当我使用" Parallel for" ,我收到Core dumped错误。调用运算符时会出现问题。 当我对parallel的语法进行注释时,运算符的工作正常。

这是我的代码的一部分:

#include <iostream>
#include <vector>
#include <cmath>
#include <omp.h>
#include <Eigen/Core>
#include <Eigen/Dense>

#include "NEGF.h"

using namespace std;
using namespace Eigen;

void NEGF::PHONON(){

    cout << endl << "*********************************" << endl ;
    cout         << "PHONON calculations is running ...   " << endl ;
    cout         << "*********************************" << endl ;

    int Nhw0, ii, kk, iE,n_hw, iK,iKx, iteta, iq , XY, YX;
  double Kp ,Kt,Ktx , V_Value,gamma,dteta,Nw,KBT;
    Nhw0=floor(hw0/dE);

    vector< complex<double> > Gn_ems(nZ*nZ*nK);
    vector< complex<double> > Gn_abs(nZ*nZ*nK);
    vector< complex<double> > Vpop(nZ*nZ*nK);
    MatrixXcd M_Gamma(nZ,nZ) ;
    MatrixXcd M_Self(nZ,nZ) ;
    vector<double> teta(40);

    gamma=q*hw0/(0.5/epsAC -0.5/epsDC);
    KBT=Temp*0.026/300;
    Nw=1/(exp(hw0/(KBT))-1);

    for(ii=0;ii<teta.size();ii++){
      teta[ii]= M_PI*ii/(teta.size()-1) ;
    }

    dteta=teta[1]-teta[0];
#pragma omp parallel for
  for(iKx=0;iKx<nK;iKx++){
    Ktx=KX[iKx];
    for(iE=0;iE<nE;iE++){
        M_Gamma.setZero(nZ,nZ);
        M_Self.setZero(nZ,nZ);

        for(iteta=0;iteta<teta.size();iteta++){
            for(iK=0;iK<nK;iK++){
              Kt=KX[iK];
              if(iE+Nhw0 < nE){
                  n_hw=iE+Nhw0 ;
                  XY=1;
                  operator()(Gn,Gn_ems,iK,n_hw,XY);
              }
              else{
                  XY=0;
                  operator()(Gn,Gn_ems,iK,iE,XY);
              }

              if(iE-Nhw0>=0){
                  n_hw=iE-Nhw0 ;
                  YX=1;
                  operator()(Gn,Gn_abs,iK,n_hw,YX);
              }
              else{
                  YX=0;
                  operator()(Gn,Gn_abs,iK,iE,YX);
              }
                    Kp=sqrt(pow(Ktx,2)+pow(Kt,2)-2*Kt*Ktx*cos(teta[iteta])) ;
                    for(ii=0;ii<nZ;ii++){
                        for(kk=0;kk<nZ;kk++){
                            V_Value=exp(-sqrt(pow(Kp,2)+pow(qD,2))*abs(ii-kk)*dZ)*
                                    (1-pow(qD,2)*abs(ii-kk)*dZ/(2*sqrt(pow(Kp,2)+pow(qD,2)))-
                                            pow(qD,2)/(2*(pow(Kp,2)+pow(qD,2))))/(pow(Kp,2)+pow(qD,2));
                            operator()(Vpop,0,ii,kk,iK,V_Value);
                        }
                    }

              }
            for(iq=0;iq<nK;iq++){
              for(ii=0;ii<nZ;ii++){
                  for(kk=0;kk<nZ;kk++){
                      M_Gamma(ii,kk)=M_Gamma(ii,kk)+ (2*M_PI*dK*KX[iq]*dteta*gamma*M_PI/pow(M_PI*2,2))
                              *operator()(Vpop,ii,kk,iq)*(operator()(Gn_abs,ii,kk,iq)+operator()(Gn_ems,ii,kk,iq));
                  }
              }
            }
            }
        M_Self=-Xi*(M_Gamma-M_Gamma.adjoint().eval())/2;
        operator()(GAMPOP,M_Gamma,iKx,iE);
        operator()(POPSELF,M_Self,iKx,iE);

        }
  }
}

1 个答案:

答案 0 :(得分:0)

默认情况下,您似乎正在共享所有迭代器值。因此,你肯定会出错。我想这就是推荐default(none)的原因。

调试set #pragma omp parallel for default(none),然后确定每个线程的变量是应该共享还是私有。

相关问题