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

本文探讨了如何通过CUDA中的tiling技术优化矩阵乘法,将全局内存访问次数减少到原来的1/64。通过将矩阵划分为64x64的tile,每个GPU block负责计算C的一个分块,从而减少了内存访问次数,提高了计算效率。实验以4096x4096的矩阵为例,展示了tiling方法在并行计算中的应用。
摘要由CSDN通过智能技术生成

下面我们仅仅引入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的倍数。不为倍数的时候,差不多,细节后面再补充。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值