利用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

posted @ 2015-08-07 15:57  书侍  阅读(6111)  评论(0编辑  收藏  举报