龙空技术网

基础线性代数程序集BLAS简介

海淘世界 133

前言:

此刻看官们对“amd科学计算mkl”可能比较关心,看官们都想要学习一些“amd科学计算mkl”的相关知识。那么小编也在网络上搜集了一些有关“amd科学计算mkl””的相关知识,希望大家能喜欢,姐妹们快快来学习一下吧!

BLAS(Basic Linear Algebra Subprograms基础线性代数程序集)是进行向量和矩阵等基本线性代数操作的事实上的数值库。这些程序最早在1979年发布,是LAPACK(Linear Algebra PACKage)的一部分,便于建立功能更强的数值程序包。BLAS库在高性能计算中被广泛应用,由此衍生出大量优化版本,如Intel的Intel MKL,AMD的ACML,Goto BLAS和ATLAS等非硬件厂商优化版本,以及利用GPU计算技术实现的CUBLAS,基于GotoBLAS的OpenBLAS等。

BLAS 的官网是 Netlib, 可以浏览完整的说明文档以及下载源代码. 这个版本的 BLAS 被称为 reference BLAS, 运行速度较慢, 通常被其他版本用于衡量性能. 对于 Intel CPU 的计算机, 性能最高的是 Intel 的 MKL (Math Kernel Library) 中提供的 BLAS. MKL 虽然不是一个开源软件, 但目前可以免费下载使用. 如果想要免费开源的版本, 可以尝试 OpenBlas 或者 ATLAS2. 另外, 无论是否使用 MKL, BLAS 的文档都推荐看 MKL 的相关页面

BLAS按照功能可以分为以下三种级别:

BLAS1。支持向量与向量之间相关的操作。主要是为了编程方便,在实际计算中使用很少,因为不能在大多数机器上实现高性能。BLAS2。支持矩阵与向量之间相关的操作。在O(n2)时间复杂度实现O(n2)的浮点运算。在许多向量机上能实现接近峰值的性能。然而在多级存储器的处理器上则性能一般,因为受限于数据在存储器间的迁移。BLAS3。支持矩阵与矩阵之间相关的操作。在O(n2)时间复杂度实现O(n3)量级的浮点运算,能充分发挥现代处理器的性能,并且能为用户提供透明的并发机制。BLAS函数介绍

BLAS函数名中的前缀“x”表示参数和返回值的类型:

S一单精度实数D一双精度实数C一单精度复数Z一双精度复数Q一混合精度

其中混合精度由S,D,C,Z组成,最左边表示返回值类型,其余为参数类型。如DROTMG表示的是双精度的平面转换,SSCAL表示的则是单精度的向量缩放。

BLAS 三种接口

在BLAS2和BLAS3的函数中,有以下重要的参数:

INCX: 向量X的存储步长LDA: 矩阵A的存储步长(主维(Leading Dimension)实际占用的空间);TRANS: 矩阵的转置形式,T(实数转置)、N(实数非转置)、C(复数共轭转置)、H(复数共轭非转置)UPLO: 对称阵或三角阵的存储方式,U(上三角)、L(下三角)DIAG: 对角线形式,N(非单位对角线)、U(单位对角线)SIDE: 矩阵在操作中的位置,L(左边)、R(右边)BLAS优化现状

BLAS库在高性能计算中被广泛应用,并由此衍生出了大量的优化版本。

目前主要有两种BLAS库的高效实现手段:第一种是针对不同的平台进行的优化,如gotoBLAS库;第二种足自动调优的思想。它可以通过分析不同平台的性能参数,来自动选择不同的优化方案。通过这种方式形成了通用的BLAS优化版本,如ATLAS(Automatically Tuned LinearAlgebra Soflware)库。近年来随着GPU的发展,出现了利用GPU实现的BLAS库,如基于NVIDIA公司CUDA框架的CUBLUS。

ATLAS库实现了BLAS与LAPACK中绝大多数的函数。它可以自动替指定的处理器找出有效率的方式,用来高效实现BLAS库。目前ATLAS库完成了基于C和FORTRAN两个版本的高效BLAS库实现。gotoBLAS库支持Opteron、Xeon、ltanium、Power、Alpha等平台。并且在Xeon和Opteron平台上,可以同时支持Windows和Linux两种操作系统。gotoBLAS库和ATLAS库都是开源软件,通常来说, gotoBLAS库的性能较高。但是gotoBLAS库针对特定的平台,适用于主流的处理器。因此gotoBLAS库的可移植性很差;而ATLAS库则是通用版本,ATLAS库通过牺牲部分性能来提高可移植性。因此ATLAS库针对特定平台的优化是不够的,并且在ATLAS库中只对某些函数进行了优化。

对比备选:MKL、OpenBLAS、Eigen、Armadillo接口易用程度:Eigen > Armadillo > MKL/OpenBLAS速度:MKL≈OpenBLAS > Eigen(with MKL) > Eigen > Armadillo

其中:

OpenBLAS 没有单核版本,强行指定 OMP_NUM_THREADS=1 性能损失大,不考虑MKL 直接使用学习成本较高,但是性能最强Armadillo 效率和接口易用性不如 EigenEigen 的原生 BLAS/LAPACK 实现速度不如 MKL、OpenBLAS,但是使用 MKL 做后台性能和 MKL 原生几乎一样,所以可以视情况决定是否使用 MKL参考

标签: #amd科学计算mkl