0
我正在使用开放MP来加速我的程序中的通量计算。我基本上想让OpenMP同时执行这两种左右流量计算。但相反,以下代码需要更多的时间用于#pragma
指令。我修改了什么才能正确使用它?如何让不同的OpenMP线程执行不同的任务
#pragma omp parallel num_threads(2)
{
#pragma omp single
{//first condition
//cerr<<"Executed thread 0"<<endl;
if ((fabs(lcellMach-1.0)<EPSILON) || ((lcellMach-1.0) > 0.0)){//purpose of Epsilon!!!!
FluxP[0] = rhol * vnl;
FluxP[1] = rhol * ul * vnl + Pl*nx;
FluxP[2] = rhol * vl * vnl + Pl*ny;
FluxP[3] = rhol * wl * vnl + Pl*nz;
FluxP[4] = rhol * ((GAMMA * Pl/(rhol * (GAMMA-1.0))) + ((ul*ul + vl*vl + wl*wl)/2.0)) * vnl;
}else if ((fabs(lcellMach+1.0)<EPSILON) || ((lcellMach+1.0) < 0.0)){
FluxP[0] = FluxP[1] = FluxP[2] = FluxP[3] = FluxP[4] = 0.0;// If flow direction is opposite the Flux + is zero
}else {
double ql = (ul*ul + vl*vl + wl*wl);// how did this come
FluxP[0] = rhol * lcell_a * (lcellMach+1.0)*(lcellMach+1.0)/4.0;
FluxP[1] = FluxP[0] * (ul + (nx*(0.0-vnl + 2.0*lcell_a)/GAMMA));
FluxP[2] = FluxP[0] * (vl + (ny*(0.0-vnl + 2.0*lcell_a)/GAMMA));
FluxP[3] = FluxP[0] * (wl + (nz*(0.0-vnl + 2.0*lcell_a)/GAMMA));
FluxP[4] = FluxP[0] * ( ((ql - vnl*vnl)/2.0) + (((GAMMA-1.0)*vnl + 2.0*lcell_a)*((GAMMA-1.0)*vnl + 2.0*lcell_a)/(2.0*(GAMMA*GAMMA-1.0))) );
}
}//end of 1st
#pragma omp single
{//second condition
//cerr<<"Executed thread 1"<<endl;
if ((fabs(rcellMach+1.0)<EPSILON) || ((rcellMach+1.0) < 0.0)) {
FluxM[0] = rhor * vnr;
FluxM[1] = rhor * ur * vnr + Pr*nx;
FluxM[2] = rhor * vr * vnr + Pr*ny;
FluxM[3] = rhor * wr * vnr + Pr*nz;
FluxM[4] = rhor * ((GAMMA * Pr/(rhor * (GAMMA-1.0))) + ((ur*ur + vr*vr + wr*wr)/2.0)) * vnr;
}else if ((fabs(rcellMach-1.0)<EPSILON) || ((rcellMach-1.0) > 0.0)) {
FluxM[0] = FluxM[1] = FluxM[2] = FluxM[3] = FluxM[4] = 0.0;
}else {
tempFlux[0] = rhor * vnr;
tempFlux[1] = rhor * ur * vnr + Pr*nx;
tempFlux[2] = rhor * vr * vnr + Pr*ny;
tempFlux[3] = rhor * wr * vnr + Pr*nz;
tempFlux[4] = rhor * ((GAMMA * Pr/(rhor * (GAMMA-1.0))) + ((ur*ur + vr*vr + wr*wr)/2.0)) * vnr;
double qr = (ur*ur + vr*vr + wr*wr);
tempFluxP[0] = rhor * rcell_a * (rcellMach+1.0)*(rcellMach+1.0)/4.0;
tempFluxP[1] = tempFluxP[0] * (ur + (nx*(0.0-vnr + 2.0*rcell_a)/GAMMA));
tempFluxP[2] = tempFluxP[0] * (vr + (ny*(0.0-vnr + 2.0*rcell_a)/GAMMA));
tempFluxP[3] = tempFluxP[0] * (wr + (nz*(0.0-vnr + 2.0*rcell_a)/GAMMA));
tempFluxP[4] = tempFluxP[0] * ( ((qr - vnr*vnr)/2.0) + (((GAMMA-1.0)*vnr + 2.0*rcell_a)*((GAMMA-1.0)*vnr + 2.0*rcell_a)/(2.0*(GAMMA*GAMMA-1.0))) );
for (int j=0; j<O; j++) FluxM[j] = tempFlux[j] - tempFluxP[j];
}
}
}//pragma
需要紧急帮助。谢谢。
#pragma omp single:omp single指令标识必须由**单个可用线程**运行的一段代码。 – nhahtdh
那我在这里做什么?我需要并行执行单个部分内的两个代码块。 –
这可以做到; @ nhahtdh的评论描述了这个问题,Hristo的答案正确地描述了如何去做你正在做的事情。但是这似乎是一个过分低层次的并行化的地方。据推测,在一些更高级别的代码中,你正在对许多单元进行这种通量计算,对吗?这个循环似乎是一个更有利可图的并行化目标。 –