我有一个简单的 Fortran 代码,它执行矩阵乘法,它像这样与 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
瓷砖的尺寸。
在文献中有更高级的方法来组织计算。