最近在試圖進行cuda並行程式設計,目標是編寫一段矩陣計算**,將計算結果儲存進入gpu的緩衝區當中,並在達到某些要求後強制重新整理緩衝區,取得計算結果。
但是考慮時間緊任務重的狀況和實際的效能要求,決定使用cublas進行矩陣計算。
本篇文章試圖記錄我在進行cublas實驗時得出的一些結論和一些心得。
對於在win系統上進行cublas實驗需要安裝cuda、vs2013+版本。安裝過程不再贅述,值得注意的在之後新建專案,引入的標頭檔案應當是cublas_v2,在該標頭檔案下的矩陣計算函式包含了cublas_handle_t的首個引數,是大多是找得到的教程當中要求的函式。
在新建工程之後,如果直接使用cublas的函式進行計算則有一定機率出現error lnk2001——無法解析的外部符號。此時的解決方案大致為兩部:1、在專案的鏈結器配置中加入cudatookit當中的lib資料夾下的所有檔案;2之後將該資料夾的路徑顯式的加入鏈結器輸入的外部庫道中。具體過程建議參見:
值得注意的一點是,該部落格提到的一堆lib檔案中,由於版本不同可能有的存在於實際目錄下,而有的不存在於實際目錄下,因此應當在配置結束後刪除不存在的檔案引用。(查詢的方法推薦直接編譯執行檔案,之後檢視報錯去除不存在的檔案)。
1、應當建立cublas控制代碼(handle),用於進行cublas計算
2、應當將待計算資料在記憶體中準備好(最終表現形式應當為一維陣列)
3、應當將在裝置端(通常指顯示卡)中準備相應大小的記憶體,應當使用命令cudamolloc(最終表現形式應當為一維陣列)
4、應當將記憶體中的資料傳輸到裝置端,使用命令視型別而有不同,例如,準備的資料型別為矩陣時應當使用命令cublassetmatrix
5、應當使用cuda計算函式進行計算,並將結果儲存在裝置端的有效記憶體中。
6、最終將計算結果傳輸回到裝置端進行**。
值得注意的是,對於乙個矩陣,常規寫法和c對於二維陣列的寫法實際上是按照行優先的形式進行儲存的。然而考慮blas的歷史,最早是為了支援f語言的矩陣運算,因此使用了列優先的儲存方式。
因此對於乙個矩陣元素的定址通常使用巨集定義的形式定義列優先的定址方式。例如:
#define idx(x,y,m) (x + (y*m))
在進行矩陣計算時的,有乙個引數ldx(x通常為'a'或'b'),該引數實際上指的就是在列優先(或行優先)的情況下,一列(或一行)的元素個數。全稱是(leading dimension)即主維,並非cublas獨有的乙個概念。
cublas 的學習筆記 1
最近開始接觸cublas,為了監督自己的學習,並希望得到其他朋友的指點,特地將自己的學習筆記寫出來 1.參考文件 cublas library 2.1.pdf 2.環境配置 1 新增標頭檔案 cublas.h 2.cuda 程式的平台上,按照下面的方法新增 cublas 的lib 檔案 projec...
cublas中的矩陣運算
cublas是乙個可以與cuda一同使用的函式庫,它提供了多種矩陣運算的api,但是它列主序的儲存方式卻讓人十分疑惑,今天我就以cublas中的矩陣乘法運算簡單說一下我的理解。cublas中的矩陣乘法運算函式有5個,分別是cublassgemm cublasdgemm cublascgemm cub...
如何用cublas計算逆矩陣?
cublas的文件中提供了乙個用lu分解求逆矩陣的方法,需要用到兩個函式 第乙個函式用於做lu分解,第二個函式把lu分解的結果變為逆矩陣。但官方文件對這兩個函式的用法語焉不詳,我花了幾個小時才把這個問題搞定。主要遇到兩個問題 函式有乙個引數是 const float 型別,直接把 float 指標傳...