IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 前所未有的详细总结 BLAS GEMM Routine -> 正文阅读

[数据结构与算法]前所未有的详细总结 BLAS GEMM Routine

高性能计算例程: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 ′ + β ? C C\longleftarrow \alpha*A'*B'+\beta*C C?α?A?B+β?C
其中:

(1) α 和 β 为标量常数 \alpha \text{和} \beta \text{为标量常数} αβ为标量常数
(2) A ′ = o p ( A ) = { A , op?is?no?transpose A T , op?is?transpose A'=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 ′ = o p ( B ) = { B , op?is?no?transpose B T , op?is?transpose B'=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? k ?by? m ?:? ( A ′ ) m × k A' \text{ is }k\text{ by } m \text{ : }\qquad (A')_{m \times k} A?is?k?by?m?:?(A)m×k?
(5) B ′ ?is? n ?by? k ?:? ( B ′ ) k × n B' \text{ is }n\text{ by } k \text{ : }\qquad (B')_{k \times n} B?is?n?by?k?:?(B)k×n?
(6) C ?is? n ?by? m ?:? ( C ) m × n C \text{ is }n\text{ by } m \text{ : }\qquad (C)_{m \times n} C?is?n?by?m?:?(C)m×n?
即:
C = α ? o p ( A ) ? o p ( B ) + β ? C C =\alpha*op(A)*op(B)+\beta*C C=α?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:
    A A A 进行转置操作:转置或不转置(Transpose A A A or not)

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

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

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

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

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

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

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

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

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

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

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

  • (14) const CBLAS_INT ldc:
    Leading Dimension of C:表示 C C C 矩阵数据在内存中存储时的步长。
    注意:这里 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的行数或列数了。如下图所示:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:47:48  更:2021-09-04 17:49:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:47:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码