【问题标题】:Why spark blas use f2jBLAS instead of native BLAS for level 1 routines?为什么 spark blas 使用 f2jBLAS 而不是本机 BLAS 进行 1 级例程?
【发布时间】:2019-05-17 02:16:36
【问题描述】:
我在 BLAS.scala 中找到了以下代码:
// For level-1 routines, we use Java implementation.
private def f2jBLAS: NetlibBLAS = {
if (_f2jBLAS == null) {
_f2jBLAS = new F2jBLAS
}
_f2jBLAS
}
我认为原生 blas 比纯 Java 实现更快。
那么为什么 spark 选择 f2jblas 用于 1 级例程,有什么我不知道的原因吗?
谢谢!
【问题讨论】:
标签:
scala
apache-spark
apache-spark-mllib
blas
【解决方案1】:
答案很可能在netlib-java 存储库的自述文件的性能部分中找到。
Java 在老一代开发人员中享有盛誉,因为 Java 应用程序在 1990 年代运行缓慢。如今,JIT 可确保 Java 应用程序与 C / C++ / Fortran 应用程序保持同步或超过其性能。
随后的图表显示了纯 Java(使用 f2j 从 Fortran 转换而来)和 ARM 上的 Linux 和 x86_64 上的 macOS 上的本机 BLAS 中各种 BLAS 例程的详细基准测试结果。 ddot 基准测试表明,在 x86(ARM 的 JRE 似乎没有 JIT 功能)上,F2J 在更长的向量大小上与参考本机 BLAS 实现相当,甚至在更短的向量大小上表现优于它。这里需要注意的是,JIT 会在几次调用后启动,这不是问题,因为大多数 ML 算法本质上是迭代的。大多数 1 级例程都相当简单,JIT 编译器能够生成优化良好的代码。这也是高度优化的 BLAS 实现中的调优工作进入 2 级和 3 级例程的原因。