1

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

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

Rx => R(1:3N-2:3)

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

4

1 回答 1

5

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

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

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

你付钱,你做出选择。

于 2016-01-18T16:26:17.560 回答