作者 | LustofLife@知乎

来源 | https://zhuanlan.zhihu.com/p/297201517

编辑 | 极市平台

导读

并行计算为了提高算法运行效率,本文通过以矩阵乘法(C = A * B)的各种实现思路以及优化方法总结为例子,过一遍cuda的几个基础优化策略。

本文脉络

  1. 关于矩阵乘法的问题描述 关于矩阵乘法的问题描述

  2. 优化策略的核心思想

  3. 例子

  • CPU上的代码实现:https://github.com/hova88/cuda-template/blob/main/src/matmul/naive.cu

  • GPU上的代码实现:https://github.com/hova88/cuda-template/blob/main/src/matmul/naive.cu

  • 优化策略一:https://github.com/hova88/cuda-template/blob/main/src/matmul/tiling.cu

  • 优化策略二:https://github.com/hova88/cuda-template/blob/main/src/matmul/coalescing.cu

  • 优化策略三:No Bank Conflict

  • 优化策略四:https://github.com/hova88/cuda-template/blob/main/src/matmul/comopt.cu

  • 优化策略五:https://github.com/hova88/cuda-template/blob/main/src/matmul/unroll.cu

  • 优化策略六:Prefetching

1 关于矩阵乘法的问题描述

参照NVIDIA官网教程——https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/

首先解决矩阵乘法问题更具体来说是解决GEMM(GEneral Matrix to Matrix Multiplication,通用矩阵乘法)问题。即C=αA*B+βC。其中ABC是矩阵。A是M×K矩阵,B是K×N矩阵,C是M×N矩阵。为了方便说明,后续的例子中假设标量alpha=beta=1。

那么如何更高效的进行GEMM呢?

2:优化策略的核心思想

  • 1.减小缓存(cached)

  • 2.使写入速度跟上指令的计算速度

对于GEMM计算,最直接的想法就是loop,elements相乘再相加

for (int i = 0; i < M; ++i)                   //---->遍历A的行,行id记做ifor (int j = 0; j < N; ++j)               //---->遍历B的列,列id记做jfor (int k = 0; k < K; ++k)            //---->在行列i,j确定的前提下,进行对应元素的 相乘 和 加和 ,元素id记做k C[i][j] += A[i][k] * B[k][j];     //---->最后输出到C的第i,j个元素

对于M=N=K的大型方阵,矩阵乘积中的数学运算数为O(N^3),而所需的数据量为O(N^2),从而产生N阶的计算强度。然而,利用理论计算强度(heoretical compute intensity)需要将重复使用每个元素O(N)。但是,上面的内积算法依赖于缓存(fast on-chip caches)中保存一个大的工作集,这会导致随着M、N和K增长时,CPU需要来回搬运数据,会累的要死。(不符合减小缓存的思想)

PS:一般来说,求两矩阵内积,K的维度数要远大于N,M(例如SVM中的核函数技巧),所以将大计算量的K维放在内循环不是一个聪明的决定。

一个更好的公式是通过构造K维上的循环作为最外层的循环来置换循环嵌套。这种形式的计算一次加载a列和B行,计算其外积,并将此外积的结果累加到矩阵C中。此后,a列和B行的结果将不再使用。

for (int k = 0; k < K; ++k)     // K dimension now outer-most loopfor (int i = 0; i < M; ++i)for (int j = 0; j < N; ++j)C[i][j] += A[i][k] * B[k][j];

更进一步思考,如何进一步减少寄存空间的缓存大小?

上述方法的一个问题是,它要求矩阵C的所有M-by-N元素都是激活的,以存储每个乘法累加指令的结果。这样很难保证内存中的写入速度能够跟上CPU中的计算速度。

而如何去使得内存的写入速度与计算乘法累加指令的速度一样快呢?

-- 采用分块(Tile)的策略

重点来了,

首先 ,我们可以通过将矩阵C的工作空间Partitioning为大小为(M*tile-by-N*tile)的Tile来矩阵C的工作空间大小(the working set size of C), 这些Tile的大小需要与存储器(on-chip memory)相适应。

然后,我们将用外积代替内积的策略应用到每一块Tile上。就像以下循环嵌套这样。

for (int m = 0; m < M; m += Mtile)                // iterate over M dimensionfor (int n = 0; n < N; n += Ntile)            // iterate over N dimensionfor (int k = 0; k < K; ++k)       //----> like above examplefor (int i = 0; i < Mtile; ++i)       // compute one tile for (int j = 0; j < Ntile; ++j) {int row = m + i;int col = n + j;C[row][col] += A[row][k] * B[k][col];}

对于C上的每一块Tile,都只取了一次A和B中的Tiles,使其达到*O(N)*的计算强度。示意图就类似下面这样。(如果对 global memory / shared memory / register file/ SM cores 不太清楚的话,还是建议好好研究研究一下,对后续的优化策略理解很有帮助!)

