2017-08-19 54 views
0

我有一個BML的序列版本,我試圖用OpenMP編寫一個並行版本。基本上我的代碼與main一起工作,在一個循環中調用水平和垂直移動的兩個函數。像這樣:Biham-Middleton-Levine BML模型中的OpenMP

for (s = 0; s < nmovss; s++) { 
     horizontal_movs(grid, N); 
     copy_sides(grid, N); 
     cur = 1-cur; 
     vertical_movs(grid, N); 
     copy_sides(grid, N); 
     cur = 1-cur; 
} 

其中cur是當前網格。然後水平和垂直功能是相似的,具有嵌套循環:

for(i = 1; i <= n; i++) { 
    for(j = 1; j <= n+1; j++) { 
     if(grid[cur][i][j-1] == LR && grid[cur][i][j] == EMPTY) { 
      grid[1-cur][i][j-1] = EMPTY; 
      grid[1-cur][i][j] = LR; 
     } 
     else { 
      grid[1-cur][i][j] = grid[cur][i][j]; 
     } 
    } 
} 

的代碼在每一步產生一個PPM圖像,並且白衣某一輸入串行版本產生輸出,我們可以假設良好。但使用#pragma omp parallel for兩個函數H和V時,PPM文件結果在這樣的區域分裂爲線程數內(即4):

final step

我想的問題是,每個線程應該做既在白蟻之前順序運行,因爲運動是嚴格連接的。我不知道該怎麼做。如果我在像main循環之前的更高級別上設置雜注,則不會加速。顯然,ppm文件必須不像圖像一樣切片。

+1

由於您提供的細節級別有限(只顯示實際的並行代碼,這會更有用),所以您忘記了在#p​​ragma中聲明'private(j)' omp並行爲'線。試着添加它,看看會發生什麼。 – Gilles

+0

@Gilles'默認(無),共享和私人'在問題中被省略,但在我的代碼中。 – Caramelleamare

回答

0

Goin'on我嘗試這個解決方案,給了我一個相同的結果作爲串行代碼,但我不excatly明白爲什麼

# pragma omp parallel num_threads(thread_count) default(none) \ 
    shared(grid, n, cur) private(i, j) 
    for(i = 1; i <= n+1; i++) { 
#  pragma omp for 
     for(j = 1; j <= n; j++) { 
      if(grid[cur][i-1][j] == TB && grid[cur][i][j] == EMPTY) { 
       grid[1-cur][i-1][j] = EMPTY; 
       grid[1-cur][i][j] = TB; 
      } 
      else { 
       grid[1-cur][i][j] = grid[cur][i][j]; 
      } 
     } 
    } 
} 

因此,如果我只用一個可用內核超過線程( 4),執行時間「爆炸」而不是幾乎不變。