您的位置:首页 > 其它

利用GPU改善程序性能的一点心得

2015-08-07 15:57 176 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: