我有执行矩阵乘法的简单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
尺寸。
如何在文献中组织计算有更高级的方法。
我建议你在程序开始时设置一个小测试。它会针对多个块大小运行您的任务的缩小版本,并根据挂钟时间确定最佳版本。 –