最受青睐的计算机代码“之”BLAS

本文介绍了基础线性代数子程序(BLAS)的历史和重要性,它为高性能计算提供了标准化的向量和矩阵运算。BLAS的发展始于1979年,简化了复杂的科学计算,后来OpenBLAS等优化库的出现进一步提升了计算效率。BLAS在科学计算软件栈中扮演核心角色,支撑着线性代数、矩阵运算和各种科学问题的解决。此外,文章还提及了相关软件如MATLAB和LAPACK,以及它们在数学计算中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​好友说:“要易懂,大多数人看的懂,还要带有趣味性,这就像杨振宁和霍金的对比一样,霍金的演讲带趣味性,听众多,名气大。比如,高性能计算和太空宇宙的关系,和生物医学的关系,有这些举例,那被阅读的次数会多很多”

前言:

为什么向量、矩阵运算是计算机软件非常重要的基础运算函数集呢?

让我们先讲标量,标量就是描述一个事物,只需要数值大小就行。例如一个苹果,一斤苹果,一年365天,如果要就行运算,一个算盘或计算器就搞定了,学会了这个可以做个小卖部老板了。

但,更多时候描述一个事物,往往一个量不够,需要更多特征量。例如物理要描述一个力,就有力的大小和方向;一种颜色需要红、绿、蓝三个量;在一个二维空间要描述一条线段、一个面,在一个三维空间描述一个立体结构;一天的股市交易数据等等、等等。于是,数学家通过上千年的努力构建了“向量”这个人类最强的数学概念。可以说懂标量做个小店老板。只有懂向量,你才懂算法是什么,你也将对世界有一个全新的认识。

另外,线性代数是数学的一个基础,也是整个科学的基础,因为人类的知识几乎都是建立在线性的基础上的。这是什么含义?线性代数是你所见到的视频、音频、人工智能所有计算机软件技术的基础。而矢量、向量,向量运算贯穿整个线性代数。线性代数要学习的内容就是如何解决线性问题,如何把复杂问题线性化是别的学科的内容,比如《微积分》、《信号与系统》等。

正文:

今天我来聊聊最受青睐的计算机代码排名第五的BLAS那些事情。BLAS是Basic Linear Algebra Subprograms的简写,它是一组线性代数计算中通用的基本运算操作函数集合。

---- BLAS简史 ----

(1979年)

科学计算通常利用向量和矩阵进行相对的简单数学运算,但计算量还是很大。而在上世纪70年代,科学界缺乏一套通用的计算工具来执行这些运算。所以科学界的程序员们要花时间编写完成基本数学运算的代码,而无法专心研究科学问题。但是编程世界需要一个标准。于是,1979年,出现了基础线性代数程序集(Basic Linear Algebra Subprograms, BLAS)[6]。这一标准一直发展到了1990年,为向量和后来的矩阵数学定义了一系列基本程序。

田纳西大学的计算机科学家Jack Dongarra认为,BLAS实际上将复杂的矩阵和向量运算简化成类似加减法一样基础的简单计算单元。他是BLAS开发团队的一员。

Cray-1超算:在1979年引入BLAS编程工具前,在加利福尼亚劳伦斯·利弗莫尔国家实验室里的Cray-1超级计算机等机器上工作的研究人员,没有线性代数标准。来源:ScienceHistory Images/Alamy

德克萨斯大学奥斯丁分校的计算机科学家Robert van de Geijn说,BLAS「可能是科学计算领域定义的最重要接口」。除了为常用函数提供标准命名,研究人员还可以确保基于BLAS的代码可以在任何计算机上以同样方式运行。这一标准同时也使得计算机产商可以不断优化BLAS,好在他们的硬件上快速运行。

40多年来,BLAS已经成为了科学计算技术栈的核心,使得科学计算软件得以持续发展。Dongarra说:「它是计算的基础结构。」

(2013年7月20日)

【OpenBLAS wiki】OpenBLAS is an optimized Basic Linear Algebra Subprograms (BLAS) library based on GotoBLAS 21.13 BSD version.