对于GPU来说,The size of each tile of C may be chosen to match the capacity of the L1 cache or registers of the target processor, and the outer loops of the nest may be trivially parallelized. This is a great improvement !

Here, you can see data movement from global memory to shared memory (matrix to thread block tile), from shared memory to the register file (thread block tile to warp tile), and from the register file to the CUDA cores for computation (warp tile to thread tile).

参考链接

Matrix Multiplication CUDA——https://ecatue.gitlab.io/gpu2018/pages/Cookbook/matrix_multiplication_cuda.html

本文仅做学术分享,如有侵权,请联系删文。

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

CUDA 并行计算优化策略总结相关推荐

  1. CUDA|并行计算优化策略

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨LustofLife@知乎(已授权) 来源丨https://zhuanlan.zhihu.co ...

  2. 推荐CUDA程序优化的15个策略

    推荐CUDA程序优化的15个策略 0条评论 2011-07-06 09:48   来源:潇湘学子岳麓生的博客 作者: 潇湘学子岳麓生 编辑: 王玉圆 [IT168 技术]在<CUDA程序优化策略 ...

  3. CUDA: 程序优化的15个策略

    在<CUDA程序优化策略>这篇文章中,我们介绍过CUDA优化的常见策略.今天我们会对CUDA优化策略进行详细讲解.具体策略如下: 1. memory coalescing,保证内存融合.因 ...

  4. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略

    李钰 摘要:在计算机编程中,合理地运用数学算法所拥有的优势不但可以完好地针对所拥有的问题进行总结分类归纳,还可以将其归纳作为基础从而进行针对性的统一计算,并且能够将非常复杂的问题进行整体的简化并且将其 ...

  5. 一文读懂云渲染“串流”全链路时延及优化策略

    ​这是一个让云游戏完美起步的时代. 云游戏作为产业内近年来炙手可热的话题,具有"云端运行.超高清.零延时.即点即玩"等众多特性. 随着 5G 时代的到来,以及中心云能力下沉至边缘云 ...

  6. 【《Real-Time Rendering 3rd》 提炼总结】(十二) 渲染管线优化方法论:从瓶颈定位到优化策略

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处.   文章链接: https://zhuanlan.zhihu.com/p/32928016 这是一篇很特殊的文章.它将会是这个系列文章主线 ...

  7. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(十二) 渲染管线优化方法论:从瓶颈定位到优化策略

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处.   文章链接: https://zhuanlan.zhihu.com/p/32928016 这是一篇很特殊的文章.它将会是这个系列文章主线 ...

  8. CUDA 并行计算 机器学习 NVCC CUDNN CUDATOOLKIT CUDA DRIVER 显卡驱动(NVIDIA Driver) 显卡(GPU)

    微信公众号: 点击蓝色字体小白图像与视觉进行关注 关于技术.关注yysilence00.有问题或建议,请公众号留言 整理知识,学习笔记 发布日记,杂文,所见所想 CUDA 并行计算 机器学习 NVCC ...

  9. 亿级PV,常见性能优化策略总结与真实案例

    作者:晓明 来自:美团技术团队 0 题记 美团网是国内最大的O2O服务平台,虽然经常面临高并发.大流量等问题,但在用户体验优化上美团APP仍被众多IT同行所推崇,他们在性能优化方面积累的宝贵经验尤其值 ...

最新文章

  1. PARAMETERS 指令
  2. Oculus不准备出席E3了!这是要搞事情?
  3. 华为合作oppovivo小米鸿蒙,华为鸿蒙成功的关键:要让小米、OPPO、VIVO都用上鸿蒙...
  4. Python3编码与转码
  5. 使用Java 8 Lambda清理JUnit Throwable-Tests
  6. 160 - 28 CoSH.2
  7. 在Arcgis中更改图层的坐标系
  8. DataGridView绑定null后再次绑定DataSource列标题成英文
  9. 什么相片可以两张弄成一张_ps怎么把两张图片合成一张
  10. stm32f103移植ucosIII系统
  11. FPGA Vivado设计流程
  12. 祖国(或以梦为马) 海子
  13. EJB基础三 有状态EJB
  14. p2p网络实现(C++)
  15. 2021杭州·云栖大会来了!门票免费预约
  16. TypeScript Mixins 混入
  17. python画图入门例子
  18. 使用UE4模拟冲击力
  19. QT-桌面电子白板程序
  20. Django view(视图)

热门文章

  1. CentOS7下配置bacula-web
  2. MySQL的编译安装
  3. 运维学习之nfs系统文件服务
  4. 常见的块状和内联元素
  5. 虚拟化---简单高效的IT管理模型
  6. 《走出软件作坊》书评活动图书奖品名单
  7. 微软开放 .NET 框架源代码
  8. 异地多活实践与设计思考点归纳
  9. 架构与思维:系统容量设计
  10. 京东热点key探测系统发布,单机 QPS 提升至 37 万