我有執行矩陣乘法的簡單Fortran代碼和它被並行使用OpenMP這樣OPENMP塊和高速緩存大小
!$OMP PARALLEL DO PRIVATE(...) SHARED(...) SCHEDULE(STATIC,N/128)
爲了使塊大小相對較大,並且處理器的數目的塊的多個的數目(4 ,8,16等)
但是,當矩陣大小變得非常大時,將塊大小設置爲小於緩存大小似乎更合理(至少值得嘗試)。有沒有簡單的方法來編寫考慮處理器緩存大小的可移植代碼?或者OpenMP不支持它?
我有執行矩陣乘法的簡單Fortran代碼和它被並行使用OpenMP這樣OPENMP塊和高速緩存大小
!$OMP PARALLEL DO PRIVATE(...) SHARED(...) SCHEDULE(STATIC,N/128)
爲了使塊大小相對較大,並且處理器的數目的塊的多個的數目(4 ,8,16等)
但是,當矩陣大小變得非常大時,將塊大小設置爲小於緩存大小似乎更合理(至少值得嘗試)。有沒有簡單的方法來編寫考慮處理器緩存大小的可移植代碼?或者OpenMP不支持它?
這真的取決於你的算法和你的問題。我建議你尋找所謂的平鋪算法,並在你設置的瓦片上循環以獲得合適的尺寸。我使用這樣的有限差分模板計算:
!$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
其中tilenx
,tileny
和tilenz
是瓷磚的x
,y
和z
尺寸。
如何在文獻中組織計算有更高級的方法。
我建議你在程序開始時設置一個小測試。它會針對多個塊大小運行您的任務的縮小版本,並根據掛鐘時間確定最佳版本。 –