OpenBLAS 的编译运行可参考:https://github.com/xianyi/OpenBLAS/blob/develop/USAGE.md

函数参考:http://netlib.org/blas/

一、BLAS函数接口命名规范(可根据这个找到要调用的函数名称):

该部分转自:https://blog.csdn.net/cocoonyang/article/details/63068108

(1)根据运算对象不同,分为三个类

Level1:

Level 1 函数处理单一向量的线性运算以及两个向量的二元运算。
接口函数名称由前缀+操作简称组成。
例如:SROTG,其中:
            S         -- 标明矩阵或向量中元素数据类型的前缀;
            ROTG -- 向量运算简称。

Level2和Level3:

Level 2 函数处理 矩阵与向量的运算,同时也包含线性方程求解计算。
Level 3 函数包含矩阵与矩阵运算。
接口函数名称由前缀 + 矩阵类型 + 操作简称组成。
例如: SGEMV,其中:
            S      -- 标明矩阵或向量中元素数据类型的前缀;
            GE   -- 矩阵类型
            MV   -- 向量或矩阵运算简称

(2)BLAS库使用的矩阵类型

GE - GEnearl  稠密矩阵
  GB - General Band 带状矩阵

SY - SYmmetric    对称矩阵
  SB - Symmetric Band 对称带状矩阵
  SP - Symmetric Packed  压缩存储对称矩阵

HE - HEmmitian     Hemmitian矩阵,自共轭矩阵
  HB - Hemmitian Band   带状Hemmitian矩阵
  HP - Hemmitian Packed  压缩存储Hemmitian矩阵

TR - TRiangular      三角矩阵
  TB - Triangular Band  三角带状矩阵
  TP - Triangular Packed  压缩存储三角矩阵


二、函数中参数的含义

以下为 openblas 中双精度稠密矩阵向量乘函数,计算式为 y=alpha*A*x+beta*y

