R 语言中的OpenBLAS*和英特尔® 数学核心函数库的性能比较

简介

如今,科学行业和商业领域收集和分析了大量的数据,并根据分析结果制定决策。 他们采用数据可视化技术和预测分析,预测未来的可能性和趋势。 R 是一种编程语言,用于计算统计、数据可视化和预测分析 [1]。 由于数据可视化和预测分析属于计算密集型工作,有必要寻找提升计算过程的方法,缩短商业和科技决策的制定时间。 本文对基本线性代数子程序 (BLAS) [2], OpenBlas* 库 [3] 和英特尔® 数学核心函数库(英特尔® MKL)[4].之间的性能差别进行了对比。

性能测试流程

衡量性能的标准是运行测试花费的时间(秒)。 为了对比不同库的性能,我们在配备有英特尔® 至强® 处理器 E5-2697 v4 的系统上执行测试。 首先,加载 OpenBLAS,并执行测试。 然后,加载 Revolution R 和英特尔 MKL,并再次执行测试。 我们设计了简单的测试,以测量运行某些 R 函数所需的时间。 例如,为了测量交叉乘积和矩阵的柯列斯基 [5] 函数的性能,我们遵循以下步骤:

  1. 创建矩阵 A。
  2. 用以下命令测量 A 矩阵交叉乘积的时间:
    system.time (crossprod(A))
  3. 用以下命令测量 A 矩阵运行柯列斯基函数的时间:
    system.time (chol(A))

进行以下测试:

  • 矩阵的交叉乘积(R 函数的交叉乘积)
  • 矩阵的柯列斯基分解(R 函数的柯列斯基分解)
  • 奇异值分解(R 函数的奇异值分解) [6]
  • 主组件分析(R 函数的主组件分析) [7]
  • R 语言的性能指标(此性能指标包含 15 个测试。)

测试配置

硬件

  • 系统: 预生产
  • 处理器: 英特尔至强处理器 E5-2697 v4 @2.3 GHz
  • 内核: 18
  • 内存: 128 GB DDR4

软件

  • RedHat Enterprise Linux* 7.0
  • R 3.2.2
  • Revolution R* 3.2.2
  • OpenBLAS 0.2.14
  • 英特尔 MKL(来源于 revomath-3.2.2)

注: 由于在默认情况下,Revolution R 与英特尔 MKL 相连接,本文利用 Revolution R [8] 测试英特尔 MKL 中的 R 函数。

测试结果


图 1: 对比 OpenBLAS* 和英特尔® 数学核心函数库测试的消耗时间。

图 1 仅显示了 R - benchmark - 25 [14] 测试消耗的总时间。 结果按照英特尔 MKL 性能提升幅度,进行升序排列。


图 2: OpenBLAS* 和英特尔® 数学核心函数库对比测试的 R-benchmark-25 的详细结果。

图 2 显示 R-benchmark v. 2.5 的各个结果。 结果按照英特尔 MKL 性能提升幅度,进行升序排列。 几乎全部的英特尔 MKL 测试结果优于 OpenBLAS,最终的测试除外,即在 45x45 矩阵上运行 Escoufier 算法。 如欲了解有关特征值、斐波纳契数列、希尔伯特矩阵和托普利茨矩阵的更多信息,请分别查看参考部分的第 [9]、[10]、[11] 和 [12] 条目。

需要指出的是,测试不是在最新版的英特尔 MKL 上完成的。 最新版的英特尔 MKL 针对小型矩阵进行了优化。

使用英特尔® 数学核心函数库的优势

图 1 和图 2 的结果显示,和使用 OpenBLAS 相比,使用配备英特尔® 至强® 处理器 E5-2697 v4 产品家族的英特尔® 数学核心函数库可以提高 R 函数的速度,如交叉乘积、Cholesky 分解、单值分解 (SVD) 等等。 这些函数在机器学习 (ML) 方法和现代数据分析中发挥着重要作用。 英特尔 MKL 利用英特尔至强处理器 E5 v4 的特性,即英特尔® 高级矢量扩展指令集 2(英特尔® AVX2),提升了矩阵运算和函数的性能。 英特尔至强处理器 E5 v4 部署了乘加融合 (FMA) [13] 的硬件特性,极大提高了广泛应用于矩阵运算的乘加融合运算的速度。 如欲了解 FMA 的更多信息,请访问 www.software.intel.com。 由于新的英特尔® 至强® 处理器发布了更多的架构改进,新版英特尔 MKL 将利用这些特性进一步优化上述函数,无需用户干预。

结论

R 语言在数据分析中发挥了重要作用。 R 语言的提速能提高数据分析工具的性能。 由于矩阵运算在数据分析工具中占了很大比重,总体来说,英特尔 MKL 会提升这些工具的速度,因为英特尔 MKL 利用包括英特尔 AVX2 在内的一些特性来提高矩阵运算的速度。 使用英特尔 MKL,您不需要修改 R 语言源代码。 请把 R 语言编译器连接到最新版英特尔 MKL,以利用新版英特尔至强处理器的新特性。

本文为 ML 系列文章的第一篇。 下一篇文章将介绍英特尔 MKL 如何在功能层面和应用层面实现提速。 后续文章将探讨如何利用 Python* 使用和优化 ML 应用。

参考资料

[1] 什么是 R 语言? https://www.r-project.org/about.html

[2] 基本线性代数子程序 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms

[3] 优化的 BLAS 库 http://www.openblas.net/

[4] 英特尔® 数学核心函数库 https://software.intel.com/zh-cn/intel-mkl?wapkw=intel%20mkl

[5] Cholesky 分解 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Cholesky_decomposition

[6] 单值分解 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Singular_value_decomposition

[7] 主组件分析 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Principal_component_analysis

[8] Revolution R http://www.revolutionanalytics.com/

[9] 特征值 – 选自 Wolfram MathWorld http://mathworld.wolfram.com/Eigenvalue.html

[10] 什么是斐波纳契数列? http://www.livescience.com/37470-fibonacci-sequence.html

[11] 希尔伯特矩阵 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Hilbert_matrix

[12] 托普利兹矩阵 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Toeplitz_matrix

[13] 乘积累加运算 - 融合乘.E2.80.93 加 - 维基百科,免费的百科全书 https://en.wikipedia.org/wiki/Multiply%E2%80%93accumulate_operation#Fused_multiply.E2.80.93add

[14] http://r.research.att.com/benchmarks/R-benchmark-25.R

有关编译器优化的更完整信息,请参阅优化通知