OpenBLAS 是一个基于BSD许可(开源)发行的优化 BLAS 计算库,由张先轶于2013年7月20日发起,并发布OpenBLAS 0.2.7第一个版本,作为OpenBLAS开源项目的发起人和主要维护者,张先轶获2016CCF科学技术奖二等奖 [2] 。BLAS(Basic Linear Algebra Subprograms 基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库(如矢量或矩阵乘法),OpenBLAS是BLAS标准的一种具体实现。

OpenBLAS迄今为止已经释放了三十多个发行版本,获得3700多个star,上千个fork。

2013年8月1日,OpenBLAS 0.2.8 version

2013年7月20日,OpenBLAS 0.2.7 version

......

2016年9月3日,OpenBLAS 0.2.19 ,多核

......

2019年8月19日,OpenBLAS 0.3.7 version

2020年12月13日,OpenBLAS 0.3.13 version

2021年3月18日,OpenBLAS 0.3.14 version

张先轶博士,北京理工毕业,中科院博士, UT Austin和MIT博后研究。CCF高性能计算专委会委员。OpenBLAS开源项目发起人。曾荣获中国计算机学会科技进步二等奖,中国科学院杰出科技成就奖。

我得说这是特意挑的,为此我在网络上搜索了一圈,我是觉得很有趣,有点科学家的气质。好奇,他是左手是在扶墙吗?

https://github.com/xianyi/OpenBLAS

由于文章配图的需要,我搜索了"BLAS"相关的图片,原来BLAS还是一个帅哥。尽管跑题了,因为实在太帅了,也表明我努力探索,所以有了如下图片,期望可以加个鸡腿。


---- BLAS库中函数的三个层次 ----

第一层:函数处理单一向量的计算以及两个向量的计算。层次1函数最初出现在1979年公布的BLAS库中。 

第二层:函数处理矩阵与向量的计算,同时也包含线性方程求解计算。层次2函数公布于1988年。 

第三层:函数包含矩阵与矩阵运算。层次3函数发表于1990年。

由于上文涉及到了向量、矩阵,我好奇对“矩阵、向量、张量”这些奇奇怪怪的名词是否有比较科普的文章,然而没有找到。在https://easyai.tech/ai-definition/vector找到了些图,就从这些图开始聊聊。

标量、向量、矩阵、张量的关系

这4个概念是维度不断上升的,我们用点线面体的概念来比喻解释会更加容易理解:

  • 点——标量(scalar)

  • 线——向量(vector)

  • 面——矩阵(matrix)

  • 体——张量(tensor)

标量

1个苹果,2个苹果,3个苹果

向量

向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。

向量可以有n个特征纬度,于是它可以是这样的:

v={a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19....,an};

“嗨~~~,你打算这么错字数收稿费吗?”

向量,最初被应用于物理学,在物理学和工程学中,几何向量更常被称为矢量。许多物理量都是矢量,比如一个物体的位移,球撞向墙而对其施加的力等等。几何向量的概念在线性代数中经由抽象化,得到更一般的向量概念。

矩阵

我该怎么进一步解释呢?好吧,一堆具有细节特征描述的苹果!

张量

这可怎么办?

运算

这世界上有非常多优美的变换,如果你将他们编程,并可视化,就能得到下图。在数学家眼里,世界皆可用数学来表达!!!

插播:“向量”谁发明的?8位天才数学家,历经2000年完成!亚里士多德(《力学》一书中记载了“速度”的平行四边形法则,3个世纪以后又被海伦证明。物理学把力学元素分成了两类:矢量和标量,这里的力是既有大小又有方向的量,我们称之为矢量,矢量都满足“平行四边形法则”。而像质量等只有大小没有方向的量,我们称之为标量。);17世纪的英国数学家牛顿(Isaac Newton,1643—1727)在其数学名著《自然哲学之数学原理》中准确阐述、证明了力的“平行四边形法则”,给出了力的分解、合成方法,为他的整个力学系统的构建起了很大的作用。18世纪复数在伯努利、欧拉等大家的关注下,才得以广泛的关注,最著名的就有欧拉公式,欧拉公式将指数函数的定义域扩大到了复数域,建立和三角函数和指数函数的关系,被誉为“数学中的天桥”。......

是不是终于可以为挂科找到强大的理由呢?

计算机硬件运算单元的理解水平就是小学一年级,只懂“+-X÷ 移位”这种基本运算,如何计算这些奇奇怪怪的向量、矩阵、三角反三角函数、积分微分、指数对数?这就需要软件来设计这些算法,因为实在太难了,反正当初我是差点挂科了。于是也有了BLAS,LIBM/VML,FFT这些函数库,再形成了一些数学库集合,例如Intel MKL(Math Kernel Library),AMD MCL(Math Core Library),  APL(Arm Performance Libraries),PerfXLab国产自主知识产权的PerfXAPI-MPL(Math Performance Libraries)。

一位硕士生开发数学计算机软件,年收入达10亿美元!知道说谁吗?

上个世纪70年代,计算机在美国的发展进入了快车道,利特就成长于这一年代。利特1978年毕业于麻省理工大学电气工程和计算机科学专业,之后又于1980年在斯坦福大学获得了电气工程学硕士。

在读书期间他开始思考一个问题:如何能让计算机的运算变得更加迅速和简单?为了实现这一理想,他开始全身心地投入到研究工作中。

1984年利特成立公司,他想召集更多志同道合的人一起为共同的理想而奋斗。共同完成创业的梦想,但万事开头难,公司成立初期利特是唯一的一名员工,但他从来没有想过放弃,在他租来的房屋里没日没夜地研究程序和代码,而他的坚持也终于等来了另外两位合伙人,就这样他们三人渐渐将公司运作起来。经过不断地尝试和努力他们终于开发出了公司的第一个也是目前最成功的数学计算机软件——Matlab(数字实验室),这一软件在理工世界中可谓人尽皆知。

之后,公司便开启了“疯狂”的升级和扩充模式。因为新员工的不断加入,迈斯沃克从最初的出租屋转移到马萨诸塞州更大的一间屋子,可还是有很多员工只能在不同的地点远程工作。之后公司又搬到南纳蒂克一栋大楼的顶层,并最终“霸占”了整栋大楼。而现在,公司的足迹已经遍布世界其他地区。

Matlab解决的核心问题是什么呢?其实就是“如何计算这些奇奇怪怪的向量、矩阵、三角反三角函数、积分微分、指数对数等各种计算和方程”。


----这些,你知道吗?---

LAPACK

简介:线性代数库,也是Netlib用fortran语言编写的,其底层是BLAS。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特徵向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。该库的运行效率比BLAS库高。从某个角度讲,LAPACK也可以称作是一组科学计算(矩阵运算)的接口规范。Netlib实现了这一组规范的功能,得到的这个库叫做LAPACK库。

MKL

简介:英特尔MKL基于英特尔® C++和Fortran编译器构建而成,并使用OpenMP*实现了线程化。该函数库的算法能够平均分配数据和任务,充分利用多个核心和处理器。支持Linux/Win。它的底层就有:

  • BLAS:所有矩阵间运算(三级)均面向密集和稀疏 BLAS 实现了线程化。许多矢量间运算(一级)和矩阵与矢量的运算(二级)均面向英特尔® 64 架构上 64 位程序中的密集型矩阵实现了线程化。对于稀疏矩阵,除三角形稀疏矩阵解算器外的所有二级运算均实现了线程化。

  • ...其他忽略,以免BLAS主角不高兴...

Eigen

简介:Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。它支持多平台。Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。

底层:

  • BLAS/LAPACK:支持所有基于F77的BLAS或LAPACK库作为底层(EIGEN_USE_BLAS、EIGEN_USE_LAPACKE)

  • MKL:支持MKL作为底层(EIGEN_USE_MKL_ALL)

  • CUDA:支持在CUDA kernels里使用CUDA

  • OpenMP:多线程优化

关系

  • 狭义的BLAS/LAPACK可理解为用于线性代数运算库的API

  • Netlib实现了Fortran/C版的BLAS/LAPACK、CBLAS/CLAPACK

  • 开源社区及商业公司针对API实现了BLAS(ATLAS、OpenBLAS)和LAPACK(MKL、ACML、CUBLAS)的针对性优化

  • Eigen、Armadillo除自身实现线性代数运算库外还支持上述各种BLAS/LAPACK为基础的底层以加速运算

对比

  • 接口易用程度:Eigen > Armadillo > MKL/OpenBLAS

  • 速度:MKL≈OpenBLAS > Eigen(with MKL) > Eigen > Armadillo

总结一下,这篇文章并没达到自己想要的效果,“基础数学-->应用数学-->计算机科学-->具体的、形象的例子”这个知识链条有点太长了,所以我几乎没办法用较少的时间完成。哪位大神可以帮助呢?请联系我。

为什么要做这个事情呢?

* 一方面是个人的亲身体会,当年在学线性代数、微积分这些奇奇怪怪的东西时,就一句话“我未来又不当数学家,学这个感觉没啥用”。而等我学到自控原理时,才发现数学作为算法的PID是如此的强大。

* 另外一方面,我国有大量的工程师熟练调用各种库去编写一个App和系统,但,我们完全忽略了大量的、优秀的基础软件(就是调用的那些库、框架、算法)的存在和价值;我们也习惯于用“站在巨人肩膀上”的角度去思考创新,但是,高质量的技术创新通常是基于基础技术往前探索的结果。

* 所以,希望用技术科普的方式像大家介绍整个知识体系,尤其希望有更多的学生能对基础技术感兴趣和认可其价值。

--听说张博最近在招徒弟--

对BLAS有兴趣的朋友,联系我manwjh@126.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值