比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
来源:互联网 发布:mac最好的播放器 编辑:程序博客网 时间:2024/05/24 05:40
对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面:
- (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 来模拟单线程版本,可能会带来一点点的性能下降。
每个测试程序的编译都采用 ”-O4 -msse2 -msse3 -msse4″, 通过设置 OMP_NUM_THREADS 来控制程序使用的线程数量. 除了 OpenBLAS,其他两个库的测试程序都分别有单线程和多线程的编译版本。
- 单线程版本
我在实验中进行了一系列的非稀疏矩阵相乘运算,矩阵规模也逐渐增大,单线程的运行时间如下表所示,其中采用的测试轮数为5轮,其中红色表示性能最好的一组实验结果。
Matrix-DimensionEigenMKLOpenBLAS5000.041590.031220.0305810000.317890.243390.2373015001.045890.814450.7986920002.375671.920361.8710225004.682663.785693.6454830008.280736.426306.29797350013.0747010.250969.98417400019.3455015.2193114.87500450027.5276721.4502421.18227500037.67552 29.3163129.07229
从图中可以看出,OpenBLAS的性能最好,MKL的表现也很不错,而EIGEN的表现却很糟糕。
- 多线程版本
在多线程的测试中,我们采用多个CPU核心来做矩阵乘法运算,所有的结果也同样采用5轮训练,我们采用的CPU核数分别是8,16,32,48。
- Cores = 8
- Cores = 16
- Cores = 32
- Cores = 40
- Cores = 48
可以看出,MKL和OpenBLAS都提供了比较好的性能,MKL性能还更好一点,在各别多线程条件下了,可能某些原因或者我机器设置的问题,出现了各别性能异常,比如小矩阵运算时间反倒比大矩阵运算长,或者更多的线程却不能提供更好的性能。这些情况后面可能还需要查一查。
- 伸缩性
另外,我也测试了使用不同的cpu核数对性能的影响,下面两个图描述了把cpu从1增加到20的条件下,5000×5000的矩阵相乘的时间开销和加速比。
- 结论
就我的测试环境而言,Intel MKL 和 OpenBLAS 似乎是矩阵相乘运算方面性能最佳的 BLAS 库,在多核以及不同规模的矩阵方面都具有较好的伸展性和稳定性,而对于单线程情况,OpenBLAS相比 MKL 在性能上有一定提升。
本文参考 gcdart 的文章,代码可以下载。
- 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- Visual Studio下实现Eigen+Intel MKL的矩阵乘法
- 高性能Numpy/Scipy加速:使用Intel MKL和Intel Compilers或OpenBLAS(待续)
- vs2015+eigen+intel MKL
- CUDA的cublas 和 Intel的MKL 矩阵运算对比
- 高性能Numpy/Scipy:使用Intel MKL和Intel Compilers
- INTEL MKL中的矩阵特征值和特征向量函数的调用和测试
- intel MKL的安装和使用
- 基于 intel MKL 的对称矩阵特征值求解器
- 基于 intel MKL 的高性能随机数生成器
- VS2012上使用intel mkl矩阵
- Intel MKL 稀疏矩阵求解PARDISO 函数
- intel MKL 和visual studio 2013的配置
- opencv 矩阵相乘, matlab矩阵相乘,以及自己写的矩阵相乘的时间比较
- MKL的矩阵运算
- Eigen教程7 - Eigen和Matlab的比较
- Python中的函数(1)
- 170525 逆向-数学运算符的优化,CrackMe(2)
- 05---权限管理和FACL
- 计数排序和基数排序
- 2.4 整体方案的综合评估
- 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- 【CSS属性大全】
- linux 离线安装gcc
- java-map转bean
- POI 其他形状
- tomcat+nginx+redis实现均衡负载、session共享(二)
- 设计模式学习:建造者模式
- Swing学习----------实现多个组件的绑定
- 运行./configure后出现如下错误 checking for working aclocal... missing