利用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不会因为等待数据而导致利用率的下降,从而影响系统分析实时性。图例                             如下:

利用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的并发。

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

Gtx960支持8个stream kernel并发。

  c.异构并发

主机和设备之间可以并发执行。

下面是两种pipleline的比较

同步执行:

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

分析一帧耗时为   T = tg + tc

                     异步并发:

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

分析一帧耗时为   T =  Max( tg , tc

参考资料:

1 cuda应用设计与开发:方法与最佳实践。

2 INVIDA 技术开发文档:CUDA C/C++ Streams and Concurrency

3  INVIDA 技术开发文档:Hyper-Q Example

  4  Cuda by example

上一篇:IOS Crash捕获


下一篇:Jenkins - Linux下启动Jenkins报错hudson.WebAppMain#contextDestroyed: Shutting down a Jenkins instance that was still starting up