cublas - api

概述

矩阵乘法是高性能计算中最常用到一类计算模型。无论在HPC领域,例如做FFT、卷积、相关、滤波等,还是在 Deep Learning 领域,例如卷积层,全连接层等,其核心算法都直接或者可以转换为矩阵乘法。

cuBLAS 是标准线性代数库 (standard basic linear algebra subroutines (BLAS)) 的 GPU 加速实现,它支持 Level 1 (向量与向量运算) ,Level 2 (向量与矩阵运算) ,Level 3 (矩阵与矩阵运算) 级别的标准矩阵运算。

使用好 cuBLAS,首先要了解函数命令规则,找到自己算法对应的函数名称;其次要理解函数中输入/输出参数的定义,尤其是处理的数据类型,矩阵的存储方式 (行/列优先) ,运算类型等。

命名规则

关于 BLAS 库中各种函数命名规则,大家可以参考下面这个表:

数据类型 矩阵类型 运算类型
S: single(single real) GE: general DOT: scalar product, x^T y
D: double(double real) GB: general band AXPY: vector sum, alpha x + y
C: complex(complex real) SY: symmetric MV: matrix-vector product, Ax
Z: double(double real) SB: symmetric band SV: matrix-vector solve, |inv(A)x
  SP: symmetric packed MM: matrix-matrix product, AB
  HE: hermitian SM: matrix-matrix solve, inv(A) B
  HB: hermitian band
  HP: hermitian packed  
  TR: triangular  
  TB: triangular band  
  TP: triangular packed  
   

cuBLAS 库的命令规则与 BLAS 库完全一致。有了上面的命令规则,我们查询 cuBLAS API 时就可以很容易了解各个函数的意义。

数据类型

cuBLAS 中主要包含2种数据类型:cublas 数据类型和 cuda 数据类型。

  1. cublas 数据类型
  1. cuda 数据类型——cudaDataType_t:指示数据类型为半精度、单精度、双精度、8bit整型,并可与实数、复数、有符号、无符号等进行组合

    Value Meaning
    CUDA_R_16F the data type is 16-bit floating-point
    CUDA_C_16F the data type is 16-bit complex floating-point
    CUDA_R_32F the data type is 32-bit floating-point
    CUDA_C_32F the data type is 32-bit complex floating-point
    CUDA_R_64F the data type is 64-bit floating-point
    CUDA_C_64F the data type is 64-bit complex floating-point
    CUDA_R_8I the data type is 8-bit signed integer
    CUDA_C_8I the data type is 8-bit complex signed integer
    CUDA_R_8U the data type is 8-bit unsigned integer
    CUDA_C_8U the data type is 8-bit complex unsigned integer

函数库

cuBLAS函数库包含2类——功能函数和数学计算函数:

  1. 功能函数:
  1. 计算函数:

关于转置

用过cuBLAS做矩阵乘法的开发人员都知道,关于到底要不要转置,特别容易把人搞懵。这个问题产生的根本原因是cuBLAS默认矩阵在GPU中是按列顺序存储的,而我们通常在内存中存储矩阵的方式是按行存储。这意味着,当我们传入1个矩阵A时,cuBLAS会将它看做trans(A)即矩阵A的转置。为了给使用的灵活性(当然,灵活性的代价是增加了复杂性),cuBLAS的矩阵乘法函数中的参数cublasOperation_t允许对输入矩阵A和B进行CUBLAS_OP_N(不转置)、CUBLAS_OP_T(转置)或者CUBLAS_OP_C(共轭转置)的操作。

矩阵相乘

1. cublasSgemm 单精度实数

头文件: cublas_v2.h

matrix normal cublas
A m x k k x m
B k x n n x k
C m x n n x m
\[C_{m \times n} = \alpha*A_{m \times k}*B_{k \times n} + \beta*C_{m \times n}\]

cublasOperation_t CUBLAS_OP_N 不转置 CUBLAS_OP_T 普通转置 CUBLAS_OP_C 共轭转置

cublasStatus_t cublasSgemm( cublasHandle_t handle, // 调用 cuBLAS 库时的句柄 cublasOperation_t transa, // A 矩阵是否需要转置 cublasOperation_t transb, // B 矩阵是否需要转置 int m, // A 的行数 int n, // B 的列数 int k, // A 的列数 const float *alpha, // 系数 α, host or device pointer const float *A, // 矩阵 A 的指针,device pointer int lda, // 矩阵 A 的主维,if A 转置, lda = max(1, k), else max(1, m) const float *B, // 矩阵 B 的指针, device pointer int ldb, // 矩阵 B 的主维,if B 转置, ldb = max(1, n), else max(1, k) const float *beta, // 系数 β, host or device pointer float *C, // 矩阵 C 的指针,device pointer int ldc // 矩阵 C 的主维,ldc >= max(1, m) );

Table of Contents