我有一个代码,其中使用了具有R
个元素的一维数组3N
。您可以将其视为N
粒子的位置向量,例如R=[r1x,r1y,r1z,r2x,r2y,...]
。请注意,应该将模式定义为这样,以简化数组的使用。
在代码的各个部分中,我只需要在x坐标上执行一些操作。我目前正在使用这样的东西:
Rx => R(1:3N-2:3)
随后在操作中使用和Rx
。这使访问不连续,但我想知道我是否希望有一种方法来矢量化操作。或者,可以使用在颗粒上具有环的OMP。我想在这个问题上得到专家的想法,特别是在表现方面最好的做法。
答案 0 :(得分:4)
你也不能吃蛋糕。如果您想跨步访问非连续的数组元素,那么您将需要为性能付出代价。对于小型阵列,其中所有元素都适合缓存,您可能永远不会注意到价格。对于较大的阵列,与在内存布局顺序中逐个遍历数组元素相比,您将通过缓存执行更多数据移动。使用指向非连续数组部分的指针并没有神奇地改变这些事实(正如你似乎意识到的那样)。
所以你所做的就是Fortran程序员一直在做的事情,为最常见的访问模式优化数组的内存布局。在您的情况下,我们中的许多人将拥有3,x
排名-2数组或x,3
数组,具体取决于是否访问所有x
(或y
或{{1} })元素一起比访问粒子一样频繁。
有时值得在对非内存布局顺序的元素进行操作之前转置数组。有时它甚至值得两次保持相同的数据,一次在一个订单,一次在另一个订单。但是,您必须弄清楚哪个是您的计划的最佳解决方案,我们不具备提供高质量建议所需的所有事实。如果这对你很重要,那么你应该进行一些测试并制定一个量化的情况视图。
你支付了钱,然后你做出了选择。