1. 程式人生 > >CUDA程式設計實踐--cuBLAS

CUDA程式設計實踐--cuBLAS

在一些應用中我們需要在GPU中實現一些諸如線性求解器,非線性優化、等矩陣分析和線性代數的功能。CUDA庫中提供一個BLAS線性代數庫,cuBLAS。

BLAS指定了一系列低層次的執行常用的線性代數操作的路線,如向量加,常量乘,內積,線性變換,矩陣乘法等。BLAS為線性代數準備了de facto的標準低層次範例,這些 例範例包含了c和Fortran介面。所以BLAS的規則是通用的,BLAS的實現會針對機器優化,使用BLAS可以帶來效能上的提升,BLAS的實現利用了特殊的讀點硬體如向量暫存器和SIMD指令等。

官網說明

cuBLAS庫是一個BLAS的實現,他允許使用者使用NVIDIA的GPU的計算資源。cuBLAS在CUDA6.0中出現,現在包含2個類API,常規cuBLAS,簡稱為cuBLAS API,另外一種是CUBLASXT API。使用cuBLAS 的時候,應用程式應該分配矩陣或向量所需的GPU記憶體空間,並載入資料,呼叫所需的cuBLAS函式,然後從GPU的記憶體空間上傳計算結果至主機,cuBLAS API也提供一些幫助函式來寫或者讀取資料從GPU中。
當使用CUBLASXT API的時候,應用程式應該儲存資料在主機上,並且庫會進行排程系統中的一個或多個GPU,這個會根據使用者的需求完成。

cublasStatus_t CUBLASWINAPI cublasSetMatrix (int rows, int cols, int elemSize, const void *A, int lda, void *B, int ldb);

該函式從矩陣A(位於CPU中)中複製了一個矩形區域 rows x cols的元素到GPU的矩陣B的記憶體中。 每個元素需要elemSize位元組的儲存空間。
Both matrices are assumed to be stored in column major format, with the leading dimension (i.e. number of rows) of source matrix A provided in lda, and the leading dimension of matrix B provided in ldb. In general, B points to an object, or part of an object, that was allocated via cublasAlloc().

cublasHandle_t handle;
stat = cublasCreate(&handle); if (stat != CUBLAS_STATUS_SUCCESS) { printf ("CUBLAS initialization failed\n"); return EXIT_FAILURE; }

首先建立一個cuBLAS庫的控制代碼,使用該函式初始cuBLAS庫的上下文。這個控制代碼需要顯式的傳遞給之後被呼叫的API函式。在使用多個主機的執行緒和多個GPU的時候,使用者可以對庫的設定實現更完整的控制。

stat = cublasCreate(&handle); if
(stat != CUBLAS_STATUS_SUCCESS) { printf ("CUBLAS initialization failed\n"); return EXIT_FAILURE; }

矩陣的元素排列形式

C語言是按行儲存的,在記憶體中,矩陣A的首行首先被連續儲存,然後是首行後的一行再被連續的儲存,依次類推,我們稱A的這個儲存結構為Host_A。

那麼CUBLAS會如何理解HOST_A呢?

CUBLAS中,矩陣會被按照列儲存,所以CUBLAS也是按照 按列儲存的方式理解記憶體中的資料的,如果我們告訴CUBLAS,HOST_A儲存的是一個M X N的矩陣,那麼,CUBLAS會把連續儲存的首次M個元素作為矩陣首列的元素儲存單元,按照我們原先C中的使用,這顯然是不對的,因為C中,我們認為HOST_A的首N個連續儲存單元為A的首行元素。

編譯和連結

在函式呼叫的檔案中包含標頭檔案 “cublas.h” 和 “cublas_v2.h”另外連結的時候指定cublas.so (Linux), the DLL cublas.dll

常用的資料型別

Value Meaning
CUBLAS_DATA_FLOAT the data type is 32-bit floating-point
CUBLAS_DATA_DOUBLE the data type is 64-bit floating-point
CUBLAS_DATA_HALF the data type is 16-bit floating-point
CUBLAS_DATA_INT8 the data type is 8-bit signed integer

常用的函式

矩陣向量乘法函式 功能
cublasgbmv y=αop(A)x+βy)
cublasgemv y=αop(A)x+βy)
cublassyr2() 對應rank-2 A=α(xyT+yxT)+A
cublastbmv() triangular banded 矩陣向量乘法
cublastbsv() triangular banded線性系統

op(A)x=b
cublastpmv() | triangular packed矩陣向量乘法 x=op(A)x

cublasXT API函式給出了相容多FPU的主機介面,當使用這些API函式的時候,應用在只需要在主機中分配矩陣所需的記憶體空間。對於矩陣的大小沒有限制,只要他們適合主機的儲存空間。cuBLASXT API 只支援BLAS3強度計算。