2011-07-22 42 views
1

我試圖parallelise使用OpenMP(基本上編輯就地二維數組)的Floyd-Warshall算法,但我懷疑,我以最好的方式去了解它,這裏是我到目前爲止有:C,OpenMP:我怎樣才能使這個三重循環的parallisation更好?

#pragma omp parallel for private(i, j, k) shared(g) 
    for (i = 0; i < n; i++) { 
     for (j = 0; j < n; j++) { 
      for (k = 0; k < n; k++) { 
       g->A[j][k] = imin(g->A[j][k], g->A[j][i] + g->A[i][k]); 
      } 
     } 
    } 

我怎樣才能更好地利用OpenMP的任何想法呢?目前只有運行時間的一半,當然可以改進。

此外,如果將用於並行化的人對於其他技術的任何建議,我所有的耳朵。我想過MPI,但是我必須讓我的整個main函數平行嗎?

謝謝。

編輯

上面的代碼不工作,下圖顯示了爲什麼的答案。

回答

2

並行化的算法並不簡單。查看並行運行在這裏 http://www.mcs.anl.gov/~itf/dbpp/text/node35.html 的說明,有關信息。如果你有少量的處理器(雙核,四核,八核機),那麼Parallel Floyd 1可能適合你。如果你有大量的處理器(真棒GPU,網格計算機),那麼Parallel Floyd 2可能會更好。

+0

酷鏈接,謝謝 –

+0

感謝您的信息,查爾斯,你能不能幫我解析它變成我的頭好一點?據我瞭解,您將行分成R/N塊,其中R是數字或行,N是線程/處理器的數量,然後將「邊緣」行廣播到其他進程。我是否正確理解這一點,甚至可以使用OpenMP?謝謝。 – Griffin

+0

應該可以的,是的。有關OpenMP代碼,請參閱http://stackoverflow.com/q/6030658/341362(解決不同的問題),該代碼似乎使用了您需要的技術。 – Charles