C++ OpenMp代码在代码::块中停止工作
我必须使用OpenMp在code::blocks中并行化大块代码。但由于某种原因,它在我运行它的那一刻就停止工作了。但代码编译正确。我在MicrosoftVisualStudio12调试器中运行了它,它给出了堆栈溢出异常。请帮忙。这是密码C++ OpenMp代码在代码::块中停止工作,c++,parallel-processing,openmp,codeblocks,reduction,C++,Parallel Processing,Openmp,Codeblocks,Reduction,我必须使用OpenMp在code::blocks中并行化大块代码。但由于某种原因,它在我运行它的那一刻就停止工作了。但代码编译正确。我在MicrosoftVisualStudio12调试器中运行了它,它给出了堆栈溢出异常。请帮忙。这是密码 #pragma omp parallel { int dxij_priv[] = {0,0,0,0}; int vt_priv[] = {0,0,0,0}; double sp_priv[Npartstot-Nboun][100][4],torquep_pri
#pragma omp parallel
{
int dxij_priv[] = {0,0,0,0};
int vt_priv[] = {0,0,0,0};
double sp_priv[Npartstot-Nboun][100][4],torquep_priv[Npartstot-Nboun][4],fmp_priv[Npartstot-Nboun][4];
for(i=Nboun+1;i<=Npartstot;++i){
for(int n=1;n<=Nneb[i];++n){
for(int p=1;p<=3;++p){
sp_priv[i][n][p]=0;}}}
for(i=Nboun+1;i<=Npartstot;++i){
for(int p=1;p<=3;++p){
torquep_priv[i][p]=0;
fmp_priv[i][p]=0;
}}
#pragma omp for nowait reduction(+:dal) reduction(+:st) reduction(+:vtang) reduction(+:sdotr)
for (i=Nboun+1;i<=Npartstot;++i){
for (int n=1;n<=Nneb[i];++n){
if(dxij_priv[1]>L-rng*(R[i]+R[j]))
dxij_priv[1]=dxij_priv[1]-L; //Same for other indices...
else if (dxij_priv[1]<-L+rng*(R[i]+R[j])) //Same for other indices...
dxij_priv[1]=dxij_priv[1]+L;
for (int p=1;p<=3;++p){
dal=dal+mij[p]*(vp[i][p]-vp[j][p]);
}
vt_priv[1]=vt_priv[1]-dxij_priv[i]; //Same for other indices
sdotr=0;
for (int p=1;p<=3;++p)
sp_priv[i][n][p] += vt_priv[p]*dt;
for (int p=1;p<=3;++p)
sdotr += sp_priv[i][n][p]*dxij_priv[p];
for (int p=1;p<=3;++p)
sp_priv[i][n][p] -= sdotr*dxij_priv[p]/d/d;
for (int p=1;p<=3;++p)
st += sp_priv[i][n][p]*sp_priv[i][n][p];
st=sqrt(st);
for (int p=1;p<=3;++p)
vtang += vt_priv[p]*vt_priv[p];
vtang=sqrt(vtang);
for (int p=1;p<3;++p) sp[i][n][p] *=st/st_prev;
for (int p=1;p<=3;++p) tij[p]=vt_priv[p]/vtang;
for (int p=1;p<=3;p++){
fmp_priv[i][p]=fmp_priv[i][p]+mij[p]*NForce+tij[p]*TForce;
torquep_priv[i][1]=torquep_priv[i][1]-R[i]/d*TForce*(dxij_priv[2]*tij[3]-dxij_priv[3]*tij[2]); //Same for other indices...
}
} //end of n loop
dxij[1] += dxij_priv[1];dxij[2] += dxij_priv[2];dxij[3] += dxij_priv[3];vt[1] += vt_priv[1];vt[2] += vt_priv[2];vt[3] += vt_priv[3];
for(int z=Nboun+1;z<=Npartstot;++z)
for(int n=1;n<=Nneb[i];++n)
for(int p=1;p<=3;++p)
sp[z][n][p] += sp_priv[z][n][p];
for(int z=Nboun+1;z<=Npartstot;++z)
for(int p=1;p<=3;++p){
torquep[z][p] += torquep_priv[z][p];
fmp[z][p] += fmp_priv[z][p];
} //end of p
}//end of i
} //end of #pragma
#pragma omp并行
{
int dxij_priv[]={0,0,0};
int vt_priv[]={0,0,0};
双P_-priv[Npartstot-Nboun][100][4],扭矩P_-priv[Npartstot-Nboun][4],fmp_-priv[Npartstot-Nboun][4];
对于(i=Nboun+1;iPerhaps)堆栈溢出是真实的?什么是NPartsTot Nboun?您正在分配408*sizeof(double)*(NPartsTot Nboun)在每个线程的堆栈上…Npartstot和Nboun是两个常量,使用另一个函数从文件中读取这些值…它们的值在整个程序中保持不变…顺便说一句,我尝试在linux上运行它,但我遇到了一个分段错误(内核转储)错误…不确定这里发生了什么…那么,这些常量有多大?您在每个堆栈上分配了多少空间?(考虑一下,如果NPartsTot Nboun==10000,您需要~31MiB;线程堆栈通常小于此值…)。Linux上的SEGV也可能是堆栈溢出。因此,您告诉我,在单个线程中分配给每个堆栈的空间小于代码连续运行时分配的空间?(很抱歉,我正在忙于其他课程)。也许堆栈溢出是真的?NPartsTot Nboun是什么?您分配的是408*sizeof(double)*(NPartsTot Nboun)在每个线程的堆栈上…NPartsTot和Nboun是通过另一个函数提供给程序的两个常量,该函数从文件中读取这些值…它们的值在整个程序中保持不变…顺便说一句,我尝试在linux上运行它,但我遇到了一个分段错误(内核转储)错误…不确定这里发生了什么…那么,这些常量有多大?您在每个堆栈上分配了多少空间?(考虑一下,如果NPartsTot Nboun==10000,您需要~31MiB;线程堆栈通常小于此值…)。Linux上的SEGV也可能是堆栈溢出。因此,您告诉我,在单个线程中分配给每个堆栈的空间小于代码连续运行时分配的空间?(很抱歉,回复太晚,我正忙于其他课程)。