六 GPU 并行优化的几种典型策略
前言
如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题。本文将提供几种优化的思路,为程序并行优化指明道路方向。
优化前准备
首先,要明确优化的目标 - 是要将程序提速 2 倍?还是 10 倍?100倍?也许你会不假思索的说当然是提升越高越好。
但这里存在一个优化成本的问题。在同样的技术水平硬件水平下,提升 2 倍也许只要一个下午的工作量,但提高 10 倍可能要考虑到更多的东西,也许是一周的工作量。提高 100 倍, 1000 倍需要的成本,时间就更多了。
然后,需要将这个问题进行分解。通常来说先对数据集进行分解,然后将任务进行分解。这里要从数据集这样的矩阵角度来分析数据,将输入集和输出集中各个格点的对应关系找出来,然后分派给各个块,各个线程。
策略一:识别代码中的瓶颈所在
分析程序效率的瓶颈所在一方面靠的是分析。这种方式对于代码结构比较简单的程序非常有用,但对于实际应用中的复杂项目,人脑分析往往会导致错误的结论 - 也许你费尽心思想出来了瓶颈,然后对它做了优化,之后却发现效率仅仅提升了 1%。
因此更有效的方法是使用分析工具来找出瓶颈,可以使用 CUDA Profiler 或者 Parallel Nsight。
使用 Parallel Nsight 分析并行程序的方法请参考我的这篇文章:(准备中...)
还有一点要特别说明的是,在 GPU 进行数据处理的时候,CPU 可以考虑做点别的事情,比如去服务器取数之类的,这样就将 CPU 并行和 GPU 并行结合起来了,程序效率自然会大大提高。
策略二:合理的利用内存
首先,要灵活的使用显卡中的各类内存结构,如共享内存,常量内存等。特别要注意共享内存的使用,它的速度可是接近一级缓存的。
此外,必要时对多个内核函数进行融合。因为这样可以避免启动新的内核函数时需要进行的数据传递问题,还可以重用前面的任务遗留下的一些有用的数据。不过,如果是对别人写的多个内核函数进行融合的话,一定要注意其中隐含的同步问题 - 上个内核函数的代码彻底执行完毕之后,下个内核函数才会开始执行。
然后,对于数据的访问应该采取合并访问的方式 - 尽量使用 cudaMalloc 函数。一次访问的数据应当大于 128 字节,这样才能充分地利用显卡的带宽。
策略三:传输过程的优化
前面的文章已经提到过很多次了,数据在内存和显存之间进行交换是非常费时的。
对于这样的问题,首先我们可以以锁页内存的方式使用主机端内存。所谓锁页内存,是指该区域内存和显卡的传递不需要 CPU 来干预,如果某区域不声明为锁页内存,那么在内存往显存中或者显存往内存中传递数据前,会发生一些开销不小的锁定操作(表示该区域内存正在和显存发生数据传递,CPU勿扰)。
使用方法是调用 cudaHostAlloc 函数。这个函数的功能不单单是声明锁页内存那么简单。通过设置函数的参数,该函数还能实现很多非常实用的功能,个人非常推荐。
然后,还需要重点推荐的是零复制内存。它是一种特殊的锁页内存,一种特殊的内存映射。它允许你将主机内存映射到 GPU 的内存空间。如果你的程序是计算密集型的,那么这个机制就会非常有用,它会自动将数据传输和计算重叠。具体用法请参考我的这 篇文章。
策略四:线程结构布局的优化
建立科学的计算网格,通过设定合适的维数,块数,以及块内线程数来尽量实现合并的内存访问,保证最大的内存带宽。
要学会灵活使用多维度的计算网格,而不是仅仅局限于一维。多维计算网格的使用请参考我的这篇文章。
尤其在单维度的块数受到限制的时候,多维网格就必须被考虑进来了。
策略五:从算法本身进行任务级的分解
将算法的步骤分解各个不相关的部分,步骤内采用GPU并行,这几个步骤则采用CPU并行。
策略六:灵活使用 CUDA C 的一些库还有 API
CUDA C 提供了很多实用的 API,且提供相当多的C++支持 (非全部)。能大大地提高开发效率。如原子操作函数等等,很方便。
CUDA 提供了许多实用的库:如 cuBlas cuSparse等,不在此一一介绍。尤其是 Thrust 库,简直就是 STL 的并行实现,拿来直接用非常方便。
小结
优化思路可以说是 CUDA 并行编程最为核心,也是最为关键所在。
本文仅仅是提供优化的总体策略和思路,至于具体的实现方法,请参考相关资料实现之。
六 GPU 并行优化的几种典型策略的更多相关文章
- 第六篇:GPU 并行优化的几种典型策略
前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...
- 使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- 第七篇:使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- App架构师实践指南六之性能优化三
App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190 内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...
- GPU 编程入门到精通(四)之 GPU 程序优化
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- 工程能力UP | LightGBM的调参干货教程与并行优化
这是个人在竞赛中对LGB模型进行调参的详细过程记录,主要包含下面六个步骤: 大学习率,确定估计器参数n_estimators/num_iterations/num_round/num_boost_ro ...
- [源码解析] PyTorch分布式优化器(2)----数据并行优化器
[源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...
- 五 浅谈CPU 并行编程和 GPU 并行编程的区别
前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...
- GPU 编程入门到精通(五)之 GPU 程序优化进阶
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...
随机推荐
- windows下mysql主从同步备份步骤
目的:有两台MySQL数据库服务器A和B,使A为主服务器,B为从服务器,初始状态时,A和B中的数据信息相同,当A中的数据发生变化时,B也跟着发生相应的变化,使得A和B的数据信息同步,达到备份的目的. ...
- jsp标签之<%%>和<%!%>
<%! %>中声明的是全局变量,不过写前面最好<% %>中声明的是局部变量.<%=%>一般表达式,输出某一变量的值.例如:<%! String totalSt ...
- [Jquery]焦点图轮播效果
$(function(){ var $next=$(".right"); var $prev=$(".left"); var $list_nu ...
- 凸多边形的三角剖分(dp好题)
[题目描述]给定一具有N个顶点(从1到N编号)的凸多边形,每个顶点的权均已知.问如何把这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权的乘积之和最小?[输入格式]第一行 顶点数N(N ...
- Phonebook 导入SD上的.vcf联系人
2014-01-11 17:29:22 1. 当用户选择Phonebook中从SD卡导入联系人的操作后,程序回调转到ImportVCardActivity,然后用户选择好要导入的.vcf文件,并点击“ ...
- 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码
转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...
- IT公司100题-1-二叉树转换为双链表
问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14/ \ / \4 8 1 ...
- HDU 5353
题目大意: 相邻的朋友可以给出自己手上最多一颗糖,n个朋友形成一个环,问给的方式能否最后使所有朋友都糖的数量相同 这里我用的是网络流来做的,这里n=100000,用sap的模板可以跑过 #includ ...
- 基于K2的集成供应链流程解决方案
基于K2的集成供应链流程解决方案http://www.k2software.cn/zh-hans/scm-solution 一.详细功能模块 需求管理模块多渠道管理.需求计划.需求感知与传递市场营销及 ...
- c# 读取excel 出现数字读取成“”空
读取excel用到的方法: /// <summary> /// Excel导入数据源 /// </summary> /// <param name="sheet ...