cuda 矩阵乘法,从最容易理解到算得最快(第二版源码-tile机制+共享内存)

下面我们仅仅引入tiling方法,在共享内存中进行分块矩阵的乘法运算。先分析一下能够减少多少次对全局存储区的访问。

当M=N=K=4096时,用第一版的代码,忽略cache的缓存时,需要从全局存储区读取2*(4096^3)个float变量。

为了让思路简单一点,我们假设A、B和C三个矩阵都是4096*4096的方阵。按照64*64大小的tile来分块,于是ABC都可以变成64x64的以64*64的tile为元素的分块矩阵。按照分块矩阵的乘法规则等同于普通矩阵的乘法规则。C的每个分块,需要64个分块矩阵的乘法操作,并将结果累加。

C的一个分块需要多少次全局内存的访问呢?重复64次,每次先分别取A和B的64*64个元素进共享内存。每个分块需要读取64*(64*64+64*64)个全局内存中的float变量;C总共有64x64个分块元素。所以总共需要读取从A、B读取     (64x64)*64*(64*64+64*64)=4096*64*2*4096=128*4906^2次个float变量。

[2*(4096^3) ] 除以 [128*4906^2],结果为64倍。也就是说,使用了tile机制,将A、B的数据读取到共享内存再计算矩阵乘法,对全局内存的访问量可以减少为原来的1/64。这将会减少程序的运行时间。让我们把这个思路实现出来,并测试对比一下运行时间。

gridDim.x=流处理器的个数,每个block一次负责一个64*64的C的分块元素的计算;从左向右,从上往下,依次迭代负责。为思考的简单起见,假设C的M和N都是64的倍数。不为倍数的时候,差不多,细节后面再补充。

猜你喜欢

转载自blog.csdn.net/eloudy/article/details/120634823