2012-06-15 2 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 описывает проблему, и ответ Христа правильно описывает, как делать то, что вы пытались сделать. Но это похоже на слишком низкоуровневое место для параллелизма. Предположительно, на каком-то более высоком уровне кода вы делаете этот расчет потока по многим ячейкам, правильно? Этот цикл кажется более прибыльной целью для распараллеливания. –

ответ

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 будет, скорее всего, более трудоемким, чем экономия времени вычислений, и, следовательно, параллельная версия, скорее всего, будет выполняться медленнее, чем серийный.

Смежные вопросы