我對這個特定的堆棧交換是新的。我不知道讓事情變得漂亮的語法,對不起。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中的順序。
我放置順序的原因是因爲線程正在同時寫入文本文件,因爲它們互相中斷,所以線條不可讀。我在循環之前宣佈(a,b)試圖解決問題。 – ReverseFlow 2014-11-02 04:07:30
試圖解決計數問題。代碼剛剛在串行模式下運行,減少了三分鐘的時間,並且它給出了相同的計數。最初我將它與以前的輸出進行比較,似乎他們在我最後幾次代碼編輯之前都是錯誤的。感謝您的迴應。 – ReverseFlow 2014-11-02 04:13:44
我添加了一個tmpCounter,它大大增加了並行代碼的性能時間。這是因爲線程只有在for循環完成時才需要等待訪問計數器。考慮添加。我還會考慮在並行代碼完成後爲輸出創建一個tmp隊列並在後臺將其寫入文件。這可能會讓你的程序更快。 – Atish 2014-11-03 02:10:16