高性能計算-cublas-gemm接口解析
1. 介紹
- 參考文章:http://www.rzrgm.cn/cuancuancuanhao/p/7763256.html ,本文對 cublas gemm 的接口參數進行原理解釋。
2. 接口
- cuBLAS中用于運算矩陣乘法的函數有4個,分別是 cublasSgemm(單精度實數)、cublasDgemm(雙精度實數)、cublasCgemm(單精度復數)、cublasZgemm(雙精度復數),定義在 cublas_v2.h 和 cublas_api.h 中。
3. 參數介紹
- 四個函數形式相似,均輸入了14個參數。該函數實際上是用于計算 C = α A B +β C 的,其中 A m×k 、B k×n 、C m×n 為矩陣,α 、β 為標量。
- 以 cublasSgemm_v2 為例:
CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgemm_v2(cublasHandle_t handle,
cublasOperation_t transa,
cublasOperation_t transb,
int m,
int n,
int k,
const float* alpha,
const float* A,
int lda,
const float* B,
int ldb,
const float* beta,
float* C,
int ldc);
- 以下根據 cublas 的數據處理及計算流程,解析參數的含義及填寫規則
| 流程 | 參數 | 解釋 |
|---|---|---|
| 輸入數據 | A | 輸入第一個矩陣一維數組 |
| B | 輸入第一個矩陣一維數組 | |
| 數據處理 1. 設置主序解析參數 2. 設置轉置參數 | lda | A 矩陣的主序維度,cublas 將按此參數按列保存數據,解析數組;如果A數組是依據C語言按行保存,那么 lda 應為A的列數,cublas 按此參數保存后的矩陣 A' 為 A 的轉置矩陣。 |
| ldb | B 矩陣的主序維度,cutblas 將按此參數按列保存數據,解析數組。同理,得到B的轉置矩陣 B'。 | |
| transa | 是否再對 A' 轉置;無論是否轉置,這里將數據處理的結果標記為A'' | |
| transb | 是否再對 B' 轉置;無論是否轉置,這里將數據處理的結果標記為B'' | |
| 設置數據處理后參與計算的矩陣參數 | m | A'' 的行數 |
| n | B'' 的列數 | |
| k | A'' 的列數 | |
| 運算(對數據處理的結果進行數學運算) | - | A'' * B'';如果A' B' 進行了轉置,A'' * B'' = A * B = C1' |
| 計算結果 | C | C1' 按列保存的一維數組; |
| ldc | C1' 的行數(即主序維度) | |
| 計算結果解析 | - | 根據ldc,如果A' B'使用了轉置參,對C1' 一維數組按行保存的結果是 C的轉置矩陣 C1'',需要對 C1'' 轉置得到最終計算結果C。 |
- 關于是否使用轉置參數的參數填寫示例:
- 不使用轉置:
cublasSgemm_v2(handle, n, m, k, CUBLAS_OP_N, CUBLAS_OP_N ,alpha, B, n, A, k, beta, C, n)
- cublas 計算公式:
\[C^{T} = B^{T} * A^{T}
\]
- 使用轉置:
cublasSgemm_v2(handle, m, n, k, CUBLAS_OP_T, CUBLAS_OP_T ,alpha, A, k, B, n, beta, C, m)
- cublas 計算公式:
\[C = A * B
\]
- 注意:輸出數組 C 解析出來的結果是最終結果的轉置,需要再次轉置得到最終結果。

浙公網安備 33010602011771號