如何测试内存的“随机访问带宽”?

问题描述 投票:0回答:1

我想知道内存在总随机读取工作负载下的表现如何。通常,随机访问是通过指针追逐来模拟的。然而,这种方法可能会导致两条内存访问指令之间存在高度依赖性,这使得测试的带宽受到“指令流水线延迟”而不是“内存通道带宽”的限制。

如何测试随机访问工作负载下的内存带宽限制?

performance memory benchmarking bandwidth
1个回答
0
投票

使用像 xorshift+ 这样的快速 PRNG 来生成大字节数组中的随机偏移量。 (使用 2 的幂数组大小,这样您就可以屏蔽 PRNG 结果,将它们取模到数组范围内。)

任何能够击败硬件预取的东西就足够了;它不一定是高质量的随机性。即使是 LCG 也足够好了,通过使用固定宽度整数来使用隐式模 2^32,因此您只需进行乘法和加法即可。 (在现代 x86 上,这是 4 个周期的关键路径延迟。即使具有良好的内存级并行性,现代 CPU 也无法为一直丢失到 DRAM 的负载维持 1 / 4 个周期的吞吐量。)

但是对于较小的数组大小,您会获得大量 L2 命中,您可能会考虑并行展开两个 LCG,以重叠它们的依赖链。


如果您特别想对所有缓存未命中进行基准测试,那么周期 = 数组大小的 PRNG(就像使用 2 的幂数组大小作为模数的 LCG)可能比更高质量的随机性更好,其中

random & (size-1)
有时会是同一个位置。 period = size 会给你一个元素索引的洗牌。不过,它不会完全避免时空局部性,因此您仍然会在某些级别的缓存中获得一些命中,但不会很多。

您可以通过将缓存设置为 64 字节结构数组来使缓存变得更加困难,这样您只能访问每个缓存行一次。或者用

int
int64_t
数组代替字节,以减少每个缓存行的元素数量,从而在以元素而不是字节计数时减少缓存容量。

© www.soinside.com 2019 - 2024. All rights reserved.