OpenBLAS 中矩阵运算函数学习

简介: OpenBLAS 中矩阵运算函数学习

GEMM 是矩阵乘法最成熟的优化计算方式,也有很多现成的优化好的库可以调用。


OpenBLAS 矩阵计算


OpenBLAS 库实现成熟优化的矩阵与矩阵乘法的函数 cblas_sgemm 和矩阵与向量乘法函数 cblas_sgemv,二者使用方法基本相同,参数较多,所以对参数的使用做个记录。


矩阵与矩阵乘法


cblas_sgemm 计算的矩阵公式:C=alpha*A*B+beta*C,其中 ABC 都是矩阵,C 初始中存放的可以是偏置值。

cblas_sgemm 函数定义:

cblas_sgemm(layout, transA, transB, M, N, K, alpha, A, LDA, B, LDB, beta, C, LDC);

  • layout:存储格式,有行主序(CblasRowMajor)和列主序(CblasColMajor),C/C++ 一般是行主序。
  • transAA 矩阵是否需要转置。
  • transBB 矩阵是否需要转置。
  • MNKA 矩阵经过 transA 之后的维度是 M*KB 矩阵经过 transB 之后的维度是 K*NC 矩阵的维度是 M*N
  • LDALDBLDC矩阵在 trans (如果需要转置)之前,在主维度方向的维度(如果是行主序,那这个参数就是列数)。

示例代码:


#include <stdio.h>
#include <cblas.h>
int main() {
  int i, j;
  float a[6]={1,3,5,2,7,8};
  float b[6]={5,3,7,2,4,2};
  float c[6]={0,0,0,0,0,0};
  cblas_sgemm(CblasRowMajor, CblasTrans, CblasTrans, 3, 3, 2, 1.0, a, 3, b, 2, 0.0, c, 3);
  for(i = 0; i < 3; ++i){
    for(j = 0; j < 3; ++j){
      printf("%f ", c[i*3+j]);
    }
    printf("\n");
  }
  return 1;
}


代码解释:

在主函数中,定义了三个数组a、b和c,分别表示两个矩阵和它们的乘积。然后调用了BLAS库中的函数cblas_sgemm,该函数用于矩阵乘法的计算。该函数有很多参数,其中:

  • CblasRowMajor:表示矩阵是行主序(row-major)的,即按行存储;
  • CblasTrans:表示矩阵是转置的;
  • 3和2:表示矩阵的行数和列数;
  • 1.0和0.0:表示乘法中的加法和乘法的因子;
  • a和b:表示两个矩阵的数据;
  • c:表示乘积的结果;
  • 3和2:表示矩阵的列数和行数。

最后,通过两个for循环打印出乘积矩阵c的值。


矩阵与向量乘法


矩阵与向量乘法本质也是矩阵与矩阵,只不过 gemvgemm 要快一些,所以有时候也需要用 gemv。计算式:C=alpha*A*b+beta*C

cblas_sgemv 函数定义:

cblas_sgemv(layout, trans, M, N, alpha, A, LDA, b, 1, beta, C, 1)

参数的定义基本和 gemm 相同,MNA 的行数和列数,bC 的列数都是 1。

目录
相关文章
|
Linux 数据安全/隐私保护 Windows
更换(Pypi)pip源到国内镜像
pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.
247184 2
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
中国计算机学会(CCF)2022年版推荐目录涵盖了计算机体系结构、并行与分布计算、存储系统领域的多个A类会议和期刊。本文汇总了这些顶级资源的全称、出版社、dblp网址及领域。包括《ACM计算机系统汇刊》、《ACM存储汇刊》等期刊,以及ACM PPoPP、USENIX FAST等会议,为研究人员提供了重要学术参考。
12881 64
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
|
存储 缓存 NoSQL
键值存储
键值存储
787 1
|
10月前
|
机器学习/深度学习 人工智能 前端开发
【AI系统】AI编译器前瞻
本文基于《The Deep Learning Compiler: A Comprehensive Survey》调研,对比了TVM、nGraph、TC、Glow和XLA五个热门AI编译器,介绍了它们的特点和应用场景。文章分析了AI编译器面临的挑战,包括动态Shape问题、Python编译静态化、发挥硬件性能、特殊优化方法及易用性与性能兼顾问题,并展望了AI编译器的未来,探讨了编译器形态、IR形态、自动并行、自动微分及Kernel 自动生成等方面的发展趋势。
379 1
|
运维 监控 网络安全
Python 在网络运维方面的自动化应用实例
Python 在网络运维方面的自动化应用实例
349 4
|
API Windows
[原创]MASM32新手指南
[原创]MASM32新手指南
|
缓存 PHP 开发者
提升Web开发效率:PHP 7.4中的性能优化技巧
【4月更文挑战第13天】本文深入探讨了PHP 7.4版本中引入的新特性和性能改进,旨在帮助开发者通过实用的编码技巧和最佳实践来提升Web应用的开发效率和运行性能。文章将重点介绍如何利用这些新特性进行代码优化,以及它们在实际项目中的应用场景。
|
缓存 算法 Linux
深入理解Linux动态库加载:路径、问题与解决方案
深入理解Linux动态库加载:路径、问题与解决方案
3392 0
|
机器学习/深度学习 算法 API
性能世界第二的半定规划SDP是什么?怎么用?此文全面解答
半定规划作为作为重要的优化建模工具被广泛应用于机器学习、信号处理、计算机视觉、以及量子计算等领域。MindOpt新版本V0.23.0中新增了半定规划SDP求解器,测评成绩世界第二。
性能世界第二的半定规划SDP是什么?怎么用?此文全面解答