void cblas_sgemv(OPENBLAS_CONST enum CBLAS_ORDER order,              //CblasRowMajor或者CblasColMajor(行主序或列主序,默认为行)OPENBLAS_CONST enum CBLAS_TRANSPOSE trans,         //CblasNoTrans或者CblasTrans(矩阵不转置或者转置,需要时会自动转置)OPENBLAS_CONST blasint m,             //矩阵行数OPENBLAS_CONST blasint n,             //矩阵的列数OPENBLAS_CONST float alpha,           //y=alpha*A*x+beta*y中的alphaOPENBLAS_CONST float  *a,             //A矩阵的缓冲区首地址OPENBLAS_CONST blasint lda,           //A矩阵的列数OPENBLAS_CONST float  *x,             //x向量的缓冲区首地址OPENBLAS_CONST blasint incx,          //x里面每次跳跃累加的个数,默认为1OPENBLAS_CONST float beta,            //y=alpha*A*x+beta*y中的betafloat  *y,                            //y的缓冲区首地址OPENBLAS_CONST blasint incy           //y里面每次跳跃累加的个数,默认为1)

三、运行OpenBLAS程序

我是在 Linux 下编译运行的,需要自己链接,过程如下:

1.编译:

gcc ./dgemv_test.c -I/opt/software/libopenblas/include -L/opt/software/libopenblas/lib -o ./dgemv_test.out -lopenblas -lpthread 
(多线程需要链接到pthread)

其中:-I(大写i)后面为 OpenBLAS 所需头文件 <cblas.h> 所在的目录;-L后面为 OpenBLAS 的库文件所在的目录。

2.设置线程数:

在环境变量中设置线程数为n(自己取值,取1为单线程):

export OPENBLAS_NUM_THREADS=4(已确认可行)。

3.运行:

./dgemv_test.out

注:该网站(https://github.com/xianyi/OpenBLAS/blob/develop/USAGE.md)给出了另外两种单线程方法,推测同理可设置多线程,但是没有继续尝试。

可以将23步改成:

a. make USE_THREAD=4(4自己设置线程数,取0为单线程)
b. ./dgemv_test.out openblas_set_num_threads2(2自己设置线程数,取1为单线程)

附上自己测试时候的代码。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <cblas.h>
#include <sys/time.h>
#define BUF_SIZE (1024)
char buf[BUF_SIZE];
int main(int argc, char** argv) {//读取矩阵数据long long n, m, num_items,indx;int row, col;double val;bool flag = false;double *matrix;FILE* fd = fopen(argv[1], "r");while (fgets(buf, BUF_SIZE, fd)) {if (buf[0] == '%') continue;if (flag) {sscanf(buf, "%d %d %le", &row, &col, &val);indx = (row-1)*m+(col-1);matrix[indx] = val;}else {sscanf(buf, "%lld %lld %lld", &n, &m, &num_items);long long nm = n * m * sizeof(double);matrix = (double*)malloc(nm);flag = true;}}fclose(fd);flag = false;//读取向量double *vect_x;long long i = 0;long long v_n,v_n_size;//FILE* fc = fopen(file_vect,"r");FILE* fc = fopen(argv[2],"r");while (fgets(buf, BUF_SIZE, fc)) {if (buf[0] == '%') continue;if (flag) {sscanf(buf, "%le", &val);vect_x[i++] = val;}else {sscanf(buf, "%lld", &v_n);v_n_size = v_n * sizeof(double);vect_x = (double*)malloc(v_n_size);flag = true;}}fclose(fc);//clock()测量你的进程使用的CPU时间,而不是挂钟时间。当你有多个线程同时运行时,你显然可以更快地消耗CPU时间。    //计算时间——开始struct timeval start_t,end_t;double *y = (double*)malloc(v_n_size);int j=0;gettimeofday(&start_t, NULL);//openblas函数计算 for(j=0;j<10;j++){//矩阵数据行列cblas_dgemv(CblasRowMajor, CblasNoTrans, n, m, 1, matrix, m, vect_x, 1, 0, y, 1);//矩阵数据列行//cblas_dgemv(CblasRowMajor, CblasTrans, n, m, 1, matrix, m, vect_x, 1, 0, y, 1);}//计算时间——结束gettimeofday(&end_t, NULL);//计算时间——过程(结束-开始)double total_t_sec, total_t_usec, total_t;total_t_sec = (double)(end_t.tv_sec - start_t.tv_sec);total_t_usec = (double)(end_t.tv_usec - start_t.tv_usec); total_t = total_t_sec + total_t_usec / 1000000.0;printf("Time spent : %f seconds\n", total_t);return 0;
}

OpenBLAS多线程使用教程相关推荐

  1. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

  2. python多线程教程_Python多线程编程教程【2小时学会】

    Python多线程编程教程[2小时学会] 中级共14课 从0开始学习python多任务编程,想了解python高并发实现,从基础到实践,通过知识点 + 案例教学法帮助你想你想迅速掌握python多任务 ...

  3. C# 多线程(菜鸟教程及爱整理)

    C# 多线程--菜鸟教程 线程 被定义为程序的执行路径.每个线程都定义了一个独特的控制流.如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作. 线 ...

  4. Python多线程学习教程

    首先我们来解释一下多线程:多线程我们可以理解为多个进程/多个程序同时运行,多线程最大的好处就是帮助我们提高效率,平常我们1小时完成的任务,通过多线程10分钟就可以完成,甚至更短,这个就取决于你的线程数 ...

  5. [远航笔记流水账]易大漠多线程初级教程086(1-3)

    1.易大漠多线程初级之多线程介绍 什么是多线程 没什么可说的 单线程: 多线程: 2.易大漠多线程初级之函数命令介绍 多线程的4个基础函数: 注意: 1.如果挂起失败 和恢复失败 函数会返回-1  如 ...

  6. matlab openblas,ubuntu上Caffe使用OpenBLAS多线程加速

    一些概念 使用Caffe的模型做分类时,其运算大概是这样:把输入的图像当做矩阵,一直不停的和模型里面的卷积层kernel做卷积,然后推给pooling层做缩放,最后得到分类结果.最耗时的部分应该在于卷 ...

  7. 易语言多线程框架教程

    1.学习计划 2.窗口布局 一 3.窗口布局 二 4.窗口布局 三 超级列表框 一 5.窗口布局 四 超级列表框 二 6.导入信息 7.自动保存读取信息 8.自动保存读取信息 二 9.菜单 10.了解 ...

  8. 一个关于winform多线程的教程(pdf)

    繁体的,不过还是能理解的. 下载 原文:http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/03/26/better-winform- ...

  9. 火山PC多线程学习教程第一章

    前言: 先来偿试下单线程的使用 一.配置模块 右键配置,勾选"JSON数据访问支持" 二.窗口布局 三.普通填充 四.线程填充 五.线程传参 ①方案1 ②方案2 六.演示 例子下载 ...

最新文章

  1. python 进程池pool简单实例
  2. JavaScript之正方教务系统自动化教评[插件-转载]
  3. 湖北大学计算机复试笔试题型,2016年湖北大学计算机与信息工程学院计算机组成原理复试笔试最后押题五套卷...
  4. 信息学奥赛C++语言:整数的个数
  5. 解决http://localhost:3000/favicon.ico 的404 问题(含案例解析)
  6. python标准数据库接口是_Python 数据库接口模块_python 数据库模块_python 数据库接口...
  7. 有没有妈妈生了孩子一点不像自己的,觉得亏吗?
  8. SFTP连接服务器后,PWD显示的目录、是用户的home目录
  9. Win10删除资源管理器左侧的Onedrive图标
  10. 游戏对战平台--吃货大作战
  11. Maven -- dependency详解
  12. 2串口两串口三串口多串口3串口转WiFi透传模块实现多通道与服务器透传
  13. c语言中变量要加引号吗,CMake中引号用法总结
  14. .NET 2.0 调用FFMPEG
  15. ubuntu升级22.04无法启动--ACPI BIOS Error
  16. 为什么没什么人玩呢?凰华学院主校剧情有感
  17. SSM+酒店管理系统的设计和实现 毕业设计-附源码260839
  18. oracle误删数据恢复方法
  19. 计算机操作系统底层相关知识
  20. linux--设置屏幕的锁屏时间

热门文章

  1. 如何通过局域网安装系统(网刻)
  2. 如何把民间借贷行为转化为诈骗报案
  3. QQ、MSN、淘包旺旺、Skype常设对话的html链接代码
  4. 易启动 - 迅载网盘
  5. 用c语言求最大公约数与最小公倍数
  6. TQ210_裸机编程(一)——点亮LED灯
  7. 先进先出页面置换算法详解
  8. 使用 openpyxl 处理 Excel 电子表格
  9. printf格式化输出整数
  10. W5500作为服务器突然断线