高性能计算例程:GEMM (零)

一、背景:

  1. GEMM(General Matrix Multiplication)全称为“通用矩阵乘法”;
  2. GEMM是BLAS(Basic Linear Algebra Subprograms)中Level 3的例程,也是整个BLAS最重要的例程之一;

二、例程(以double类型为例):

1.功能:

计算 α∗A′∗B′+β∗C\alpha*A'*B'+\beta*Cα∗A′∗B′+β∗C的值,然后将结果存入C中,

即:
C⟵α∗A′∗B′+β∗CC\longleftarrow \alpha*A'*B'+\beta*CC⟵α∗A′∗B′+β∗C
其中:

(1)α和β为标量常数\alpha \text{和} \beta \text{为标量常数}α和β为标量常数
(2)A′=op(A)={A,op is no transposeAT,op is transposeA'=op(A)=\left\{ \begin{aligned} &A & , & \text{op is no transpose} \\ &A^T& , & \text{op is transpose} \\ \end{aligned} \right. A′=op(A)={​AAT​,,​op is no transposeop is transpose​
(3)B′=op(B)={B,op is no transposeBT,op is transposeB'=op(B)=\left\{ \begin{aligned} &B & , & \text{op is no transpose} \\ &B^T& , & \text{op is transpose} \\ \end{aligned} \right. B′=op(B)={​BBT​,,​op is no transposeop is transpose​
(4)A′is kby m: (A′)m×kA' \text{ is }k\text{ by } m \text{ : }\qquad (A')_{m \times k}A′ is k by m : (A′)m×k​
(5)B′is nby k: (B′)k×nB' \text{ is }n\text{ by } k \text{ : }\qquad (B')_{k \times n}B′ is n by k : (B′)k×n​
(6)Cis nby m: (C)m×nC \text{ is }n\text{ by } m \text{ : }\qquad (C)_{m \times n}C is n by m : (C)m×n​
即:
C=α∗op(A)∗op(B)+β∗CC =\alpha*op(A)*op(B)+\beta*CC=α∗op(A)∗op(B)+β∗C

2.例程:

void cblas_dgemm
(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa,const CBLAS_TRANSPOSE transb, const CBLAS_INT m, const CBLAS_INT n, const CBLAS_INT k, const double alpha,const double *a, const CBLAS_INT lda, const double *b, const CBLAS_INT ldb, const double beta, double *c, const CBLAS_INT ldc
);

参数说明:

  • (1) const CBLAS_LAYOUT Layout:
    矩阵的存储方式:列优先或者行优先。
    列优先:Column-Major
    行优先:Row-Major
    作者(我 E2MCC)补充:
    其实矩阵的有多种存储方式,如块行优先存储,块列优先存储,对于稀疏矩阵而言还有 COO(Triplet) CSC CSR ELL DIA 等存储方式。这里的 ColMaj 和RowMaj 是最常见的稠密矩阵的基本存储方式。

  • (2) const CBLAS_TRANSPOSE transa:
    对 AAA 进行转置操作:转置或不转置(Transpose AAA or not)

  • (3) const CBLAS_TRANSPOSE transb:
    对 BBB 进行转置操作:转置或不转置(Transpose BBB or not)

  • (4) const CBLAS_INT m:
    m 表示实际运算时 AAA 矩阵的行维度(行数),也就是 op(A)(A)(A) 的行维度;
    当然也是结果矩阵 CCC 的行维度(行数)。

  • (5) const CBLAS_INT k:
    k 表示实际运算时 AAA 矩阵的列维度(列数),也就是 op(A)(A)(A) 的列维度;
    同时也是实际运算时 BBB 矩阵的行维度(行数),也就是 op(B)(B)(B) 的行维度。

  • (6) const CBLAS_INT n:
    n 表示实际运算时 BBB 矩阵的列维度(列数),也就是 op(B)(B)(B) 的列维度;

  • (7) const double alpha:
    常数项 α\alphaα。

  • (8) const double * a :
    a 为一个指针,指向 AAA 矩阵数据在内存中的位置。

  • (9) const CBLAS_INT lda:
    Leading Dimension of A:表示 AAA 矩阵数据在内存中存储时的步长。
    注意:这里 lda 是指的 A 的 leading dimension 而不是 op(A)(A)(A)的 leading dimension。

  • (10) const double * b:
    b为一个指针,指向 BBB 矩阵数据在内存中的位置。

  • (11) const CBLAS_INT ldb:
    Leading Dimension of B:表示 BBB 矩阵数据在内存中存储时的步长。
    注意:这里 ldb 是指的 B 的 leading dimension 而不是 op(B)(B)(B)的 leading dimension。

  • (12) const double beta:
    常数项 β\betaβ。

  • (13) double * c:
    c 为一个指针,指向 CCC 矩阵数据在内存中的位置。

  • (14) const CBLAS_INT ldc:
    Leading Dimension of C:表示 CCC 矩阵数据在内存中存储时的步长。
    注意:这里 ldc 是指的 C 的 leading dimension 而不是 op(C)(C)(C)的 leading dimension。

