2017-04-14 18 views
1

我想並行化一個代碼來運行尖峯神經元網絡上的一些模擬。這涉及到一個雙重循環,我在主循環外面放置了一個'#pragma omp parallel for'語句。下面的代碼:嵌套循環與編譯指示omp並行爲,jumbling up

int main(void){ 

    int i,j,count[200]; 

    #pragma omp parallel for 
    for(i=0;i<200;i++){ 
     count[i] = 0; 
     for (j=0;j<200;j++){ 
      if (j!=i){ 
       count[i]++; 
       printf("i: %d j: %d count[i]:%d, count[i]-j:%d\n",i,j,count[i], count[i]-j); 
      } 
     } 

    } 

    return 0; 
} 

結果看,一些計數的值[I]超過200,即使僅環從1到200計數[I] -j可以是0, 1或-1,但這些值差別很大,甚至認爲每個線程都會對i的一個值起作用,並且count數組僅依賴於i的當前值。如何重寫代碼以便我可以安全地增加計數?

+0

最終值是什麼?你可以在這之後添加一個循環來打印所有的值嗎? –

+0

在第二個循環之前放置'#pragma omp parallel'。 – purplepsycho

+0

@purplepsycho這只是錯誤的,會在'count [i]'上創建競爭條件。 – Zulan

回答

1

您必須聲明j私人。你可以這樣做明確通過:

#pragma omp parallel for private(j) 

i隱含私人是工作共享循環的循環變量。 count含蓄共享,因爲它定義在循環之外。這兩個都是可取的。

但是,我強烈建議總是儘可能在本地聲明變量al,特別是在使用OpenMP時。這樣隱含的私有/共享幾乎總是正確的,它避免了很多微妙的未定義的值讀取。它總體上是好的做法

int count[200]; 

#pragma omp parallel for 
for(int i=0;i<200;i++){ 
    count[i] = 0; 
    for (int j=0;j<200;j++){ 

BTW:你的count[i]-j打印輸出可以顯示完全任意值。它訪問可能由其他線程同時寫入的數據。