2012-02-01 323 views
1

我見的代碼如下:OpenMP和嵌套與循環continue語句

int myArray[] = {0, 0, 0, 0, 0, 0}; 
double EV = 0; 
for(short a1 = 1; a1 <= 6; ++a1) 
{ 
    ++myArray[a1-1]; 
    if(....) 
    { 
     --myArray[a1-1]; 
     continue; 
    } 
    EV = myEVFunc(); 
    if(EV...) 
    { 

     for(short a2 = 1; a2 <=6 ; ++a2) 
     { 
      ++myArray[a2-1]; 
      if(....) 
      { 
       --myArray[a2-1]; 
       continue; 
      } 
      EV = myEVFunc(); 
      if(EV...) 
      { 
       for(short a3 = 1; a3 <= 6; ++a3) 
       { 
        ++myArray[a3-1]; 
        if(....) 
        { 
         --myArray[a3-1]; 
         continue; 
        } 
        EV = myEVFunc(); 
       } 
      } 
     } 
    } 
} 

我想使用的OpenMP並行化循環。代碼編譯罰款時,我把 #pragma omp parallel for在最外面的for循環前面。但是它會給出不正確的結果我懷疑兩個問題循環內的continue語句和嵌套循環中有共享變量的事實。 是否有可能在這段代碼中使用OpenMP,如果有的話,任何人都可以給我正確的語法。提前致謝。

回答

2

我將指出幾個明顯的事情:

1)double EV = 0;聲明外環外。因此它將被所有線程共享。所以你將有一個競爭條件EV = myEVFunc();和每個訪問EV

解決方法是在循環中聲明它。這將使它對每個線程都是私有的。

#pragma omp parallel for 
    for(short a1 = 1; a1 <= 6; ++a1) 
    { 
     ++myArray[a1-1]; 
     if(....) 
     { 
      --myArray[a1-1]; 
      continue; 
     } 
     double EV = myEVFunc(); 
     if(EV...) 
     ... 

2.)另一個問題是你的外環只有6次迭代。所以你不會得到超過6個線程。此外,你可以得到負載平衡問題與說4個核...

1

您還可以使用線程私有,如果這是更多的,你需要

什麼它會給變量EV的私人拷貝到每個線。最初它將在這些線程中被初始化,除非你使用copyin。

隨着出COPYIN指令看起來像:

#pragma omp parallel for private(EV) 

這就避免了競爭條件,並允許電動汽車在每個線程independntly行動

0

也有數組訪問的競爭條件如++myArray[a1-1];++myArray[a2-1];來自不同的線程。 另外需要聲明的私人所有的循環計數器,a1(默認情況下是因爲私人附註OMP對的,但沒有),a2, a3 ..

也許你可以找到寫你的循環,因爲內的所有這些條件語句的另一種方式循環通常效率不高。