分享好友 最新动态首页 最新动态分类 切换频道
CBLAS编译安装与使用举例
2024-12-26 22:42

在Github上看到有人用BLAS library优化自己的源码,对此产生了强烈兴趣。

CBLAS编译安装与使用举例

准备自己动手实践一下,网上搜索了一大堆编译安装BLAS教程的资料,没一个靠谱的,编译过程中遇到一堆的问题。因为自己没有root权限,所以只能在home目录中本地编译使用cblas,然后本地链接编译得到的库文件到应用程序。

最后自己凭着直觉连蒙带猜,终于把BLAS与CBLAS装上,并投入到实例中优化运行应用程序。填补了很多Linux知识。 

首先要解释一下BLAS,CBLAS与LAPAXK之间的区别与联系。

  • BLAS(Basic Linear Algebra Subprograms)库,是用Fortran语言实现的向量和矩阵运算库,是许多数值计算软件库的核心, 但也有一些其它的包装, 如cblas是C语言, 也有C++的包装, boost/ublas 是C++ template class的实现; 另外还有一些特别的实现, 如intel MKL, AMD core math library blas就是做向量、矩阵的基本运算,如加、减、乘等操作。
  • CBLAS是BLAS的C语言接口。
  • LAPACK(Linear Algebra PACKage)库,是用Fortran语言编写的线性代数计算库,包含线性方程组求解(AX=b)、矩阵分解、矩阵求逆、求矩阵特征值、奇异值等。该库用BLAS库做底层运算,许多高层的数学库都用BLAS和LAPACK做底层。 

CBLAS只是BLAS的C语言版本,所以CBLAS安装需要先装BLAS

安装步骤

  • 确保机器上安装了gfortran编译器
  • 下载blas, cblas源代码,都可以在官网http://www.netlib.org/ 上找到
  • 解压后得到两个文件夹
  • 编译

1. 编译blas,进入BLAS目录执行下面的命令

    gfortran -c  -O3    *.f                # 编译所有的 .f 文件,生成 .o文件  
    ar rv libblas.a      *.o                # 链接所有的 .o文件,生成 .a 文件 

2. 编译cblas,进入CBLAS目录,首先根据自己的操作系统平台,将某个Makefiel.XXX复制为Makefile.in,XXX表示操作系统。如果是Linux,那么就将Makefile.LINUX 复制为 Makefile.in。

    cp https://blog.csdn.net/zouyu1746430162/article/BLAS/libblas.a  testing  # 将上一步编译成功的 libblas.a 复制到 CBLAS目录下的testing子目录  
    make                                            # 编译所有的目录 

此时会在CBLAS安装目录下的lib目录中产生一个静态链接库文件cblas_LINUX.a,这个库文件和上面得到的libblas.a文件就是我们所需要的。另外还需要的就是CBLAS/include中的cblas.h头文件。将三个文件全部拷贝到,你需调用的应用程序源码目录中。

 

到此BLAS和CBLAS的安装任务完成,可以看出,这里安装的实际含义是编译得到两个库文件和一个头文件,再将这三个文件放置到gcc的搜索路径中去(例如可以在拷贝到/esr/local/lib,或在/usr/local/lib下做一个快捷链接,也可直接像我上面那样复制的)。

cd /usr/local/lib
ln -s  https://blog.csdn.net/zouyu1746430162/article/details/CBLAS/lib/cblas_LINUX.a  https://blog.csdn.net/zouyu1746430162/article/details/libcblas.a

简单运用

CBLAS/BLAS分为3个level,level1是用于向量的计算,level2是用于向量和矩阵之间的计算,level3是矩阵之间的计算。比如计算矩阵的乘法就是属于level3,这里就用矩阵乘法来学习使用CBLAS。

计算矩阵乘法的函数之一是 cblas_sgemm,使用单精度实数,另外还有对应双精度实数,单精度复数和双精度复数的函数。在此以 cblas_sgemm为例。

函数定义为

void cblas_sgemm ( const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
                                    
                                        const enum CBLAS_TRANSPOSE TransB, const int M, const int N,

                                        const int K, const float alpha, const float *A,

                                        const int lda, const float *B, const int ldb,

                                        const float beta, float *C, const int ldc  )

此函数计算的是 C = alpha*op( A )*op( B ) + beta*C,

const enum CBLAS_ORDER Order,这是指的数据的存储形式,在CBLAS的函数中无论一维还是二维数据都是用一维数组存储,这就要涉及是行主序还是列主序,在C语言中数组是用行主序,fortran中是列主序。我还是习惯于是用行主序,所以这个参数是用CblasRowMajor,如果是列主序的话就是CblasColMajor。

 

const enum CBLAS_TRANSPOSE TransA和 const enum CBLAS_TRANSPOSE TransB,这两个参数影响的是op( A )和op( B),可选参数为CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113,其中TransA = CblasNoTrans, op( A ) = A,TransA = CblasTrans, op( A ) = A',TransA = CblasConjTrans, op( A ) = A'。 TransB类似。

const int M,矩阵A的行,矩阵C的行
const int N,矩阵B的列,矩阵C的列
const int K,矩阵A的列,矩阵B的行
const float alpha, const float beta,计算公式中的两个参数值,如果只是计算C=A*B,则alpha=1,beta=0

const float *A, const float *B, const float *C,矩阵ABC的数据

计算两个简单矩阵的乘法。
A:
1,2,3
4,5,6
7,8,9
8,7,6
B:
5,4
3,2
1,0

