2

当我使用循环平铺或阻塞将两个矩阵相乘时,我试图了解真正发生了什么(一步一步)。Fe 我明白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 的内存中的所有元素都初始化为零。fe 使用 calloc。

1) 假设矩阵以行优先顺序存储在内存中:row1,row2,row3,row4 ...

2)假设我有两个 cachline,每个都有 4 个矩阵元素。因此,当对 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] 不在第二个缓存行中,我将访问内存。

循环平铺在这个例子中有什么帮助吗?谁能解释(一步一步)缓存中发生了什么以及为什么减少内存访问?如果这个例子不合适,任何人都可以弥补一个阻塞的好处是可见的吗?

提前致谢。

4

0 回答 0