2013-06-18 86 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

相关问题