实现算法并行是第一步,但是后续的优化会大幅度影响算法运行速度,这里讲一些可以后续优化的点。GPU优化比较麻烦的是,不一定优化会起作用,因此要把所有方法都试一遍,才能知道是(优化前,优化A,优化B ...)那种最适合自己的问题

参考学习视频

链接:https://pan.baidu.com/s/1NlFZS2EHdY86z09AlR41Jg 
提取码:1234

1.warm up

第一次运行程序可能由于GPU没有完全启动,导致时间过慢,可以在程序开始中加一个空转函数,这个函数不计时,让GPU完全运转。

如果是科研的话,可以取第二次以后的实验结果,基本比较稳定。

2.内存速度

常量内存constant > 共享内存shared > 全局内存global

常量内存类似于c++ const,但是太小了,很多时候要经常访问的数据量很大,放不进去,有时候放进去,有时候放进去了,但是速度也没有明显提升。

这里说的明显是多次运行程序没有明显提升,例如优化前5次:10.9s,10.1s,10.3s,10.2s,10.4s。优化后5次:10.8s,10.2s,10.1s,10.0s,10.1s。第一次时间长是没有warm up,应该从第2次计算。这个优化效果其实不太明显,如果放在科研里,不能算加速,但是工程中可能算大概5%的加速吧

下面一个简单的例子,展示共享内存的简单用法,x拷贝到共享内存中,做乘2处理,实际可能更加复杂,然后拷贝给y。共享内存还可以动态分配,在<<<>>>的第三个参数中。速度有可能会更快,可以试试,也是不一定。

__global__ func(int *x, int *y){__shared__ int s[10];int id = threadIdx.x;if(id >= N)return;s[id] = x[id];//一些处理后,将s拷贝给ys[id] = s[id] * 2;__syncthreads ();y[id] = s[id];
}

局部内存local > 共享内存shared > 全局内存global

__global__ func(int *x, int *y, int *z){__shared__ int a, b, c;int m, n, p;n = p;//1a = b;//2a = *x;//3*x = *y;//4
}

运行速度为1,2,3,4代码中比较直观,不再赘述。

全局内存的问题:内存合并

每次读取全局内存的时候,是安装一个内存块读的,例如图中虚线框,如果图中连续4个红色点,在一个内存读取块中(这里也假设一个内存读取块大小为5),所以只需要读取一次,然后后边黑色点距离比较远,要读取两次,那显然第一个速度要更快。

但是实际遇到问题中,还必须用第二种的方式计算,所以有时候也没办法,或者有更好的优化方法要学习。

原子操作

原子操作会保证正确性,但降低运行速度,但有时又不一定会降低运行速度。

例如计算出的结果中0比较多,也就是结果比较稀疏,如果最后几十万个数据归约,有时候效果并不一定好。这时判断if(num > 0) 原子加,可能更好,虽然理论上if会导致条件分支(如下图所示,条件分支导致一些线程要等待其他线程),导致性能变差,但是实际效果可能会不错,要试试。还是那句话,GPU优化要试,不一定那种比较好,《cuda c编程》也说了类似观点。

扫描算法,柱状图,排序

扫描算法实现比较复杂,可以直接用thrust库,thrust库还有一些例如排序算法,如果数据不大,例如几万以内的就不要用扫描排序了,可能还会更慢,这里慎重使用GPU优化,一般数据量真的没几千万,几个亿的,提升效果其实不明显的 。

柱状图类似扫描。

流水线

三个操作

H2D:CPU传到GPU

KER:GPU上的计算

D2H:GPU传到CPU

Stream1:H2D -> KER -> D2H

Stream2:             H2D -> KER -> D2H

Stream3:                          H2D -> KER -> D2H

<<<>>>中第四个参数,应用于频繁需要CPU,GPU之间交流的程序,如果需要CPU串行的计算很多,则需要使用流水线,但是如果串行不多,可以把数据全部放到GPU处理,虽然GPU处理串行能力较差,但是如果数据不多,影响就会很小,而且减少了CPU和GPU的数据交换和同步,运行时间也有大幅度缩减。但是目前没有实际操作过这个。

