复制大型数组或更改访问索引

时间:2016-10-04 09:12:51

标签: arrays performance fortran

道歉,如果这个问题有明显的答案,但我无法在网上找到答案。

在Fortran中,假设我有一个实数的数组(> 100,000)。在整个时间积分方案的一个步骤中,我将一遍又一遍地连续访问该数组(以连续的方式)。每个后续步骤将不再需要此数组的某些元素。我不知道有多少,它可能在任何一个地方都没有。我的问题是:

更好的是:(1)每一步都要经过这个数组并将我需要的剩余元素复制到一个新数组,即使只需要取出一小部分,或者(2)我应该有一个新的整数索引数组,每次都会更新以访问此数组。我的理解是,如果内存访问是连续的,它应该非常快,我认为这应该超过复制数组的成本。另一方面,更新整数索引会非常快,但成本会是数据会被分段并且访问它会更慢。

或者这是一个没有明确答案的问题类型,我需要去测试两种方法,找出哪种方法更适合我的应用程序?

1 个答案:

答案 0 :(得分:3)

事先很难说,所以简单的答案确实是*"措施!"
但是,一些推测可能有助于用什么来衡量。在假设代码确实具有性能关键性的情况下,所有内容都会出现。

内存延迟:
100k元素通常超过L1和L2缓存,因此内存局部性将起作用。 OTOH,线性扫描比分散访问更好。

如果内存延迟与每个元素操作相比显着,大多数元素变得“无趣”"经过一定次数的迭代后,我的目标是:

  • 将单个元素标记为"在将来的迭代中跳过"
  • 当~50%的元素变得可跳过时,压缩内存(即移除可跳过的元素)

(对上述条件进行测试:对于一个简单的实现,单个迭代的时间是否比元素数量增长更快 - 线性?)

缓存友好块:
如果内存延迟是一个问题,可以将多个操作应用于一个小块(例如,32KiB数据),这样做。

<强>并行化:
(房间里的大象)。如果您可以在缓存友好的块中处理,则可以轻松添加。