当我使用循环平铺或阻塞来乘以两个矩阵时,我试图理解究竟发生了什么(一步一步)。 F.E.我理解http://en.wikipedia.org/wiki/Loop_tiling上的代码是什么 确实。但是,我无法想象缓存中发生了什么。假设我想将两个4x4矩阵相乘。 AxB = C.
现在我想为每个A和B创建4个子矩阵(2x2)。所以A = [A1 A2; A3 A4]和B = [B1 B2; B3 B4]。内存中C的所有元素都被初始化为零。 F.E.使用calloc。
1)假设矩阵以行主要顺序存储在内存中:row1,row2,row3,row4 ......
2)假设我有两个带有4个矩阵元素的cachline。因此,当对c C [0,0]中的第一个元素执行朴素矩阵乘法时,我将对A [0,0]进行存储器访问,并将整个矩阵行复制到高速缓存行中。然后我有一个B [0,0]的第二个内存访问。 然后C [0,0] = A [0,0] * B [0,0] + C [0,0]。下一步是C [0,0] = A [0,1] * B [1,0] + C [0,0]。 由于A [0,1]在第一个缓存行中,我将有一个缓存命中。但是,B [1,0]不在第二个缓存行中,我将拥有内存访问权限。
在这个例子中,Loop Tiling会有什么帮助吗?任何人都可以(逐步)解释缓存中发生的事情以及减少内存访问的原因吗?如果这个例子不合适,那么任何人都可以组成一个可以看到阻止的好处吗?
提前致谢。