Fortran中指向一维目标数组的非连续指针数组的性能

Ami*_*mir 1 fortran pointers fortran2008

我有一个代码,其中R使用了具有3N元素的一维数组。您可以将其视为N粒子的位置向量,例如R=[r1x,r1y,r1z,r2x,r2y,...]。请注意,为了简洁地使用数组,应将模式定义为 this。

在代码的部分中,我只需要对 x 坐标执行一些操作。我目前正在使用这样的东西:

Rx => R(1:3N-2:3)
Run Code Online (Sandbox Code Playgroud)

Rx在随后的操作中使用。这使得访问不连续,但我想知道我是否可以希望有一种方法来矢量化操作。或者,可以使用在粒子上带有环的 OMP。我想在这个问题上得到专家的想法,尤其是在性能方面的最佳实践。

Hig*_*ark 5

你不能吃你的蛋糕也吃它。如果您想对非连续数组元素进行跨步访问,您将在性能上付出代价。对于所有元素都适合缓存的小型数组,您可能永远不会注意到价格。对于较大的数组,与按内存布局顺序逐个遍历数组元素相比,您将通过缓存进行更多的数据移动。使用指向非连续数组部分的指针不会神奇地改变这些事实(正如您所知道的)。

因此,您所做的是 Fortran 程序员一直在做的事情,针对最常见的访问模式优化数组的内存布局。在您的情况下,我们中的许多人要么拥有3,xrank-2 数组,要么拥有x,3一个数组,这取决于访问所有x(or yor z) 元素是否比访问逐粒子更频繁。

有时,在以非内存布局顺序对元素进行操作之前转置数组是值得的。有时甚至值得两次保存相同的数据,一次以一种顺序,一次以另一种方式。但是您必须弄清楚哪种方案最适合您的程序,我们没有提供高质量推荐所需的所有事实。如果这对您很重要,那么您应该进行一些测试并形成对情况的量化视图。

你支付你的钱,你做出你的选择。