cublasCgemm函数使用及理解
关于cublas库中函数的介绍,有许多博主进行了介绍。
本文仅为个人理解记忆的角度对此函数进行说明(主要是在输入及计算时矩阵维度的理解),由点及面,其余函数如:cublasSgemm(单精度实数)、cublasDgemm(双精度实数)、cublasZgemm(双精度复数)等可照此理解。
- 函数API说明
cublasCgemm( cublasHandle_t handle, cublasOperation_t transa, cublasOperation_t transb, int m, int n, int k, const cuComplex *alpha, const cuComplex *A, int lda, const cuComplex *B, int ldb, const cuComplex *beta, cuComplex *C, int ldc );
用于计算 C = α A B +β C 的,其中 Am×k 、Bk×n 、Cm×n 为矩阵,α 、β 为标量。每个参数的意义如下:
1 cublasHandle_t handle 调用 cuBLAS 库时的句柄 2 3 cublasOperation_t transa 是否转置矩阵A 4 5 cublasOperation_t transb 是否转置矩阵B 6 7 int m 矩阵A的行数,等于矩阵C的行数 8 9 int n 矩阵B的列数,等于矩阵C的列数 10 11 int k 矩阵A的列数,等于矩阵B的行数 12 13 const float *alpha 标量 α 的指针,可以是主机指针或设备指针,只需要计算矩阵乘法时命 α = 1.0f 14 15 const float *A 矩阵(数组)A 的指针,必须是设备指针 16 17 int lda 矩阵 A 的主维(leading dimension) 18 19 const float *B 矩阵(数组)B 的指针,必须是设备指针 20 21 int ldb 矩阵 B 的主维 22 23 const float *beta 标量 β 的指针,可以是主机指针或设备指针,只需要计算矩阵乘法时命 β = 0.0f 24 25 float *C 矩阵(数组)C 的指针,必须是设备指针 26 27 int ldc 矩阵 C 的主维
- cuBlas中默认列优先
即调用cuBlas函数时,输入的矩阵会按照列优先进行存储。
- 主维
在列优先存储中,矩阵的行数是维度的第一个分量,称为主维。
- 矩阵输入说明
m、n、k 是最终输入完成后A和B的矩阵维度,以A矩阵的输入为例进行说明:
如果不转置,lda的含义是每次取lda个数,放成1列,总共取k次,变成lda×k的矩阵,此时一般lda等于m,最后即为m×k的矩阵。
如果转置,lda的含义是每次取lda个数,放成一列,总共取m次,变成lda×m的矩阵,转置后变成m×lda,此时一般lda为k,最后即为m×k的矩阵。
参考