点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

作者丨LustofLife@知乎(已授权)

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

编辑丨极市平台

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

前言:

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

本文参照:

Matrix Multiplication CUDA:

https://ecatue.gitlab.io/gpu2018/pages/Cookbook/matrix_multiplication_cuda.html

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

  2. 优化策略的核心思想

  3. 例子

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

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

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

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

  8. 优化策略三:[No Bank Conflict]

  9. 优化策略四:[Computation Optimization]https://github.com/hova88/cuda-template/blob/main/src/matmul/comopt.cu

  10. 优化策略五:[Loop Unrolling]https://github.com/hova88/cuda-template/blob/main/src/matmul/unroll.cu

  11. 优化策略六:[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:https://developer.nvidia.com/discover/cluster-analysis)为大小为(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).

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

干货下载与学习

后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

后台回复:3D视觉课程,即可学习3D视觉领域精品课程

计算机视觉工坊精品课程官网:3dcver.com

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.重磅!四旋翼飞行器:算法与实战

14.ROS2从入门到精通:理论与实战

15.国内首个3D缺陷检测教程:理论、源码与实战

重磅!计算机视觉工坊-学习交流群已成立

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

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

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

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

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

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

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

  1. CUDA 并行计算优化策略总结

    作者 | LustofLife@知乎 来源 | https://zhuanlan.zhihu.com/p/297201517 编辑 | 极市平台 导读 并行计算为了提高算法运行效率,本文通过以矩阵乘法 ...

  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. 组合计数 ---- 732 Div2 D. AquaMoon and Chess
  2. 如何避免开发一款失败的产品?
  3. 大商超的2020:转型、收紧、试新
  4. kibana操作elasticsearch:修改数据
  5. SQLite.NET.0.17 的离奇之处, BUG??? BY DESIGN??
  6. shell 脚本,将/etc/目录下所有的软链接文件输出
  7. 微信小程序支付,带java源码
  8. leetcode1143. 最长公共子序列(动态规划)
  9. java 情侣最佳升高_2016年最佳情侣:显示经理和窗口经理
  10. 1,Django 基础一
  11. redis3.0伪集群安装步骤
  12. libevent源码深度剖析三
  13. 软硬件负载均衡器:F5、Array、Nginx、LVS、HAProxy
  14. 将数值位转换为字符位后输出
  15. TinyXML中文文档,TinyXPath
  16. 10款屏幕取色器/颜色拾取工具软件介绍及下载地址(附截图)
  17. 【NLP】常见的自然语言处理任务和技术
  18. html 在图片添加叉号,html5 表单输入时有个小叉号是怎么做的
  19. ggplot画世界地图
  20. Drools记录之DRL规则语言

热门文章

  1. 怎么让微信公众号更“湿”一些?
  2. 从瑞幸咖啡的“营销骗局”,详解价格锚定的多种应用
  3. 2016年创业项目-2
  4. linux关闭root权限管理,如何在Ubuntu中启用和禁用root帐户?
  5. linux多线程编程实验报告,Linux多线程编程
  6. 蜻蜓Q旗舰-含蜻蜓Q开源版系列数据字典发布-一颗优雅草科技3月15日更新发布-本文持续更新
  7. 你想学的都在这里!双非渣本Android四年磨一剑,赶紧收藏!
  8. 前端工程师如何打发闲余时光?(转)
  9. 计算机图形学 光栅化_计算机图形学中的光栅扫描和随机扫描显示
  10. java个人小管家代码_java毕业设计_springboot框架的家庭小管家系统