2013-06-18 80 views
0

我有執行矩陣乘法的簡單Fortran代碼和它被並行使用OpenMP這樣OPENMP塊和高速緩存大小

!$OMP PARALLEL DO PRIVATE(...) SHARED(...) SCHEDULE(STATIC,N/128) 

爲了使塊大小相對較大,並且處理器的數目的塊的多個的數目(4 ,8,16等)

但是,當矩陣大小變得非常大時,將塊大小設置爲小於緩存大小似乎更合理(至少值得嘗試)。有沒有簡單的方法來編寫考慮處理器緩存大小的可移植代碼?或者OpenMP不支持它?

+0

我建議你在程序開始時設置一個小測試。它會針對多個塊大小運行您的任務的縮小版本,並根據掛鐘時間確定最佳版本。 –

回答

1

這真的取決於你的算法和你的問題。我建議你尋找所謂的平鋪算法,並在你設置的瓦片上循環以獲得合適的尺寸。我使用這樣的有限差分模板計算:

!$omp do 
    do bk = 1,nz,tilenz 
    do bj = 1,ny,tileny 
    do bi = 1,nx,tilenx 
     do k = bk,min(bk+tilenz-1,nz) 
     do j = bj,min(bj+tileny-1,ny) 
     do i = bi,min(bi+tilenx-1,nx) 
      do something with array element A(i,j,k) and its neighbours 

其中tilenxtilenytilenz是瓷磚的xyz尺寸。

如何在文獻中組織計算有更高級的方法。

+0

我真的很喜歡玩不同的瓷磚尺寸。然而,問題在於,從基準測試中我知道內存帶寬是算法的瓶頸,要玩數字,我必須考慮處理器緩存大小和佈局。我不知道如何以便攜的方式做。 – Misha

+0

但是,這正是你爲內存帶寬有限的問題所做的事情!整個平鋪的重點是將您的線程集中在內存的一小部分 - 瓦片 - 適合緩存。 –

+0

對於內存帶寬問題,您會將連續內存碎片越小越好?你真的這麼做? – Misha

相關問題