利用GPU改善程序性能的一点心得
1. 硬件方面
a. 流处理器个数
Gpu内部的计算单元个数,决定分析模块实时性的关键因素。
实测效果: gtx760 1152个
Gtx960 1024个
单路1080p运动检测 760的实时性好于960
b.内存到显存(北桥)传输带宽
暨pcie总线带宽, PCI-E 3.0 x16双向速度大约为32GB/s
8路1080p 25fps双向吞吐量为 3G/s, 按照理论减半原则16G/s的带宽是足够使用。
但相比现在显存的带宽达到112GB/s及以上, 所以这个北桥带宽任然是限制GPU性能主要性能瓶颈,
但是对于目前的视频实时分析系统这个带宽是足够使用的。
c. SM(流处理器组的个数)
每一个SM共用一组控制晶体管,暨该SM内所有流处理器的共用一组控制晶体管。
反映了GPU的多数据多指令能力。
Gtx760为5 gtx960为8 实测gtx960多路处理能力强于gtx760
d. 传输延时
数据从内存拷贝到显存所需要的时间。
这个从软件(Streams and Concurrency)层面可以减少延时对系统的影响。在软件层面部分做具体分析。
2. 软件层面
a. 编程API的选择1。
Cpu程序开发: 机器语言; 汇编语言; 针对硬件优化库的API(如ipp); 通用C、c++;
GPU程序开发: 机器语言; 驱动API ; 运行时API ;封装好的优化库(npp)
越高级的API开发周期越短, 但灵活性越差
用npp升级我们VA算法模块,目前只需要将相应的ipp函数替换为npp函数即可。有些ipp函数npp没有对应的实现可以利用驱动
API或者运行时API封装一个kernel函数。
b. Cuda一些特性的应用
(1) Stream的使用2
使用stream,可以从软件层面遮盖传输时延。
暨在gpu在执行计算的时候,可以同时进行数据传输,这样可以保证gpu不会因为等待数据而导致利用率的下降,从而影响系统分析实时性。图例 如下:
HD表示 host –> device 主机内存到显存的数据拷贝
DH表示 device à host 显存数据到内存的数据拷贝
K 表示 kernel函数 gpu在执行计算, 上述图表是Nsight的timeline
(2) 页锁定主机内存4
页锁定主机内存, 操作系统不会对这块内存进行分页,并交换到磁盘。 该内存会一直驻留物理内存中
GPU知道了该内存的物理地址可以利用DMA(direct memory access)控制器和主机内存复制
页锁定主机内存比可分页内存性能高2倍左右
(3) Hper-Q3
NVIDIA在开普勒架构后开始支持Hper-Q, Hper-Q支持不同流之间kernel的并发。
Gtx960支持8个stream kernel并发。
c.异构并发
主机和设备之间可以并发执行。
下面是两种pipleline的比较
同步执行:
分析一帧耗时为 T = tg + tc;
异步并发:
分析一帧耗时为 T = Max( tg , tc)
参考资料:
1 cuda应用设计与开发:方法与最佳实践。
2 INVIDA 技术开发文档:CUDA C/C++ Streams and Concurrency
3 INVIDA 技术开发文档:Hyper-Q Example
4 Cuda by example
利用GPU改善程序性能的一点心得的更多相关文章
- [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)
[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...
- [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)
[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...
- [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
- .net改善程序性能建议
对改善程序性能的建议. 文章:https://msdn.microsoft.com/zh-cn/library/ms973838.aspx
- 使用tornado的gen模块改善程序性能
之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests.但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reac ...
- Matlab优化存储器读写来改善程序性能
最近用Matlab写程序的时候终于遇到了程序执行效率的问题,于是在Google上面搜索了一篇提高代码性能的文章,简单的概括一下. 文章是通过优化寄存器读写来提高执行速度的,主要体现在三个方面: 在做循 ...
- Web标准中用于改善Web应用程序性能的各种方法总结
提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...
- 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载
您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...
随机推荐
- 部署ovf模板,突然出现用户取消任务。
查看了网上的文章,自己做了一下实验. 发觉导出ovf模板时,虚拟CDROM的选项要选[客户端设备],导入时才不会出事. 参考连接 http://lukebarklimore.wordpress.com ...
- Tomcat 中文乱码 设置UTF-8编码 问题解决办法
在Java Web开发中,http请求带有中文字符的URI如果不处理容易出现乱码问题:这是因为Tomcat容器默认编码是iso-8859-1引起的,因此要避免出现乱码就要需要做相应的处理.解决办法如下 ...
- yii CComponent组件 实例说明1
yii CComponent组件 实例说明 yii中的module,controller都是CComponent的子类,可以说yii的架构基石就是依托在CCompnent基础上的,这里研究下CComp ...
- Windows 10 设置 Java 环境变量
首先你需要在我的电脑中打开,找到环境变量属性. 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面. 在这个界面中设置高级系统设置. 环境变量 在弹出的界面中选择设置环境变量. 系统变量 ...
- 『OpenCV3』简单图片处理
cv2和numpy深度契合,其图片读入后就是numpy.array,只不过dtype比较不常用而已,支持全部数组方法 数组既图片 import numpy as np import cv2 img = ...
- 『Sklearn』数据划分方法
原理介绍 K折交叉验证: KFold,GroupKFold,StratifiedKFold, 留一法: LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,Lea ...
- 关于二级指针的使用(使用node指针建树)
struct node { int v; node *l,*r; }*p; 使用二级指针建树的话,如果p是非全局变量且一开始没有指向变量的话递归建树时必然要传递参数,但是如果只是简单的build(no ...
- SQL调优(SQL TUNING)之远程支持完成性能大幅优化
前几天,一个朋友找到我,说一个SQL性能有问题,看看能不能优化,下面为过程: 雪豹 9:35:10 在吗 兰花岛主 15:07:39 忙忘了,有事儿? 雪豹 15:07:49 嗯 雪豹 15:07:5 ...
- BZOJ1461 字符串的匹配
什么字符串...明明是两个数列... 分类上来讲,还是一道很好的noip题...(雾) 首先,kmp会不会?(答:会!) 其次,树状数组求顺序对会不会?(再答:会!) 讲完了!>.< 进入 ...
- cas 服务端认证流程
CAS服务端流程分析 'CAS单点登录服务器端的登录流程' -----流程的配置在/WEB-INF/login-webflow.xml文件中 <var name="credential ...