shared线程发散

这个实际使用真的不好解决,除了归约,目前没见过其他应用,有待进一步学习

并行那些部分,需要很多优化么?

先用计时器计算算法每个模块的运行时间,并行运行时间最长的几个模块,如果有需要则全部并行,然后再去想优化,因为优化幅度20%,30%,可能不如多并行几个耗时长的模块来的有效。就算是O(n*n)->O(logn)也是可以的

block,thread分配数量?

以1080ti为例,每个块中线程数量最多1024,block的分配数量可以非常多,因此,每个block中的块测试32,64,128,256,512,1024分别测试,不一定哪一个好,但是会有一个最好的结果,还有就是一维度,二维度,都实验。例如并行2048个计算使用block(8),thread(16*16)。

GPU编程个人入门(中)相关推荐

  1. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  2. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

  3. GPU 编程入门到精通(四)之 GPU 程序优化

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

  4. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  5. GPU 编程入门到精通(二)之 运行第一个程序

    博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  6. GPU 编程入门到精通(一)之 CUDA 环境安装

    GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia GPU 编程入门到精通(一)之 CUDA 环境安装 标签: cudagpunvidia 2014-04-11 2 ...

  7. pdf python 3.7编程快速入门 潘中强_无python基础,这些书籍可以帮您快速入门。

    利用Python进行数据分析> 定 价:119 元 作者:韦斯·麦金尼(Wes McKinney)著;徐敬一译 ISBN:9787111603702 出 版 社:机械工业出版社 学习Python ...

  8. Metal:对 iOS 中 GPU 编程的高度优化的框架

    原文出处: Max Christ and Warren Moore   译文出处:migrant   欢迎分享原创到伯乐头条 Metal 框架支持 GPU 加速高级 3D 图像渲染,以及数据并行计算工 ...

  9. 《Linux C编程从入门到精通》》一2.4 Linux中的调试环境gdb

    本节书摘来自异步社区<<Linux C编程从入门到精通>>一书中的第2章,第2.4节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

最新文章

  1. 显示来自多个表的数据——JOIN
  2. Windows核心编程 第九章 线程与内核对象的同步(下)
  3. python二:注释
  4. django链接mysql网页显示数据_使用Django连接mysql数据库并显示在网页上
  5. 计算机科学与技术创新实验班是什么意思,计算机科学与技术系成立2010级创新实验班(图)...
  6. Oracle CheckPoint进程
  7. C++学习——string
  8. Web Hacking 101 翻译完成
  9. 深度学习(目标检测。图像分割等)图像标注工具汇总
  10. java的酒店房间管理系统
  11. steam移动所有文件至新库文件夹失败_VBA进阶 | 文件操作17:File对象与Files集合详解...
  12. 实现跨word文档的格式刷,两个word间格式刷
  13. 计算机键盘和指法练习实验报告模板,实验报告总结怎么写
  14. 动环监控系统的监控对象有哪些?动环监控系统作用
  15. neo4j-入门---学习复杂关系使用CQL语句操作图数据库(二)
  16. 北森招股书:赛道优势凸显,一体化+中大客户是加分项
  17. [区块链安全-Ethernaut]附加GoodSamaritan解题思路
  18. 10.3 配置前缀列表
  19. win10经常无法复制粘贴
  20. 移动电源给路由器供电

热门文章

  1. 【四足机器人】从零开始搭建四足机器人mini cheetah仿真环境(零)准备工作
  2. win10资源管理器右键没有映射网络驱动器
  3. java基本类型和包装类型的区别
  4. CentOS配置域名转发服务器 FAQ
  5. php qq接收不了,PHP-利用curl 与php实现qq挂机遇到不能下线问题
  6. mysql 中的三元运算
  7. Graph Wavenet 学习笔记
  8. python计算菜单消费总额字典_用Python中的字典来处理索引统计的方法
  9. Jmeter参数化四种方式
  10. Python 散点图 回归拟合 带误差 各参数详解(2)