GEMM 是矩阵乘法最成熟的优化计算方式,也有很多现成的优化好的库可以调用。
OpenBLAS 矩阵计算
OpenBLAS 库实现成熟优化的矩阵与矩阵乘法的函数 cblas_sgemm 和矩阵与向量乘法函数 cblas_sgemv,二者使用方法基本相同,参数较多,所以对参数的使用做个记录。
矩阵与矩阵乘法
cblas_sgemm 计算的矩阵公式:C=alpha*A*B+beta*C,其中 A、B、C 都是矩阵,C 初始中存放的可以是偏置值。
cblas_sgemm 函数定义:
cblas_sgemm(layout, transA, transB, M, N, K, alpha, A, LDA, B, LDB, beta, C, LDC);
layout:存储格式,有行主序(CblasRowMajor)和列主序(CblasColMajor),C/C++ 一般是行主序。transA:A矩阵是否需要转置。transB:B矩阵是否需要转置。M,N,K:A矩阵经过transA之后的维度是M*K,B矩阵经过transB之后的维度是K*N,C矩阵的维度是M*N。LDA,LDB,LDC:矩阵在trans(如果需要转置)之前,在主维度方向的维度(如果是行主序,那这个参数就是列数)。
示例代码:
1 |
|
矩阵与向量乘法
矩阵与向量乘法本质也是矩阵与矩阵,只不过 gemv 比 gemm 要快一些,所以有时候也需要用 gemv。计算式:C=alpha*A*b+beta*C
cblas_sgemv 函数定义:
cblas_sgemv(layout, trans, M, N, alpha, A, LDA, b, 1, beta, C, 1)
参数的定义基本和 gemm 相同,M 和 N 是 A 的行数和列数,b 和 C 的列数都是 1。