GPU大矩阵乘法L1 Cache命中率0%的原因排查咨询
结合你给出的矩阵步长超4KB、缓存行大小128字节的条件,以下是导致L1缓存命中率为0%的核心原因:
跨步访问完全破坏缓存行复用
当矩阵访问步长(比如列访问时的行跨度)超过4KB,远大于128字节的缓存行大小,每次加载的缓存行中,除了当前访问的元素外,其余127字节的数据完全没有机会被后续访问用到。而且下一次访问的地址与当前缓存行的偏移量远超缓存行范围,导致每次内存访问都对应一个全新的缓存行,完全没有复用可能,命中率直接降为0%。缓存行与访问模式完全不匹配,无二次访问可能
由于步长是缓存行大小的32倍以上(4096/128=32),后续所有内存访问的地址都不会落在之前加载过的任何缓存行范围内。即使L1缓存有足够空间存储这些缓存行,也没有任何缓存行会被第二次访问,自然不会产生命中。L1缓存被显式禁用或配置为直通模式
部分GPU架构支持通过编译选项(如CUDA中的--disable-l1)或运行时配置,将L1缓存设置为不缓存数据的直通模式,或者直接禁用L1缓存。此时所有内存请求都会绕过L1直接访问更高层级缓存或显存,L1缓存命中率必然为0%。矩阵数据布局导致非连续访问无缓存复用价值
如果矩阵采用了极端非连续的存储布局(比如为了特定需求刻意让元素间隔超过4KB),每次访问矩阵元素都会触发全新的缓存行加载,且没有任何后续操作会访问已加载的缓存行内容,最终导致L1缓存完全没有命中场景。缓存映射与步长的冲突导致完全淘汰
若矩阵访问步长恰好是L1缓存组大小的整数倍,会导致所有内存请求都映射到缓存的同一组(或固定几个组),而缓存组的容量有限,新的缓存行会立即替换掉旧的,且旧缓存行中的数据再也不会被访问,最终表现为0%命中率。
内容的提问来源于stack exchange,提问作者Jarvis

