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改善程序性能的一点心得的更多相关文章

  1. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  2. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  3. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  4. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  5. .net改善程序性能建议

    对改善程序性能的建议. 文章:https://msdn.microsoft.com/zh-cn/library/ms973838.aspx

  6. 使用tornado的gen模块改善程序性能

    之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests.但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reac ...

  7. Matlab优化存储器读写来改善程序性能

    最近用Matlab写程序的时候终于遇到了程序执行效率的问题,于是在Google上面搜索了一篇提高代码性能的文章,简单的概括一下. 文章是通过优化寄存器读写来提高执行速度的,主要体现在三个方面: 在做循 ...

  8. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

  9. 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载

    您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...

随机推荐

  1. codeforces 555c// Case of Chocolate// Codeforces Round #310(Div. 1)

    题意:直角边为n的网格巧克力,一格为一块,选择斜边上一点,从左或上吃,直到吃到空气,称为一次操作.给出几个操作,问各能吃几块.如果x是当前要吃的横坐标,在已经吃过的中找x1>=x的第一个x1,即 ...

  2. 1 python基础知识

    一.python简介 编译型:将所有的源码先编译成机器型语言,并保存为二进制文件,然后一次性执行c c++ go swift 解释型:将代码一行一行边编译边解释python javascript ph ...

  3. EBS管理员为供应商创建新联系人流程

    管理员为供应商创建新联系人流程 /oracle/apps/pos/supplier/webui/ByrAddCntctPG oracle.apps.pos.supplier.webui.ByrAddC ...

  4. zk键值数据结构

    首先看一张zk官网上的图: zk为我们提供了一种类似于文件存储的树形数据结构,那么它是如何实现的呢? 先假定我们有一个map,以路径名作为键,以节点作为值,如下: “/” -> 节点1,“/ap ...

  5. js数组的方法小结

    js中数组是一种非常常用数据结构,而且很容易模拟其他的一些数据结构,比如栈和队列.数组的原型Array.prototype内置了很多方法,下面就来小小总结一下这些方法. 检测数组就不用多说了,使用EC ...

  6. HMM模型和Viterbi算法

    https://www.cnblogs.com/Denise-hzf/p/6612212.html 一.隐含马尔可夫模型(Hidden Markov Model) 1.简介 隐含马尔可夫模型并不是俄罗 ...

  7. js中的deom ready执行的问题

    一开始我想到这,DOMContentLoaded,不兼容, <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. 读书笔记 C# 控制台应用程序之Main方法浅析

    Main方法是C#控制台应用程序和Windows窗体应用程序的入口点.Main方法可以有形参,也可以没有,可以有返回值(int整型),也可以没有.如下定义: 无返回值.无形参的格式: static v ...

  9. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  10. Java虚拟机运行时数据区

    运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...