openblas第一弹:openblas 使用说明和常用接口介绍

2023-11-09

openblas 使用说明

openblas 是一个开源的矩阵计算库,包含了诸多的精度和形式的矩阵计算算法。就精度而言,包括float和double,两种数据类型的数据,其矩阵调用函数也是不一样。不同矩阵,其计算方式也是有所不同,(姑且认为向量也是一维矩阵),例如,向量与向量之间的计算,向量与矩阵之间的计算,矩阵与矩阵之间的计算。

按照不同的计算需求openblas有如下几种

1. 第一层级:向量与向量

)

对于不同的精度,使用的函数也是不一样。例如cblas_daxpy表示double类型数据,cblas_daxpy表示float类型数据

  • 头文件

    "cblas.h"
    
  • 描述

    cblas_?axpy系列函数执行vector-vector的操作,即:
    y := alpha*x + y;
    其中alpha是标量,x,y是向量。
    
  • 参数说明

    n       Specifies the number of elements in vectors x and y.
    a       Specifies the scalar a.
    x       Array, size at least (1 + (n-1)*abs(incx)).
    incx   Specifies the increment for the elements of x.   一般设置为1 
    y       Array, size at least (1 + (n-1)*abs(incy)).
    incy   Specifies the increment for the elements of y.  一般设置为1 
    

2. 第2层级:矩阵与向量

矩阵与向量的乘法种类也有很多,常规也就是上述三种,以cblas_sgemv为例:

  • 头文件:

    "cblas.h"
    
  • 描述:

    cblas_?ger系列函数执行matrix-vector的操作,即:
    y := alpha*A*x + beta*y,
    其中alpha,beta是标量,x,y是向量(x(m*1),y(n*1)),A是一个m*n的矩阵。
    
  • 详细接口:

    void cblas_sgemv (const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE trans, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, const float *x, const MKL_INT incx, const float beta, float *y, const MKL_INT incy)
    
  • 详细接口的具体含义:

    • Layout:布局,也就是指定矩阵的排列方式,按照行优先(CblasRowMajor)还是列优先(CblasColMajor),需要指出的是,在函数使用中,虽然是向量与矩阵的乘法,但是实际上,传递的是两个指针向量。这样对于多维矩阵而言,指明其排列方式,十分有必要。参数(CblasRowMajor,CblasColMajor)
    • trans: 转置特定操作:
      • if trans=CblasNoTrans, then y := alpha*A*x + beta * y;
      • if trans=CblasTrans, then y := alpha*A’x + beta y;
      • if trans=CblasConjTrans, then y := alpha *conjg(A’)*x + beta*y.
    • m:表示矩阵A的行m
    • n:表示矩阵A的列n
    • a:表示一个矩阵,size = lda *k
      • For Layout = CblasColMajor, k is n,
      • For Layout = CblasRowMajor, k is m.
    • alpha:一个标量,通常为1
    • x:矩阵向量
    • incx,incy,一般为1
    • beta: 一个标量参数,通常设置为 0,之前试过设置为1,直接导致了结果不正确;在矩阵或是向量元素的值较大的时候,beta这个值,为0还是1影响不大;
  • 示例程序1:

void matrix_vector(){
    float array[6] = { 1,2,3,4,5,6 };
    float x[3] = { 1,2,3 };
    int m = 2; 
    int n = 3;
    float y[2] = {};
    cblas_sgemv(CblasRowMajor, CblasNoTrans, m, n, alpha, array, n, x, 1, beta, y, inc_y);
    //cblas_sgemv(CblasColMajor, CblasTrans, n, m, alpha, array, n, x, 1, beta, y, inc_y);
    //两个结果一致
}

//打印结果
14,32
  • 示例程序2:
void matrix_vector()
{
       int i = 0;
       double x[2] = { 1.0,2.0 };
       double y[3] = { 2.0,1.0,3.0};
       double A[6] = { 0 };
       blasint rows = 2, cols = 3;
       double alpha = 10;
       blasint inc_x = 1, inc_y = 1;
       blasint lda = 2;
       //矩阵按列优先存储
       //A <== alpha*x*y' + A (y'表示y的转置)
       cblas_dger(CblasColMajor, rows, cols, alpha, x, inc_x, y, inc_y, A, lda);
       for (i = 0; i<6; i++)
              std::cout << A[i] << " ";
       std::cout << "\n";
}
//打印结果
20 40 10 20 30 60

3. 第3层级:矩阵与矩阵

