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的矩阵。

 参考