【问题标题】:One NxM array or N arrays of size M?一个 NxM 数组还是 N 个大小为 M 的数组?
【发布时间】:2017-01-05 17:47:40
【问题描述】:

我正在进行科学计算,需要存储粒子的速度。要存储 3 个组件,我应该使用 3 个不同的数组还是单个 1x3 数组?它会以任何方式影响我的计算吗?

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

【问题讨论】:

  • 这在很大程度上取决于您访问数据的方式。由于缓存等因素,有不同的算法可以从中受益。
  • 你的标题是 NxM,但你的身体是 1x3。为什么要使用 1x3 数组?您是说体内的 Nx3 吗?
  • 这是古老的 Array-Of-Structures 与 Structure-Of-Arrays 问题的一个特例。正如@twalberg 所说,这仅取决于您的数组访问权限。如果您将比其他维度更多地沿着一个维度进行操作 - 所有(例如)速度的 x 分量在一起,与每个粒子的速度的所有分量相比 - 将这些数据保持在一起是有意义的。但请注意,在这里您可以通过将数组排序为(例如)double vel[NPTS][NDIMS]double vel[NDIMS][NPTS] 来获得这种好处 - 实际上单独的数组 vx[NPTS], vy[NPTS], vz[NPTS] 会很痛苦。

标签: c++ arrays performance multidimensional-array scientific-computing


【解决方案1】:

始终尝试首先编写可读和可维护的代码,然后才进行优化。

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

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

案例 2:您创建 1 个数组。然后它会被分配到一个地方。新获得的存储空间或可用的存储空间。

所以我会选择 1x3 二维数组。这样您将受益于参考原则的局部性,特别是内存局部性

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

我希望这能带来一些启发!

【讨论】:

  • 我相信现代分配器倾向于使用mmap而不是sbrk。总的来说,你的建议似乎是合理的。在 CPU 上,一个 3 组件阵列应该只比 3 个 1 组件阵列稍微快一点。然而,在 GPU(想想 OpenCL 或 Cuda)上,由于大部分不存在全局内存缓存,它会明显更快。
  • 是的,同意。我只是尽量保持基本。
  • [1][3]?什么?你假设N = 1?或者您是否认为每个粒子都有自己的数组/数组集?这里的选项是一个 Nx3 数组用于所有粒子速度数据或 3 个长度为 N 的数组表示所有粒子速度的 x、y 和 z 分量。
  • 等待...问题正文说 1x3。奇怪的。标题或正文中必须有错字。我猜 1x3 是一个错字。
  • 对其进行了编辑以消除任何不明确之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2021-08-29
相关资源
最近更新 更多