日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

C++、python、CUDA性能分析--矩阵乘法

發布時間:2024/4/18 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++、python、CUDA性能分析--矩阵乘法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網上看到一個分析python、Numpy、C++、cuda、cuBLAS做矩陣運算性能的帖子,我覺得非常好。所以,就自己動手實測了一下。這才有了這篇文章。就算是給需要的朋友做個參考吧。


****************************原帖內容****************************

前言

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

測試環境

本文使用臺式機(DIY)作為測試機,相關配置如下:

型號DIY
CPUIntel G2030 3.0GHz
主存8GB
GPUGeForce GTX 750Ti
OSWindows 7 64bit
CUDACUDA 8.0

帶寬測試

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

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

矩陣乘法性能對比

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



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

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

結語

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

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


**************************以上為原貼內容(主機是我自己的臺式機配置)****************************


下面兩張圖是我實測運行代碼后的圖片,基本情況符合原貼的分析。


第一張圖如上所示。這張圖分為三部分:

左上方是使用了Numpy庫函數的python程序運行結果(“In [2]: run matrixMul.py”上面);

左下方是沒有使用Numpy庫的python程序運行結果(“In [2]: run matrixMul.py”下面),實在是太慢了,程序還沒跑完就被我強行終止了;

右側是C++程序運行結果。

這三種實現形式相比較而言Numpy的優勢太明顯了。C++比不用Numpy要快大約一個數量級,而使用Numpy比C++要快大約兩個數量級。


第二張圖是使用VS2012+CUDA8.0編譯環境運行的cuda程序。我們把圖中的矩陣運算時間寫下來:

Matrix<256,256>,Time=3.398 ms;

Matrix<512,512>,Time=26.641 ms;

Matrix<768,768>,Time=88.807 ms;

Matrix<1024,1024>,Time=208.846 ms;

Matrix<1280,1280>,Time=406.837 ms;

Matrix<1536,1536>,Time=702.161 ms;

Matrix<1792,1792>,Time=1114.958 ms;

由于CUDA和Numpy比C++快太多,我們這里就比較CUDA和Numpy的運行時間。

說實話,看到運行結果后我還是很吃驚的。因為我認為GPU用CUDA做矩陣運算一定比CPU執行的python要快。萬沒想到Numpy在CPU上竟然跑的比CUDA在GPU上還要快。我認為這是因為一方面例程的矩陣運算量還不夠大,體現不出GPU的真正實力;另一方面CUDA沒有使用cuBLAS優化。不管怎么講Numpy的表現非常亮眼。這是因為Numpy包是用C語言開發,本來效率就很高,又經過二十年的不停優化(Numpy的前身是1995年就開始開發的一個用于數組運算庫)。所以我們以后用python進行科學計算一定要使用Numpy包。

*************************************************END****************************************************


原帖地址:http://www.cnblogs.com/5long/p/cuda_matrix_performance.html

總結

以上是生活随笔為你收集整理的C++、python、CUDA性能分析--矩阵乘法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。