gpt4 book ai didi

c++ - 大型 3D 阵列的性能 : contiguous 1D storage vs T***

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:38 25 4
gpt4 key购买 nike

我想知道是否有人可以建议存储大型(比如 2000 x 2000 x 2000)3D 数组以进行有限差分离散化计算。在现代 CPU 架构上,连续存储 float* 是否比 float*** 提供更好的性能?下面是一个简化的计算示例,它是在整个数组上完成的:

for i ...
for j ...
for k ...
u[i][j][k] += v[i][j][k+1] + v[i][j][k-1]
+ v[i][j+1][k] + v[i][j-1][k] + v[i+1][j][k] + v[i-1][j][k];

对比

    u[i * iStride + j * jStride + k] += ...

附言:考虑到问题的大小,存储 T*** 的开销很小。访问不是随机的。此外,我执行循环阻塞以最大程度地减少缓存未命中。我只是想知道 T*** 情况下的三次取消引用与一维数组情况下的索引计算和单次取消引用相比如何。

最佳答案

这些不是同类比较:平面数组就是平面数组,您的代码根据线性化矩形 3D 数组的某种逻辑将其分成多个部分。您可以通过一次取消引用以及一些数学运算来访问数组的元素。

另一方面,

float*** 允许您保留数组或数组的“锯齿状”数组,因此您可以在此类数组中表示的结构更加灵活。自然地,您需要为这种灵 active 付出额外的 CPU 周期,将指针取消引用到指针的指针,然后是指针的指针,最后是指针(代码中的三对方括号)。

如果以真正随机的顺序访问 float*** 的各个元素,访问它们的速度自然会慢一些。但是,如果顺序不是随机的,您看到的差异可能很小,因为指针的值将被缓存。

float*** 也将需要更多内存,因为您需要分配两级额外的指针。

关于c++ - 大型 3D 阵列的性能 : contiguous 1D storage vs T***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com