矩阵乘法的简单循环平铺示例

问题描述 投票:2回答:1

我正在尝试了解使用循环平铺或阻塞将两个矩阵相乘时实际发生的情况(逐步)。 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个矩阵元素的长线。因此,当对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]不在第二个缓存行中,并且我将具有内存访问权限。

在此示例中,循环拼贴会有所帮助吗?谁能(逐步)解释高速缓存内发生了什么以及为什么减少了内存访问?如果这个例子不合适,谁能组成一个可以看到阻塞好处的地方?

谢谢。

loops caching blocking multiplication tiling
1个回答
0
投票

我意识到这是一个古老的问题,但是为了建立一个有用的答案,我想将此链接附加到Efficient use of Tiling上,这是英特尔写的一篇非常有趣的文章(此问题之后三年!),它似乎在解释什么。 OP正在要求。

© www.soinside.com 2019 - 2024. All rights reserved.