当我运行我的代码时没有"并行为"它完美地运作。但当我使用" 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); } } }
答案 0 :(得分:0)
默认情况下,您似乎正在共享所有迭代器值。因此,你肯定会出错。我想这就是推荐default(none)
的原因。
调试set #pragma omp parallel for default(none)
,然后确定每个线程的变量是应该共享还是私有。