每日视讯:深入浅出GPU优化系列:GEMM优化(二)
编辑:王佩
这篇文章的主要目的是让读者尽可能地理解GEMM优化的技巧,所以代码尽可能地通俗易懂。在兼顾易读性的同时,代码有不错的性能表现,在1024-4096的矩阵上平均能够达到cublas 91%的性能表现。
本篇文章主要分四部分进行讲述。第一部分是GEMM算法的概述,先让大家大概地了解代码在做什么事情。第二部分就是详细的代码解析,带着大家一行一行地来看。第三部分是实验结果,主要是和cublas的对比。第四部分是总结。
(资料图片)
一、GEMM算法概述
这个章节里主要来说一下GEMM的一个计算流程,其实这一点已经在GEMM优化(一)中提及。但上一篇文章主要说得是原理,关于具体计算逻辑,还是不太直观,所以我们在这里再提一下。然后这个具体的计算逻辑分为两个阶段介绍,分别是不采用数据预取和采用数据预取,这主要是考虑到直接说数据预取,有读者可能会看得云里雾里,比较难受,所以先把不采用数据预取这个内容说明白,然后再来讲这个数据预取。
1.1 不采用数据预取
随后再具体看看每一个大迭代中,block中的线程的计算逻辑。在进行一个大迭代时,shared memory中有128×8=1024个A矩阵元素和8×128=1024个B矩阵元素。随后,每个线程需要进行8次迭代,我们把这个迭代成为小迭代。bk=8,所以有8次小迭代。每一次小迭代中,每个线程需要从shared memory中拿到A矩阵的一小列和B矩阵的一小行,即8个A的元素和8个B的元素。线程将这8+8=16个元素放置在寄存器中。每个线程需要负责8×8=64个元素的计算,一共会产生64条FFMA指令。小迭代示意图如下:
1.2 采用数据预取
二、GEMM代码解析
2.1 参数说明
template < const int BLOCK_SIZE_M, // height of block of C that each block calculate const int BLOCK_SIZE_K, // width of block of A that each block load into shared memory const int BLOCK_SIZE_N, // width of block of C that each block calculate const int THREAD_SIZE_Y, // height of block of C that each thread calculate const int THREAD_SIZE_X, // width of block of C that each thread calculate const bool ENABLE_DOUBLE_BUFFER // whether enable double buffering or not >
// shared memory __shared__ float As[2][BLOCK_SIZE_K][BLOCK_SIZE_M]; __shared__ float Bs[2][BLOCK_SIZE_K][BLOCK_SIZE_N]; // registers for C float accum[THREAD_SIZE_Y][THREAD_SIZE_X] = {0}; // registers for A and B float frag_a[2][THREAD_SIZE_Y]; float frag_b[2][THREAD_SIZE_X]; // registers load global memory const int ldg_num_a = BLOCK_SIZE_M * BLOCK_SIZE_K / (THREAD_NUM_PER_BLOCK * 4); const int ldg_num_b = BLOCK_SIZE_K * BLOCK_SIZE_N / (THREAD_NUM_PER_BLOCK * 4); float ldg_a_reg[4*ldg_num_a]; float ldg_b_reg[4*ldg_num_b];
// threads number in one row const int A_TILE_THREAD_PER_ROW = BLOCK_SIZE_K / 4; const int B_TILE_THREAD_PER_ROW = BLOCK_SIZE_N / 4; // row number and col number that needs to be loaded by this thread const int A_TILE_ROW_START = tid / A_TILE_THREAD_PER_ROW; const int B_TILE_ROW_START = tid / B_TILE_THREAD_PER_ROW; const int A_TILE_COL = tid % A_TILE_THREAD_PER_ROW * 4; const int B_TILE_COL = tid % B_TILE_THREAD_PER_ROW * 4; // row stride that thread uses to load multiple rows of a tile const int A_TILE_ROW_STRIDE = THREAD_NUM_PER_BLOCK / A_TILE_THREAD_PER_ROW; const int B_TILE_ROW_STRIDE = THREAD_NUM_PER_BLOCK / B_TILE_THREAD_PER_ROW;
2.2 大迭代前预取数据
迭代前预取数据分为两个部分,第一个部分是将第一个大迭代的数据从global 预取到shared memroy中。第二个部分是将shared memory上的数据预取到寄存器中。先来看看第一个部分。这里面分别是将第一个大迭代中需要的A、B数据预取到shared memroy中。对于A矩阵而言,这个for循环代表着block中的线程需要搬运多少次才能将globa中的数据放到shared memory中。由于A需要先进行一次转置,所以先将数据先放置在寄存器中。数据按行取,然后按列存。对于B矩阵而言,数据不用转置,直接按行取,按行存。当然,这个过程中间也要经过寄存器,但是没有写出来的必要了。
然后就是第二个部分。将shared memory中的数据存到寄存器中。一共需要取THREAD_SIZE_Y个数,每次取4个数。这个倒没有什么好说的。
2.3 大迭代逻辑
2.4 大迭代详细解析
随后进入到小迭代的计算逻辑之中,load_stage_idx参数代表需要从As的哪个空间进行读数。然后是BLOCK_SIZE_K-1次小迭代。按照前面的参数配置,即需要在这里完成7次小迭代。由于在小迭代中也采用了双缓冲的方式,需要将下一轮小迭代的数据提前写入到寄存器中,这个过程需要对shared memory访存,会稍微慢点。与此同时,线程需要计算更新THREAD_SIZE_X x THREAD_SIZE_Y=8×8=64个C矩阵元素的结果。
而后需要将存储在临时寄存器的数据搬运到shared memory中。由于A矩阵需要经过一次转置,所以和B矩阵有一点不一样。
最后完成寄存器的预取,并将最后一个小迭代完成。
2.5 计算结果写回
三、实验
2.bm、bn、bk、rm、rn等相关参数对GEMM的性能表现有多大影响?
最后代码链接在下方:
《GPU优化教程系列》是澎峰科技收集、整理、创作的一个公益系列课程,已经完成的课程如下:
标签:
精彩推送
新闻快讯
X 关闭
X 关闭
新闻快讯
- 每日视讯:深入浅出GPU优化系列:GEMM优化(二)
- 当前速看:6月14日基金净值:南方中证科创创业50ETF最新净值0.5612,跌0.55%
- 环球消息!电脑怎么下载软件_怎么在电脑上下载软件
- 波兰总统杜达与乌克兰总统泽连斯基举行电话磋商
- 还有比东北爷们更爷们的人吗?_有比东北爷们儿更爷们儿的吗_全球简讯
- 世界短讯!唐代刺史是什么官职?(精选5条)
- 观察:赖氨葡锌颗粒的作用功效_赖氨葡锌颗粒的作用
- 中国科大研究团队防火阻燃技术实现重大突破
- 口底癌早期症状
- 中国宝武钢铁集团董事长、党委书记调整
- 【天天新视野】长实集团(01113)6月14日斥资6303.6万港元回购141.65万股
- CQF考试没通过怎么办?
- 世界速递!英迈中国(英迈m500)
- 潜山市潘铺初中举行2023年中考考前心理辅导暨诚信教育大会 快报
- 天天观察:吉林蛟河市法学会:送法进社区,普法入民心
- 全新BMW5系和全电动BMWi5亮相
- 服务城市公共安全,成都高新城安科技有限公司成立
- 陇县召开河长制、农村安全饮水暨山洪灾害防御培训会
- 经开区企业中交西筑喜获“标准应用示范项目单位”称号
- 嘉定区气象局发布大风蓝色预警【Ⅳ级/一般】【2023-06-14】
- 当前最新:月湾辟地山中诛茅归隐怡如赋诗次韵赞决(对于月湾辟地山中诛茅归隐怡如赋诗次韵赞决简单介绍)
- 头条:贸发局修订今年香港出口增长预测至0%至2%
- 中国铁路广州局集团有限公司广州机务段被约谈 环球微资讯
- 夫妻宫有禄存不好的吗 有禄存什么意思
- 四川天府新区第二小学三大球联赛圆满落幕
- 工行北京自贸试验区国际商务服务片区支行:深耕高质量金融服务,在区域发展中主动担当作为
- 北约举行“最大规模”空中军演 示威者抗议:或致乌克兰危机升级!
- 兴业银行南宁分行:金融“输血”助力高新技术企业发展_即时焦点
- u盘安装盘制作双系统-(u盘制作双系统怎么安装教程)
- 天天观焦点:174元/碗!燕之屋弃A赴港再战IPO,三年广告费8个亿
- 小米 4参数_小米4c手机参数
- 短讯!photoshop清理暂存盘 不能初始化photoshop因为暂存盘已满
- 动词有哪些英文(动词有哪些)-今日视点
- 天天即时看!江苏新动力沭北热电有限公司_关于江苏新动力沭北热电有限公司简述
- 小鹏汽车-W(09868.HK):6月13日南向资金增持363.15万股
- 商家如何投诉淘宝小二处理不公平(如何对淘宝小二进行投诉以及投诉方式)
- 九江论坛网站_九江论坛网
- 晶科科技: 关于召开2023年第三次临时股东大会的通知
- 当前视讯!邓伟后勤医院主任医师简介
- 全球热讯:用“工业锅”炒好预制大菜:让家乡味道飘向远方
- 三连板飞龙股份:5月汽车产销量及出口数据 同比均实现增长|世界观察
- 爱吾游戏盒子电脑版官网_游民星空游戏盒子下载电脑版
- 远景发布零碳行动报告,承诺2028年实现价值链碳中和
- 唇纹怎么消除最快_唇纹怎么消除
- 金塔县:文旅“张弓满弦”且以诗意共远方|当前快报
- 【全球时快讯】【收评】6月13日燃油主力合约FU2309下跌1.84%
- 世界关注:注意防范!郑州市气象台发布高温橙色预警信号
- 反渗透膜碱性清洗剂商品报价动态(2023-06-13)
- 房产中介:和同事成为知心搭档,赚了更多钱,家人对我的态度很差 世界动态
- 熊市是什么表现_熊市是什么意思|报资讯