3.Leading dimension详细解释

(1)leading dimension 是什么?
leading dimension 是二维逻辑矩阵映射到一维内存空间时的映射方程的系数。
(2)为什么要使用leading dimension?leading dimension和m,n,k有什么区别?
当A矩阵就是一整个矩阵时,leading dimension确实为A矩阵的行数或者列数,但是若A矩阵仅仅只是一个更大的矩阵中的一部分时,那么leading dimension 必定不等于A的行数或列数了。如下图所示:

前所未有的详细总结 BLAS(一):GEMM Routine(零)相关推荐

  1. 前所未有的详细总结 BLAS (零)

    前所未有的详细总结 BLAS (零) 一.BLAS例程的命名约定(Naming Conventions for BLAS Routines) 0. BLAS例程名称具有以下结构: <数据类型&g ...

  2. BLAS之GEMM和GEMV

    BLAS简介 BLAS全称是Basic Linear Algebra Subprograms是规定了一套低级的执行常见线性代数操作的规范.其实现经常针对特殊的机器进行优化,比较著名的·BLAS库有AC ...

  3. i7 3960x支持服务器内存吗,i7 3960x 性能如何?—前所未有的详细版测评

    从目前Intel公布的资料来看,SNB-E首发将会有三款新产品诞生,他们分别是:4核心8线程倍频部分解锁的i7-3820,它的定位类似与LGA 1366接口的i7-980类似;然后是不锁倍频的i7-3 ...

  4. CocosCreator像素鸟小游戏实现(有源码)超详细教程 TS实现小游戏 零基础开发

    CocosCreator像素鸟小游戏实现(有源码)超详细教程 TS实现小游戏 大家中秋国庆快乐哈 前言 老规矩先看效果 源码的获取方式在最下面 对于本游戏来说canvas这样设置最佳哦 游戏实现思路: ...

  5. 【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)

    文章目录 引言 1 混淆矩阵 2 语义分割 PA:像素准确率 CPA:类别像素准确率 MPA:类别平均像素准确率 IoU:交并比 MIoU:平均交并比 3 综合实例 步骤一:输入真实.预测图片 步骤二 ...

  6. 最最最详细的C语言教程笔记零起步(10)进阶必备 同笔者一起学习

    C语言教程笔记 二十二. 输入输出缓存 1. 探究printf的现象 1.1 windows系统上的代码 1.2 linux系统上的代码 1.3 windows系统上的表现 1.4 linux系统上的 ...

  7. 从零搭建vue-ssr详细介绍

    ssr是用vue开发中一个常见且复杂的问题,虽然官方推出nuxt来解决此问题,但是了解ssr的原理也是很有必要的,网上也有很多vue-ssr相关的介绍,但是大多讲的不够详细. 这里我将从零搭建一个vu ...

  8. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  9. leading dimension

    矩阵空间是 3x4,其左上角有一个子矩阵2x3,表示如下 11 22 33 0 44 55 66 0 0   0    0   0 i, j分别表示行索引,列索引 如果用列存储的话,leading d ...

最新文章

  1. GDI编程注意点-1
  2. 全球 android手机排行 2013,全球Android手机性能排行 三星Note 3夺魁
  3. 关于通配泛型类型有几种_5.7 泛型通配符和类型参数的范围
  4. 360浏览器卸载_陈蛋蛋碎碎念—如何完美地卸载流氓软件
  5. 终于,我读懂了所有Java集合——map篇(多线程)
  6. mysql事务处理什么意思_mysql事务是什么意思
  7. 失心漂亮的个人html引导页面源码
  8. java smtp服务器,用Java实现SMTP服务器
  9. 如何使用Global Mapper分幅导出地图
  10. 性能退化评估 matlab,LED驱动电源性能退化参数监测及寿命预测方法研究
  11. Contrastive Multiview Coding
  12. Python批量采集百度相关搜索词教程
  13. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(11)——XXX定理
  14. 爬取公众号的文章,同时处理图片不显示问题(JAVA)
  15. 微信小程序开发之实现一个弹幕评论
  16. 二进制逆向实验——寻找flag
  17. 如何让PDF转换成Excel
  18. 我的世界它最懂 华为nova7系列打造5G自拍旗舰
  19. iis7 php 403,详解Nginx 出现 403 Forbidden 的解决办法
  20. 《Learning Unsupervised Metaformer for Anomaly Detection》论文阅读笔记

热门文章

  1. 一款可以对接多用户商城系统的客服系统
  2. pdnovel.php,辰小阳很出名吗
  3. 全媒舍:网站搭建所具有的宣传效果和宣传模式有关
  4. android 异常leaked intentreceiver
  5. 海门区教育科学规划2020年度课题成果鉴定申请表
  6. ShaderWeaver使用教程-官网信息
  7. dream weaver_具有定制汇编程序,Weaver和运行时的可插拔知识
  8. Freebsd + wine1.1.9 + 国元网上证券交易(通达信版)
  9. Android应用接入第三方登陆之新浪微博
  10. 搜狗CEO王小川自述:如何用“三级火箭”杀出重围!