CUDA程序性能分析-矩陣乘法


CUDA程序性能分析-矩陣乘法

前言

矩陣乘法非常適合在GPU上並行運行,但是使用GPU並行后能獲得多大的性能提升?本文將通過一些實驗分析CUDA程序的性能。

測試環境

本文使用Dell XPS 8700作為測試機,相關配置如下:

型號 Dell XPS 8700
CPU Intel Core i7-4970 3.6GHz
主存 16GB
GPU GeForce GTX 750Ti
OS Windows 10 64bit
CUDA CUDA 8.0

帶寬測試

使用CUDA Toolkit提供的示例程序bandwidthTest測試可分頁內存(Pageable)和鎖頁內存(Page-lock or Pinned)的帶寬,測試結果如下:

帶寬測試

從上圖可以看出,鎖頁內存對帶寬的提升是非常大的,所以當一個程序的性能瓶頸是數據傳輸時,就應該考慮是否應該使用鎖頁內存。當然,使用鎖頁內存是有代價的——該內存空間不能換頁,當大量使用時會導致內存耗盡而是程序崩潰。

矩陣乘法性能對比

測試了5個不同版本的矩陣乘法的性能:numpy、C++、CUDA無優化(CUDA1)、CUDA使用共享內存優化(CUDA2)、cuBLAS,由於原生Python版本的程序實在太慢了,故放棄之。CUDA和cuBLAS版本的矩陣乘法可以從CUDA Toolkit提供的示例程序matrixMulmatrixMulCUBLAS找到,當然需要做一些修改。5個版本的測試結果如下:

性能對比
性能對比
性能對比

從上圖可以看到,3個GPU版本的性能都比CPU(C++)版本高,尤其是在數據量變大的時候,如當數據量大於1024*1024時,C++版本的運行時間急劇上升。對比不使用共享內存和使用共享內存優化的版本可以看到,在數據量小的時候兩個版本看不出差異,而當數據量越來越大的時,性能差異就很明顯。使用共享內存優化的版本明顯優於不優化的版本,這是因為從全局內存訪問數據是非常慢的,而共享內存就相對快多了,當所有的線程都重復從全局內存讀取數據勢必導致全局內存總線擁堵,而且內存訪問也不能合並,導致大量線程被掛起,從而降低性能。共享內存是程序員可以控制的高速緩存,應該可能地應用它以優化程序的性能。另外,使用cuBLAS似乎比自己實現一個算法的性能更高,這是因為這些庫都是擁有豐富編程和優化經驗的高級程序員編寫的,所以當考慮自己實現一個算法的時候先看看是否有現成的庫可以使用,有時候費力並不一定討好 😄。

比較戲劇性的是Numpy,它的表現完全出乎我的意料,居然戲劇性地接近了比GPU版本的性能,關於原因還有待研究。這也告訴我們,使用Python時遇到數學計算還是盡量使用Numpy而不是python的math。當然如果你的計算機配備GPU或多核CPU(貌似現代GPU都是多核的)也可以考慮Numba加速Python程序,參考使用Python寫CUDA程序

結語

本文主要記錄了本人測試CUDA程序性能的結果,並對結果進行了分析,從測試結果和分析可以為並行程序和優化性能帶來一些啟示。

本文完整代碼可在Github上下載


免責聲明!

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



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