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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM