2014-11-02 121 views
1

我對這個特定的堆棧交換是新的。我不知道讓事情變得漂亮的語法,對不起。OpenMP嵌套循環索引依賴

我正在努力最大化我的娛樂項目的代碼。我使用C++編寫代碼,並使用OpenMP進行並行化。問題是如下,這是實際代碼的過於簡化的版本,說我有:

//Lots of other stuff 

#pragma omp parallel for ordered num_threads(4) schedule(dynamic, 100) private(a,b) 
for(int a=0; a<230000; a++) 
{ 
    for(int b=a+1; b<230000; b++) 
    { 

     //code increments b at times, example 
     while(stored[b][0]==stored[a][0]) 
     { 
        b++; 
     } 

     //increment counter 
     #pragma omp atomic 
     ++counter; 

     //counting part 
     #pragma omp ordered 
     if(stored[a][0]!=stored[b][0]) 
     { 
      if(stored[a][1]!=stored[b][1]) 
      { 
       //print counter to file 
      } 
     } 
    } 
} 

從本質上講,我想算我的代碼貫穿的次數。但是,依賴關係「b = a + 1」似乎使代碼無法使用。它給了我相同的計數,就好像它只是大約100億的「b = 0」一樣。

任何幫助將不勝感激。

編輯1:我應該提到循環內部的一切是獨立的。也就是說,它可以在a上任意方向上運行,或者在a上隨機選擇任意值,但它必須按順序在b中運行。整個問題是在某些約束條件下跳過儘可能多的b值,這些約束條件是b的增量測量,爲此,算法需要b中的順序。

回答

1

我有點困惑你的代碼。如果您試圖使代碼平行,您爲什麼要在編譯指令中下訂單?有序將使它運行在串行。如果使用有序的方法得到了錯誤的答案,那麼代碼的其他部分可能是錯誤的。

我發現的一個問題是你已經在編譯指示語句之前聲明瞭a和b。你可能不應該這樣做,所以你的代碼不會混淆。 a和b應該在for循環的範圍內。

這是我認爲你正在尋找的代碼。

// do not declare a or b in the code before or use different variables instead of a or b 
int counter = 0; 
#pragma omp parallel for num_threads(4) schedule(dynamic, 100) 
for(int a=0; a<230000; a++) 
{ 
    int tmpCounter = 0; 
    for(int b=a+1; b<230000; b++) 
    { 

     //code increments b at times, example 
     while(stored[b][0]==stored[a][0]) 
     { 
        b++; 
     } 

     //increment counter code 
     ++tmpCounter; 

     //counting part 
     // idk if you need this code to be ordered? 
      if(stored[a][0]!=stored[b][0]) 
      { 
      if(stored[a][1]!=stored[b][1]) 
      { 
       //print counter to file 
      } 
      } 

    } 
    #pragma omp critical 
    counter += tmpCounter; 
} 

如果這不是你要找的,只需在澄清後對我的帖子發表評論。我會盡力修復它。

+0

我放置順序的原因是因爲線程正在同時寫入文本文件,因爲它們互相中斷,所以線條不可讀。我在循環之前宣佈(a,b)試圖解決問題。 – ReverseFlow 2014-11-02 04:07:30

+0

試圖解決計數問題。代碼剛剛在串行模式下運行,減少了三分鐘的時間,並且它給出了相同的計數。最初我將它與以前的輸出進行比較,似乎他們在我最後幾次代碼編輯之前都是錯誤的。感謝您的迴應。 – ReverseFlow 2014-11-02 04:13:44

+2

我添加了一個tmpCounter,它大大增加了並行代碼的性能時間。這是因爲線程只有在for循環完成時才需要等待訪問計數器。考慮添加。我還會考慮在並行代碼完成後爲輸出創建一個tmp隊列並在後臺將其寫入文件。這可能會讓你的程序更快。 – Atish 2014-11-03 02:10:16