【发布时间】:2021-06-06 14:50:57
【问题描述】:
我有一个包含 7 个块的 65K 样本的数据集:float arr[7][65536] 我需要计算每个相应 7 个数字的平均值,因此结果将是一个大小为 65536 的数组:
float result[0] = arr[0][0] + arr[1][0] + arr[2][0] + ... / 7
float result[1] = arr[0][1] + arr[1][1] + arr[2][1] + ... / 7
问题是不按顺序访问内存会造成很多缓存未命中,在内存方面有没有更好的方法来解决这个问题? 提前对数组进行整形也会导致内存效率低下。
谢谢。
【问题讨论】:
-
发布创建这个二维数组的实际代码。我们不知道您是否以天真的方式动态创建了这个数组,数组元素散布在整个堆中,它是否是数据位于连续内存中的“真正”二维数组,等等。
-
也许,先
for (size_t j = 0; j < 65536; ++j) result[j] = array[0][j];,然后for (size_t i = 1; i < 7; ++i) for (size_t j = 0; j < 65536; ++j) result[j] += array[i][j];;然后for (size_t j = 0; j < 65536; ++j) result[j] /= 7;。 -
@PaulMcKenzie - 这是一个真正的二维数组,在内存中是连续的。
标签: c++ arrays performance caching