如何测量缓存层级间的加载与存储总线带宽?
如何测量缓存层级间的加载与存储带宽?
本文中定义的加载与存储带宽是指缓存层级间每周期的数据传输能力。例如,wikichip指出L2缓存到L1$的带宽为64 B/周期。
有方案可用于计算L3缓存的总带宽,但它假设每次请求涉及64字节传输。我从wikichip得知带宽为64B/周期或32B/周期,但希望自行验证。
首次尝试:刷新缓存后加载数据
我的首次尝试是先刷新缓存再加载数据,但该方法失败了,因为它测量的是内存到缓存的传输时间。代码如下:
for (int page = 0; page < length/512; page++) { asm volatile("mfence"); for (int i = 0; i < 64; i++){ flush(&shm[page*512+i*8]); } asm volatile("mfence"); int temp, l1; l1 = page*512 + 8*0; for (int i = 0; i < 64; i++){ temp = shm[l1]; l1 += 8; } }
驱逐集方案的局限性
考虑过使用驱逐集使数据仅驻留在L3缓存中,但L3缓存的最快加载耗时(42周期)远大于总线传输时间,而L3到L2的带宽为32 B/周期,这意味着总线不会成为瓶颈,该方法不可行。
AVX2方案尝试
随后尝试了AVX2方案:vmovntdq指令使用非临时提示,防止写入内存时缓存数据,每条指令存储256字节。我假设该操作会占用L1到L2、L2到L3、L3到内存的总线,若假设成立,则可近似测量带宽——三者中的最小带宽等于IPC*256字节。
但实际IPC仅为0.09到0.10,即每10周期执行一条vmovntdq指令,无法达到总线瓶颈,该尝试再次失败。代码如下:
AvxLoops: push rbp mov rbp,rsp mov rax,2000 vmovaps ymm0, [rsi] .loop: vmovntdq [rdi], ymm0 vmovntdq [rdi+32], ymm0 vmovntdq [rdi+64], ymm0 vmovntdq [rdi+96], ymm0 vmovntdq [rdi+128], ymm0 vmovntdq [rdi+160], ymm0 vmovntdq [rdi+192], ymm0 vmovntdq [rdi+224], ymm0 add rdi,32 dec rax cmp rax,0 jge .loop mov rsp,rbp pop rbp ret
请问有什么可行方案?如何测量缓存总线的加载与存储带宽?
内容的提问来源于stack exchange,提问作者moep0
相关产品推荐
相关产品推荐

