如果我有一个M×N矩阵和一个大小为K的L1缓存,那么最佳矩阵转置就具有什么缓存未命中率.显然,我正在寻找的东西是M和N的函数(可能还有K,虽然这可能太复杂了)而不是特定的数字.
我问,因为我有很多矩阵数据必须在两个方向上处理,我想要一个经验法则,知道什么时候值得保留原始数据和转置到内存中.
最佳答案 您还没有说过您拥有的缓存类型,它是否直接映射? N路集合关联?假设一个N路组关联(是的,你确实需要高速缓存的所有细节,这取决于你的特定CPU架构),并假设一个特定的矩阵排序,例如column-major那么你基本上会有很多冷未命中M * N / C,其中C是缓存行大小(取决于CPU,但通常是8倍):).
那么你将在目标矩阵上进行有争议的访问,除非矩阵足够小以完全适合L1,否则你可以假设M * N冷未命中的最坏情况,例如:尺寸为32kB的L1可以容纳4000个双打,即大小为63 * 63的矩阵.
因此,我们将查看转换的最坏情况(M * N / C M * N)总L1未命中.
一个想法是做翻转矩阵排序的技巧,例如从column-major到row-major,而不是物理移动它,将其作为转置访问.如果您有正确的矩阵实现,您可以在同一数据上翻转矩阵排序,这是一个零成本操作.
真正昂贵的预取虽然从来没有在L1但在LLC(最后一级缓存),即使你得到L1未命中它仍然是一个便宜的错过,因为它将从L2加载.总之,除非您拥有目标CPU目录的所有微小细节,否则很难计算.