矩阵与矩阵的乘积,相较于前两种较为复杂,但是用途却比较大,上面能算的,它行;上面不能算的,它也行;

  • 头文件:

    "cblas.h"
    
  • 描述:

    C := alpha*op(A)*op(B) + beta*C,
    其中:op(A)表示A矩阵或是转置等
    A是一个M*K矩阵
    B是一个K*N矩阵
    C是一个M*N 矩阵

  • 接口描述:

    void cblas_sgemm(OPENBLAS_CONST enum CBLAS_ORDER Order, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransA, OPENBLAS_CONST enum CBLAS_TRANSPOSE TransB, OPENBLAS_CONST blasint M, OPENBLAS_CONST blasint N, OPENBLAS_CONST blasint K,
     OPENBLAS_CONST float alpha, OPENBLAS_CONST float *A, OPENBLAS_CONST blasint lda, OPENBLAS_CONST float *B, OPENBLAS_CONST blasint ldb, OPENBLAS_CONST float beta, float *C, OPENBLAS_CONST blasint ldc);
    
  • 详细参数描述:

    • cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC);

    • 详细参数与上述的矩阵与向量乘法类似

    • 以此函数为例:

      cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC);
      
      alpha =1,beta =0 的情况下,等于两个矩阵相成。
      
      第一参数 oreder 候选值 有ClasRowMajow 和ClasColMajow 这两个参数决定一维数组怎样存储在内存中,
      
      一般用ClasRowMajow
      
      参数 transA和transB :表示矩阵A,B是否进行转置。候选参数 CblasTrans 和CblasNoTrans.
      
      参数M:表示 A或C的行数。如果A转置,则表示转置后的行数
      
      参数N:表示 B或C的列数。如果B转置,则表示转置后的列数。
      
      参数K:表示 A的列数或B的行数(A的列数=B的行数)。如果A转置,则表示转置后的列数。
      
      参数LDA:表示A的列数,与转置与否无关。
      
      参数LDB:表示B的列数,与转置与否无关。
      
      参数LDC:始终=N
      
      NOTE: 首先判定是行优先还是列优先;
      再次,依照lda,ldb分别将两个矩阵按行、列分开
      再次,判定是否进行转置操作
      输出结果;
      
  • 示例程序1:

#include <vector>
#include <iostream>
#include <cblas.h>
using namespace std;
int main() {
    const int M=4;
    const int N=2;
    const int K=3;
    const float alpha=1;
    const float beta=0;
    const int lda=M;
    const int ldb=K;
    const int ldc=N;
    const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6};
    const float B[N*K]={5,4,3,2,1,0};
    float C[M*N];

    cblas_sgemm(CblasRowMajor, CblasTrans, CblasTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);

    for(int i=0;i<M;i++)
    {
       for(int j=0;j<N;j++)
       {
           cout<<C[i*N+j]<<" ";
       }
       cout<<endl;
    }
」
输出:
52 7
58 10
64 13
70 16
  • 示例程序2:
#include <vector>
#include <iostream>
#include <cblas.h>
using namespace std;
int main() {
    const int M=4;
    const int N=2;
    const int K=3;
    const float alpha=1;
    const float beta=0;
    const int lda=K;
    const int ldb=N;
    const int ldc=N;
    const float A[M*K]={1,2,3,4,5,6,7,8,9,8,7,6};
    const float B[K*N]={5,4,3,2,1,0};
    float C[M*N];

    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);

    for(int i=0;i<M;i++)
    {
       for(int j=0;j<N;j++)
       {
           cout<<C[i*N+j]<<" ";
       }   
       cout<<endl;
    }  
} 

结果:
14 8 
41 26
68 44 
67 46 

参考链接:

1:本文主要参考链接,主要是inte的MKL库的部分接口说名,openblas的这种接口没找到
MKLAPI

2:本文第三部分主要参考此博客,详细说明了多维矩阵的乘法问题多维矩阵的乘法问题

https://software.intel.com/en-us/mkl-developer-reference-c-cblas-ger

3:官网:http://www.openblas.net/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openblas第一弹:openblas 使用说明和常用接口介绍 的相关文章