// <strong>因为程序是C++,而CBLAS是C语言写的,所以在此处用extern关键字</strong>
extern"C"
{
    #include"cblas.h"      // <strong>由于cblas.h文件已经拷贝到工作目录中,只需用双引号 </strong> 
}
#include<iostream>
using namespace std;
int main(void) {
    const enum CBLAS_ORDER Order=CblasRowMajor;
    const enum CBLAS_TRANSPOSE TransA=CblasNoTrans;
    const enum CBLAS_TRANSPOSE TransB=CblasNoTrans;
    const int M=4;//A的行数,C的行数
    const int N=2;//B的列数,C的列数
    const int K=3;//A的列数,B的行数
    const float alpha=1;
    const float beta=0;
    const int lda=K;//A的列
    const int ldb=N;//B的列
    const int ldc=N;//C的列
    const float A[K*M]={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(Order, TransA, TransB, 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]<<"/t";
      }
      cout<<endl;
    }
  
    return EXIT_SUCCESS;
}

在编译的时候需要带上cblas_LINUX.a和libblas.a 

比如:g++ main.cpp cblas_LINUX.a libblas.a -o main

如果是写成Makefile文件,则修改变量OBJS = main.o cblas_LINUX.a libblas.a

当然,这里假定是这两个.a文件是放在可以直接访问的位置,或者写全路径也可以。

应用优化

这个有时间再补充,现在这个时间比较尴尬。不过确实对应用起到了优化作用,运行时间从160多s降到了115s,只是简单将串行代码用函数clabs_caxpy替代。

最新文章
管家婆2024最新资料,移动\电信\联通 通用版:iPad26.53.18
  随着科技的发展和商业环境的不断变化,企业管理软件的需求日益增长。《管家婆》作为国内知名的财务管理软件,其在财务、库存、销售等领域的应用极为广泛。本文将为大家介绍《管家婆2024最新资料》,探讨其新功能、新特点,并分析其对企
江苏濠汉申请基于三维点云的输电线路单图测距专利,提高输电线路安全性
金融界2024年12月12日消息,国家知识产权局信息显示,江苏濠汉信息技术有限公司申请一项名为“基于三维点云的输电线路单图测距方法及系统”的专利,公开号 CN 119107351 A,申请日期为2024年11月。专利摘要显示,本发明公开了基于云的单图
济南企业网络曝光度提升首选——专业SEO外包服务
济南SEO外包服务,专注于为企业提供专业网络曝光提升方案。通过优化搜索引擎排名,增强企业在线影响力,助力企业高效拓展市场,提升品牌知名度。随着互联网的快速发展,越来越多的企业开始重视网络营销,希望通过网络平台拓展市场,提高品
这些残破不堪的漆器,如何回到“颜值巅峰”|文物修复
  在漫长的历史长河中,许多漆器文物面临着损坏和失真的风险。漆器修复是对这些老物件进行保护和再生的必要手段,也是对历史和文化的传承和弘扬。  华夏第一建鼓:让碎片在指尖重生  在荆州市文物保护中心,楚氏漆器修复技艺传承人杜
这些公司是2024年搜索引擎概念股龙头,收好了!(12月16日)
搜索引擎概念股有哪些?据南方财富网概念查询工具数据显示,搜索引擎概念股有:岩山科技:2024年第三季度,公司实现总营收1.45亿,同比增长4.58%,净利润为537.73万,毛利润为4669.15万。公司主要产品和服务有软件外包服务、系统集成、搜索
SEO排名点击器,揭秘流量提升的神秘工具
SEO排名点击器,一款神秘工具,助力网站快速提升流量与曝光度。通过模拟真实用户点击,优化搜索引擎排名,让网站脱颖而出,成为提升网络影响力的秘密武器。掌握此工具,轻松抢占搜索市场,吸引海量流量。在互联网时代,网站流量和曝光度成
郑州SD-091324-B智能操控装置工作原理+2025排名一览
郑州SD-091324-B智能操控装置工作原理+2025排名一览 1. 产品概述 - WSK - S-(TH)智能温湿度控制器是一种能够对环境温湿度进行精确监测和控制的设备。它结合了先进的传感器技术和智能控制算法,用于维持环境温湿度在设定的范围内。2. 功能特
百度搜索推广与蜘蛛池,解锁高效网络营销策略,百度推广蜘蛛屯
百度搜索推广与蜘蛛池是高效网络营销策略的关键组成部分。通过百度搜索推广,企业可以精准定位目标用户,提高品牌曝光率和转化率。而蜘蛛池则是一种高效的网站抓取工具,可以快速收集目标网站的信息,为推广策略提供数据支持。结合两者,企
网络爬虫违法行为的最新案例解析:丁某案件详情与刑法规制
在信息技术蓬勃发展的今天,网络爬虫技术的应用已经渗透到了我们生活的方方面面。然而,随着这种技术的普及,涉及到非法网络爬虫行为的刑事案例也开始屡见不鲜。近日,最高人民法院对一起名为《丁某提供侵入计算机信息系统程序案》进行了深
苹果开发者账号遭遇封禁?解决方案与规避封号风险的实用建议
在iOS应用开发的世界里,苹果开发者账号是每位开发者通往成功的关键。然而,有时由于各种原因,开发者账号可能会遭遇封禁,这不仅会影响应用的分发和更新,还可能给开发者带来巨大的经济损失和声誉损害。本
相关文章
推荐文章
发表评论
0评