0

我正在运行科学计算,需要存储粒子的速度。要存储3个组件,我应该使用3个不同的阵列还是单个1x3阵列?它会以任何方式影响我的计算吗?一个N×M阵列或M个大小为N的数组?

我的颗粒数量会很大,甚至可能会上升到1e10或更多。我将使用C++。

+3

这非常依赖于您访问数据的方式。由于缓存等因素的影响,有不同的算法会以任何方式受益。 – twalberg

+0

你的头衔说NxM,但你的身体说1x3。为什么要使用1x3阵列?你的意思是Nx3在体内? – user2357112

+0

这是一个古老的阵列结构与结构阵列问题的特殊情况。正如@twalberg所说,它只取决于你的数组访问。如果你将沿着一个维度比其他维度运行更多 - 比如说所有速度的x分量(比如说)与每个粒子速度的所有分量相比 - 将这些数据保持在一起是合理的。但是请注意,在这里你可以通过将数组排序为(例如'double vel [NPTS] [NDIMS] vs'double vel [NDIMS] [NPTS])来获得这种好处 - 实际上已经分开了数组'vx [NPTS ],vy [NPTS],vz [NPTS]'会是一种痛苦。 –

回答

0

总是试图首先写可读和可维护的代码,然后才优化。

在C++中,如在旧的C中一样,内存被分配在一个大块(最小为10240字节)内部由brksbrk分配。所以想象你之前已经分配并释放了一些内存。

案例1:您创建3个数组。最有可能的是,在使用过的中间会有一些空闲块。因此,它将基本上遍历空闲块的列表,并根据算法放置它们,可能是最合适的(,但不仅是)。无论哪种方式,它会(或可能,因为它的运行时没有明确的答案)将它们分散在已经分配的内存上。说1在中间,然后另外两个在最后。

情况2:您创建1个数组。然后它将被分配在一个地方。无论是新获得的存储还是可用的存储。

所以,我会去与1x3 2维数组。这样你就会受益于参考原理的局部性,特别是内存地址

但是,正如我所说的,您应该确保使用2维数组不会损害数据连接性方面的可读性。

我希望这会流露出一些光芒!

+1

我相信现代分配器倾向于使用'mmap'而不是'sbrk'。总的来说,你的建议似乎很合理在CPU上,一个3分量阵列应该比3个1分量阵列略快。然而,在GPU上(考虑OpenCL或Cuda),由于大部分不存在全局内存缓存,因此速度会更快。 –

+0

是的,同意。我只是尽量做到尽可能地基本。 – user8

+0

'[1] [3]'?什么?你假设N = 1?或者你是否认为每个粒子都有自己的数组/数组?这里的选项是一个用于所有质点速度数据的Nx3阵列或者长度为N的三个数组,表示所有粒子速度的x,y和z分量。 – user2357112

相关问题