繁体   English   中英

使用 OpenMP(Parallel for)并行化时出现分段错误

[英]Segmentation fault on parallelization with OpenMP(Parallel for)

当我在没有“parallel for”的情况下运行我的代码时,它运行良好。 但是当我使用 "Parallel for" 时,我收到 Core dumped error 。 调用操作符时会出现问题。 当我注释 parallel for syntax 时,运算符工作得很好。

这是我的代码的一部分:

 #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); } } }

您似乎默认共享所有迭代器值。 因此,您肯定会出现故障。 我想这就是为什么推荐default(none)原因。

调试设置#pragma omp parallel for default(none) ,然后决定变量是否应该为每个线程共享或私有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM