BLAS、OpenBLAS、ATLAS、MKL
BLAS
BLAS的全称是Basic Linear Algebra Subprograms,中文可以叫做基础线性代数子程序。它定义了一组应用程序接口(API)标准,是一系列初级操作的规范,如向量之间的乘法、矩阵之间的乘法等。许多数值计算软件库都实现了这一核心。
BALS是用Fortran语言开发的,Netlib实现了BLAS的这些API接口,得到的库也叫做BLAS。Netlib只是一般性地实现了基本功能,并没有对运算做过多的优化。
LAPACK
CBALS & CLAPACK
前面BLAS和LAPACK的实现均是用的Fortran语言。为了方便c程序的调用,Netlib开发了CBLAS和CLAPACK。其本质是在BLAS和LAPACK的基础上,增加了c的调用方式。
ATLAS
上面提到,可以将BLAS和LAPACK看做是接口规范,那么其他的组织、个人和公司,就可以根据此规范,实现自己的科学计算库。
开源社区实现的科学计算(矩阵计算)库中,比较著名的两个就是atlas和openblas。它们都实现了BLAS的全部功能,以及LAPACK的部分功能,并且他们都对计算过程进行了优化。
Atlas (Automatically Tuned Linear Algebra Software)能根据硬件,在运行时,自动调整运行参数。
Automatically Tuned Linear Algebra Software,自动化调节线性代数软件。可以根据硬件,在运行时,自动调整运行参数。
OpenBLAS
Intel MKL
英特尔数学核心函数库,Intel Math Kernel Library
Intel的MKL和AMD的ACML都是在BLAS的基础上,针对自己特定的CPU平台进行针对性的优化加速。以及NVIDIA针对GPU开发的cuBLAS。
对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面:
- (Dense/Sparse) Matrix – Vector product (稠密/稀疏)矩阵 - 向量 产品
- (Dense/Sparse) Matrix – Dense Matrix product
这篇文章的主要目的就是比较几个常见的BLAS库的矩阵运算性能,分别是
- EIGEN : Eigen 是一个线性算术的C++模板库。功能强大、快速、优雅以及支持多平台,可以使用该库来方便处理一些矩阵的操作,达到类似matlab那样的快捷。 需要定义 EIGEN_NO_DEBUG 阻止运行时assertion。编译单线程版本需要开启 -DEIGEN_DONT_PARALLELIZE. 在试验中,我们采用 EIGEN 原生 BLAS 实现。
- Intel MKL : 英特尔数学核心函数库是一套经过高度优化和广泛线程化的数学例程,专为需要极致性能的科学、工程及金融等领域的应用而设计。它可以为当前及下一代英特尔处理器提供性能优化,包括更出色地与 Microsoft Visual Studio、Eclipse和XCode相集成。英特尔 MKL 支持完全集成英特尔兼容性 OpenMP 运行时库,以实现更出色的 Windows/Linux 跨平台兼容性。在试验中的多线程版本需要链接到 mkl_gnu_thread,而不是 mkl_intel_thread,单线程版本需要链接到 mkl_sequential_thread。
- OpenBLAS: OpenBLAS是高性能多核BLAS库,是GotoBLAS2 1.13 BSD版本的衍生版。OpenBLAS 的编译依赖系统环境,并且没有原生单线程版本,在实验这哦那个,通过设置 OMP_NUM_THREADS=1 来模拟单线程版本,可能会带来一点点的性能下降。
我在实验中进行了一系列的非稀疏矩阵相乘运算,矩阵规模也逐渐增大,单线程的运行时间如下表所示,其中采用的测试轮数为5轮,其中红色表示性能最好的一组实验结果。
Matrix-Dimension | Eigen | MKL | OpenBLAS |
500 | 0.04159 | 0.03122 | 0.03058 |
1000 | 0.31789 | 0.24339 | 0.23730 |
1500 | 1.04589 | 0.81445 | 0.79869 |
2000 | 2.37567 | 1.92036 | 1.87102 |
2500 | 4.68266 | 3.78569 | 3.64548 |
3000 | 8.28073 | 6.42630 | 6.29797 |
3500 | 13.07470 | 10.25096 | 9.98417 |
4000 | 19.34550 | 15.21931 | 14.87500 |
4500 | 27.52767 | 21.45024 | 21.18227 |
5000 | 37.67552 | 29.31631 | 29.07229 |
从图中可以看出,OpenBLAS的性能最好,MKL的表现也很不错,而EIGEN的表现却很糟糕。
在多线程的测试中,我们采用多个CPU核心来做矩阵乘法运算,所有的结果也同样采用5轮训练,我们采用的CPU核数分别是8,16,32,48。
Matrix-Dimension | Eigen | MKL | OpenBLAS |
1000 | 0.05658 | 0.03955 | 0.06468 |
2000 | 0.34981 | 0.26200 | 0.23879 |
3000 | 1.20781 | 0.85449 | 0.80737 |
4000 | 2.65490 | 1.90273 | 1.88366 |
5000 | 5.03304 | 3.73005 | 3.67966 |
6000 | 8.78654 | 6.52766 | 6.31980 |
7000 | 13.55611 | 10.13758 | 10.07120 |
8000 | 19.81634 | 15.03530 | 14.89440 |
9000 | 29.11329 | 21.54359 | 21.26992 |
10000 | 39.01563 | 29.93075 | 29.22034 |
Matrix-Dimension | Eigen | MKL | OpenBLAS |
1000 | 0.05708 | 0.02185 | 0.03897 |
2000 | 0.26694 | 0.13807 | 0.30461 |
3000 | 0.70686 | 0.43692 | 0.93511 |
4000 | 1.45129 | 0.97720 | 2.06761 |
5000 | 2.59477 | 1.90665 | 2.49280 |
6000 | 5.43438 | 3.30945 | 7.01299 |
7000 | 8.01124 | 5.17896 | 6.84496 |
8000 | 11.22280 | 7.81439 | 12.99240 |
9000 | 15.15625 | 11.08906 | 21.82488 |
10000 | 19.91151 | 15.22039 | 30.86908 |
Matrix-Dimension | Eigen | MKL | OpenBLAS |
1000 | 0.04003 | 0.02792 | 0.02244 |
2000 | 0.51213 | 0.14363 | 0.16990 |
3000 | 1.13647 | 0.51105 | 0.54635 |
4000 | 1.58793 | 1.10219 | 1.26401 |
5000 | 2.88341 | 2.07923 | 2.48735 |
6000 | 5.92779 | 3.42785 | 4.26794 |
7000 | 7.91650 | 5.32176 | 6.69391 |
8000 | 11.96467 | 7.65395 | 9.98951 |
9000 | 17.45420 | 10.28328 | 14.14108 |
10000 | 23.31314 | 15.10077 | 19.34171 |
Matrix-Dimension | Eigen | MKL | OpenBLAS |
1000 | 0.03691 | 0.02877 | 0.01779 |
2000 | 0.37739 | 0.14037 | 0.13655 |
3000 | 0.61183 | 0.41057 | 0.44113 |
4000 | 2.43670 | 1.02625 | 1.01414 |
5000 | 3.18099 | 1.91092 | 1.97898 |
6000 | 8.24002 | 2.96157 | 3.40685 |
7000 | 11.59889 | 4.68312 | 5.38634 |
8000 | 9.50613 | 6.98434 | 7.95971 |
9000 | 14.83066 | 9.60891 | 11.37585 |
10000 | 23.67187 | 15.52151 | 15.52680 |
Matrix-Dimension | Eigen | MKL | OpenBLAS |
1000 | 0.03635 | 0.02398 | 0.01548 |
2000 | 0.36417 | 0.13408 | 0.11496 |
3000 | 2.32388 | 0.39291 | 0.36669 |
4000 | 2.32030 | 1.13244 | 0.85790 |
5000 | 2.08269 | 1.75812 | 1.66785 |
6000 | 8.70766 | 2.98694 | 2.85609 |
7000 | 8.23543 | 4.62340 | 4.53257 |
8000 | 21.18603 | 6.68886 | 6.72820 |
9000 | 19.86504 | 9.59635 | 9.50597 |
10000 | 16.10920 | 13.13038 | 13.04432 |
另外,我也测试了使用不同的cpu核数对性能的影响,下面两个图描述了把cpu从1增加到20的条件下,5000×5000的矩阵相乘的时间开销和加速比。
BLAS、OpenBLAS、ATLAS、MKL相关推荐
- 解救开发者!鲲鹏、ModelArts、Atlas、5G MEC硬核来袭……
这是一个充满机遇与挑战的时代,人工智能.智能计算.边缘计算--各种各样的创新技术在数字化浪潮中快速生根发芽,面对火热的前沿科技,众多企业与开发者,一面虎视眈眈想要登上前沿科技的快车,一面又不得不面对现 ...
- 1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习
ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding va ...
- Google、亚马逊、微软 、阿里巴巴开源软件一览
Google.亚马逊.微软 .阿里巴巴开源软件一览 大公司为什么要发布开源项目?一是开源能够帮助他人更快地开发软件,促进世界创新,主要是社会价值层面的考虑.二是开源能够倒逼工程师写出更好的代码.三是开 ...
- 数学建模最新教育数据分享及数据查询方法(数据来源:世界银行、世界数据图册、联合国教科文组织、国家统计局)
授人以鱼不如授人以渔,分享最新数据获取方法,持续更新,点关注不迷路! 世界银行教育数据下载链接:https://download.csdn.net/download/qq_37372155/15081 ...
- 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测
智能交通组合拳–飞桨实现车辆类别/车牌/车速检测.跨境头跟踪.车流密度检测.逆行检测 总体简介 这个项目的代码和文件全部都已经上传到百度aistudio上,有需要的伙伴的可以搜索下面的链接找到,那里已 ...
- Mendix敏捷开发零基础学习《二》-进阶(Microflow微流、表单验证、运算符、条件判断、数据嵌套、触发器、Debug问题跟踪、版本管理)
目录结构 Mendix敏捷开发零基础学习<二> 一.Microflow微流 1.引言 2.常见的功能 3.微流可以做那些事情? 3.1 举例1(用微流打开新增页面) 3.2 举例2(用微流 ...
- etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
1. etcd 项目结构和功能 etcd 项目代码的目录结构如下: $ tree ├── auth ├── build ├── client ├── clientv3 ├── contrib ├── ...
- VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、
1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...
- 计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练
计图(Jittor) 1.1版本:新增骨干网络.JIT功能升级.支持多卡训练 深度学习框架-计图(Jittor),Jittor的新版本V1.1上线了.主要变化包括: • 增加了大量骨干网络的支持,增强 ...
- 对端边缘云网络计算模式:透明计算、移动边缘计算、雾计算和Cloudlet
对端边缘云网络计算模式:透明计算.移动边缘计算.雾计算和Cloudlet 概要 将数据发送到云端进行分析是过去几十年的一个突出趋势,推动了云计算成为主流计算范式.然而,物联网时代设备数量和数据流量的急 ...
最新文章
- 百度数据挖掘研发工程师实习笔试面试
- 安装mysql5.5时常见错误--缺失make
- 光伏行业春意盎然?一文看懂行业家底和五大趋势
- C++ 控制结构和函数(一) —— 控制结构
- 微会显示服务器当前线路忙,免费电话之争:触宝电话/微会谁更强
- 华为lab-rs-v1-2.4_OSPF提升
- php v9 用于静态页查询登陆状态以及用户信息的ajax接口,phpcms V9如何判断用户是否登录以及登陆后的标签写法问题 - 小众知识...
- BP神经网络代码和原理
- UA MATH524 复变函数4 复级数与复变函数的积分基础
- java怎么取map中的key值,Java获取map中key和value的方法
- php 极简 新闻,开源极简新闻信息分享工具
- 人心惶惶:利用新西兰特大枪击案进行网络钓鱼攻击的前因后果
- 计算机应用期刊三次外审,期刊论文一般外审几次
- Python---python3.7.0---如何安装PIL
- Docker 无法启动 Failed to start LSB: Create lightweight, portable, self-sufficient containers.
- 给排水计算机应用电子版,给排水规范大全
- ASP.NET Maker 2019破解版(ASP.NET代码生成工具)
- Magic Number Group
- video和audio标签
- 最简单、最详细的重装win10系统教程
热门文章
- java设置job时间每分钟_Spring设置定时任务时,关于执行时间的规则设置
- html如何设置自动对齐,HTML5 教程之CSS 水平对齐(Horizontal Align)
- 转移到ios下载安卓_安卓应用转移到ios
- mrtg linux安装,RedHat Linux安装mrtg监控主机流量
- Solr-Solrj简单使用
- 正则表达式高阶技巧之环视(使用python实现)
- java xsd 解析 xml文件_xsd解析xml
- excel数据复制粘贴入PL/SQL Developer的方法
- java release_使用release自动打包发布正式版详细教程
- FPGA学习推荐网站