如果我有一个M
x N
矩阵和一个大小为K的L1缓存,那么最佳矩阵转置的缓存未命中率是多少。显然,我正在寻找的东西是M
和N
(可能K
的函数,虽然这可能太复杂了)而不是特定的数字。
我在问,因为我有很多矩阵数据必须在两个方向上进行处理,而且我想要一个经验法则,知道什么时候值得同时保留原始数据和转置到内存中。
答案 0 :(得分:2)
您还没有说过您拥有的缓存类型,是否直接映射? 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目录的所有微小细节,否则很难计算。