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