BLAS学习

导师突然通知要开始关于blas的讨论班,之前甚至都没听说过blas这个词,又要开始新一波的锤炼小白之路了…

1. BLAS简介

首先BLAS的全称是 Basic Linear Algebra Subprograms,即 基础线性代数子程序库,其中包含了一系列基本的线性代数运算函数的接口,因此BLAS也会被称为 矩阵运算库

需要注意,BLAS是一个接口的标准而不是某种具体实现,也就是说即便不同版本的BLAS库可以实现相同的接口和功能,但每个接口内部的算法和程序是可以不同的,即具体实现不相同。目前存在几种不同的BLAS (性能对比可参考矩阵运算库之间的性能区别):

1.1 两种基本运算库

  • BLAS:其官网是 Netlib,Netlib用Fortran语言实现了BLAS的这些API接口,但只是一般性地实现了基本功能,并没有对运算做过多的优化,因此这个版本的 BLAS 被称为 reference BLAS,运行速度较慢,通常被其他版本用于衡量性能。之后Netlib又产生了C 语言的版本 cBLAS,除一些接口外与BLAS之间并没有太大的区别。
  • LAPACK:其官网也是 Netlib,是Netlib以BLAS为底层利用Fortran语言实现的另一矩阵运算库,该库相比于BLAS库提供了更为丰富的计算工具,其运行效率也要比BLAS库高。对应cBLAS,也产生了相应的cLAPACK

1.2 三种高级运算库

  • MKL:其官网是 MKL(Math Kernel Library),它是基于英特尔® C++和Fortran编译器构建而成,底层包含了BLAS、LAPACK、ScaLAPACK(面向集群的 LAPACK 分布式内存并行版本)、PARDISO(该并行直接稀疏矩阵解算器的三个阶段均实现了线程化)、DFTs(离散傅立叶变换)、VML(矢量数学库)、VSL(矢量统计学库),因此MKL提供的 BLAS 可以认为是当前性能最高的矩阵运算库。MKL 虽然不是一个开源软件,但目前可以免费下载使用。
  • Armadillo:其官网是 C++ library for linear algebra & scientific computing,与Matlab相似,是一个易于使用的C++矩阵库。其底层包含了LAPACK、BLAS和 ATLAS(Automatically Tuned Linear Algebra Soft) 封装包,支持MKL和 OpenBLAS 等诸多高性能版本。
  • Eigen:其官网是 C++ template library for linear algebra,Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它采用源码的方式提供给用户使用,只需要包含Eigen的头文件即可使用。它支持以BLAS/LAPACK作为底层 (EIGEN_USE_BLAS、EIGEN_USE_LAPACKE),也支持以MKL作为底层 (EIGEN_USE_MKL_ALL),使用起来非常的方便。

1.3 对比

没有时间打字了,就直接截图过来了,上面给了参考链接,这里再放一遍 (矩阵运算库之间的性能区别)。

看到现在感觉MKL是最强的,在 BLAS简介 中看到作者说无论使用哪种软件,都推荐阅读一下 MKL中BLAS的说明文档
在这里插入图片描述

### 关于 BLAS 库的使用说明 BLAS(Basic Linear Algebra Subprograms)是一个用于执行基本线性代数运算的标准接口集合。它被广泛应用于科学计算领域,尤其是在数值分析和高性能计算中。 #### BLAS 的层次结构 BLAS 被分为三个主要级别,分别对应不同复杂度的操作[^3]: - **Level 1**: 向量操作,例如 `y = α * x + y`。 - **Level 2**: 矩阵与向量操作,例如 `y = α * A * x + β * y`。 - **Level 3**: 矩阵与矩阵操作,例如 `C = α * A * B + C`。 这些级别的划分使得开发者可以根据具体需求选择合适的函数来优化性能。 --- #### BLAS 库的下载与安装 BLAS 并不是一个单一的实现,而是一组标准接口。因此,实际应用中通常会选用某个具体的实现版本。以下是几个常见的 BLAS 实现及其获取方式: 1. **Netlib BLAS** Netlib 提供了一个基础版的 BLAS 实现,适用于学习或测试目的。可以从其官方网站下载源码并编译: ```bash wget http://www.netlib.org/blas/blas.tgz tar zxvf blas.tgz make ``` 2. **OpenBLAS** OpenBLAS 是一个高度优化的开源 BLAS 实现,支持多种硬件架构。可以通过包管理器安装或手动编译: - Ubuntu/Linux: ```bash sudo apt-get install libopenblas-dev ``` - 手动编译: ```bash git clone https://github.com/xianyi/OpenBLAS.git cd OpenBLAS make && make install ``` 3. **ATLAS (Automatically Tuned Linear Algebra Software)** ATLAS 自动调整以适应特定硬件环境下的最佳性能。可以尝试通过配置脚本来检测加速库: ```bash ./configure --prefix=/path/to/install --with-blas=libatlas.so make && make install ``` 4. **Intel MKL (Math Kernel Library)** Intel MKL 提供了针对英特尔处理器的高度优化 BLAS 实现。可通过 Intel 官方网站免费注册获得许可证,并按照文档指导完成安装。 --- #### 配置 BLAS 加速库 某些情况下可能需要显式指定使用的 BLAS 库。例如,在构建软件时可以通过命令行选项传递路径信息[^2]: ```bash ./configure --with-blas=/path/to/libblas.so ``` 如果系统自动探测失败,则需确认环境变量设置正确无误。对于 Linux 用户来说,这通常涉及修改 `LD_LIBRARY_PATH` 和链接动态共享对象文件的位置。 --- #### 示例代码:调用 BLAS 进行简单矩阵乘法 以下展示如何利用 CBLAS 接口完成两个矩阵相乘的任务[^1]: ```c #include <stdio.h> #include <cblas.h> int main() { int m = 2, n = 2, k = 2; double alpha = 1.0, beta = 0.0; // 初始化输入矩阵 A[m*k], B[k*n] double A[] = {1, 2, 3, 4}; double B[] = {5, 6, 7, 8}; // 输出矩阵 C[m*n] double C[4]; cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, A, k, B, n, beta, C, n); printf("Resultant matrix:\n"); for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ printf("%f ", C[i*n+j]); } printf("\n"); } return 0; } ``` 此程序展示了 Level 3 中典型的 GEMM 操作 (`General Matrix Multiply`)。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值