随机推荐

  • 【翻译】torch.device的使用举例

    参考链接 class torch device 原文及翻译 torch device torch device栏目 class torch device torch device 类型 A torch device is an object
  • 我们为什么选择CentOS

    服务器操作系统大多采用Unix和Linux操作系统 而Linux发行版本系统中 多使用CentOS Redhat Ubuntu Gentoo Debian 而这些发行版本可以大体分为两类 一类是商业公司维护的发行版本 一类是社区组织维护的发
  • Spark Shuffle 中 JVM 内存使用及配置内幕详情

    引言 Spark 从1 6 x 开始对 JVM 的内存使用作出了一种全新的改变 Spark 1 6 x 以前是基于静态固定的JVM内存使用架构和运行机制 如果你不知道 Spark 到底对 JVM 是怎么使用 你怎么可以很有信心地或者是完全确
  • 面试官的技术面试技巧与步骤

    面试官进行技术面试的常用技巧与步骤 面试需求 解读人员需求与岗位说明 了解岗位需求和工作内容 明确岗位对人员的知识技能 工作经验和基本素质要求 面前准备 分析应聘者简历 判断人员需求 岗位说明与应聘人员的匹配度 发现需进一步确认的信息 分析
  • 基于产品的RFM模型的k-means聚类分析

    首先我们可以看看数据集的数据形态 导入rfm数据 查看数据的统计学参数 df pd read csv rfm csv df describe 在实施Kmeans聚类之前 我们必须检查这些关键k means假设 变量对称分布 不倾斜 具有相同
  • Ubuntu安装Vmware tools

    点击vmware右上角虚拟机的下拉菜单中点击 安装 VMware Tools 然后在桌面上会有一个压缩包 右击打开当前文件夹 重命名这个压缩包为vmwaretools tar gz 在当前文件夹中打开terminal cp vmwareto
  • 机器学习算法(二十三):DTW(Dynamic Time Warping,动态时间调整)

    目录 1 DTW 动态时间调整 2 算法的实现 3 例子 4 python实现 5 DTW的加速算法FastDTW 5 1 标准DTW算法 5 2 DTW常用加速手段 5 3 FastDTW 1 DTW 动态时间调整 动态时间调整算法是大多
  • java pv uv_前端数据收集(pv/uv)

    所谓web 即使你我素未谋面 便知志趣相投 足不出户 亦知世界大 01 什么是PV UV 网站流量分析 是指在获得网站访问量基本数据的情况下对有关数据进行统计 分析 从中发现用户访问网站的规律 并将这些规律与网络营销策略等相结合 从而发现目
  • Cadence Allegro(8):生成网络报表(Netlist)

    Cadence Allegro 8 生成网络报表 Netlist 前提摘要 PCB设计软件版本 原理图设计 Pad Designer 16 6 PCB设计 PCB Editor 16 6 个人说明 限于时间紧迫以及作者水平有限 本文错误 疏
  • selenium chrome java 无头模式使用cdp设置navigator.permission

    Chrome Devtools Protocol 前提 chromium无头模式下和gui模式是不同的 userData无法指定 也无法通过模拟点击alert授权 或者进入chrome settings 通过selenium控制授权 因为无
  • 奶牛碑文。

    include
  • 八大数据结构

    八大数据结构 数据结构分类 1 数组 2 栈 3 队列 4 链表 5 树 6 散列表 7 堆 8 图 1 数组 数组是可以再内存中连续存储多个元素的结构 在内存中的分配也是连续的 数组中的元素通过数组下标进行访问 数组下标从0开始 例如下面
  • ORACLE 生成唯一id

    1 创建一个序列 create sequence id 序列名称 increment by 1 以1递增 start with 1 从1开始 maxvalue 999999999 最大值 2 创建函数调用上边创建的序列 CREATE FUN
  • PyCharm 使用教程:PyCharm常用技巧指南,轻松学会

    在 PyCharm 中 打开已有的项目有 3 种方式 欢迎界面中选择open 菜单栏中选择 File gt open 打开远程 Git 的项目 在 PyCharm 中 打开已有的项目可以在第一次打开的欢迎界面中选择open来打开你电脑中已经
  • 【‘XXX‘ is declared but its value is never read.】

    遇到问题了 引入一个弹窗组件 已经import了 也在template中写了弹窗组件 但是弹窗就是不出来 1 看看报错信息 没啥报错 2 看看代码 import中的代码暗淡了 鼠标移入出现上面的报错 突然想起来没有在component中写入
  • breach靶场练习详细全过程

    补充 桥接 nat host only三种网络模式的区别 模式 特点 场景 bridge桥接模式 特点 虚拟机使用物理机的网卡 不用虚拟网卡 占用一个ip 需要配置ip以后才可以访问互联网 场景 虚拟机需要连接实体设备的时候 nat网络地址
  • 最好用的 6 个 React Tree select 树形组件测评与推荐

    本文完整版 最好用的 6 个 React Tree select 树形组件测评与推荐 React Tree select 树形组件 1 React Sortable Tree 全功能 树状单选多选 可拖拽 过滤搜索 多种主题可选 2 Rea
  • android开发浏览器!写给1-3年安卓程序员的几点建议,聪明人已经收藏了!

    前言 作为一个程序员 如果你在新知识 新技术面前仍一无所知 依然吃着十多年前的老本 那你在知识技术上肯定落伍 如果又未能进入管理层面 那你肯定就会被长江的后浪拍在沙滩上了 而不少与时俱进 善于学习的程序员他们仍是行业的中坚力量 这只是说明当
  • 面试利器(二)-------插入排序(直接插入排序和希尔排序(Shell排序))

    一 直接插入排序 抓住关键字 插入 1 基本思想 顺序地把待排序的序列中的各个数据按其关键字的大小 插入到已排序的序列的适当位置 2 运行过程 1 将待排序序列的第一个数据看做一个有序序列 把第二个数据到最后一个数据当成是未排序序列 2 从
  • openblas第一弹:openblas 使用说明和常用接口介绍

    openblas 使用说明 openblas 是一个开源的矩阵计算库 包含了诸多的精度和形式的矩阵计算算法 就精度而言 包括float和double 两种数据类型的数据 其矩阵调用函数也是不一样 不同矩阵 其计算方式也是有所不同 姑且认为向