什么是BLAS
BLAS是 Basic Linear Algebra Subprograms (基本线性代数子程序)的首字母缩写,主要用来做基础的矩阵计算,或者是向量计算。它分为三级:
- BLAS 1级,主要是向量与向量的计算
- BLAS 2级,主要是矩阵和向量的计算
- BLAS 3级,主要是矩阵和矩阵的计算,最典型的是A矩阵*B矩阵,得到一个C矩阵。
为什么BLAS是一个非常重要的库或者接口,是因为它是很多科学计算的核心之一。每年做超级计算机的排行榜,都要做LINPACK测试,该测试很多部分就是做BLAS 3级矩阵和矩阵的计算。此外,还有很多科学和工程的模拟,在转换后都变成了一种矩阵上的操作。如果你把矩阵优化的特别好的话,对整个应用的提升,都是非常有帮助的。
广泛用于LAPACK
疑问: 有没有tensor计算?
tensor计算要转化成以上三个级别的计算吗?没有。numpy支持高阶矩阵(多维数组)计算。
注意subprograms这个词,表示线性代数库的子项目
BLAS与深度学习
经过测试,发现Alexnet大部分的时间花费在卷积层(Conv Layer),另外不少时间花在了全连接层(FC layer)。
- 卷基层目前通用的实现是展成矩阵,变成矩阵与矩阵的乘法,就是BLAS 3级。
- 全连接层一般是变成一个矩阵和向量的乘法,也落成了BLAS操作。
也就是说,基于矩阵类学习的深度学习,有90%或者更多的时间是通过BLAS来操作的。当然,随着新的算法出现,卷积层对3*3的卷积核有专门的算法,或者用FFT类类算法也可以做,但是在通用上,展矩阵来做也非常广泛。
疑问: cuda也兼容BLAS接口吗?还是自己独立的接口?
BLAS实现
BLAS只是定义了接口,但是具体的实现其实有很多种。从商业的角度来讲,存在很多商业版本。基本上为了搭配自己的硬件,对其做了更优的优化。常见的商业版本有
- Intel MKL
- AMD ACML
- NVIDIA CUBLAS
- IBM ESSL
开源
- GotoBLAS:(2010年中止开发)
- ATLAS: 美国一所学校开发
- OpenBLAS: 基于GotoBLAS
- BLIS: 基于GotoBLAS扩展出来的一个项目