2012-06-15 118 views
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 

需要紧急帮助。谢谢。

+2

#pragma omp single:omp single指令标识必须由**单个可用线程**运行的一段代码。 – nhahtdh

+0

那我在这里做什么?我需要并行执行单个部分内的两个代码块。 –

+0

这可以做到; @ nhahtdh的评论描述了这个问题,Hristo的答案正确地描述了如何去做你正在做的事情。但是这似乎是一个过分低层次的并行化的地方。据推测,在一些更高级别的代码中,你正在对许多单元进行这种通量计算,对吗?这个循环似乎是一个更有利可图的并行化目标。 –

回答

1

你需要的是sections结构:

#pragma omp parallel sections num_threads(2) 
{ 
    #pragma omp section 
    { 
     ... code that updates FluxP ... 
    } 
    #pragma omp section 
    { 
     ... code that updates FluxM ... 
    } 
} 

,但似乎你的代码并不像它会花费很多时间做计算(无大for环内例如),所以开销的OpenMP将会比计算时间节省更多的时间,因此并行版本很可能会比串行执行更慢。

相关问题