为什么 spark blas 在 1 级例程中使用 f2jBLAS 而不是原生 BLAS?

Why spark blas use f2jBLAS instead of native BLAS for level 1 routines?

我在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作为level 1例程,有什么我不知道的原因吗?

谢谢!

最有可能在 netlib-java 存储库的自述文件的 性能 部分找到答案。

Java has a reputation with older generation developers because Java applications were slow in the 1990s. Nowadays, the JIT ensures that Java applications keep pace with – or exceed the performance of – C / C++ / Fortran applications.

随后的图表显示了各种 BLAS 例程的详细基准测试结果,包括纯 Java(从 Fortran 和 f2j 翻译而来)和来自 Linux ARM 和 macOS x86_64。 ddot 基准测试表明,在 x86 上(ARM 的 JRE 似乎不具备 JIT 功能)F2J 对于更长的向量大小与参考本机 BLAS 实现的性能相当,对于更短的向量大小甚至优于它。这里需要注意的是,JIT 在几次调用后启动,这不是问题,因为大多数 ML 算法本质上都是迭代的。大多数 1 级例程都相当简单,并且 JIT 编译器能够生成优化良好的代码。这也是为什么高度优化的 BLAS 实现中的调整工作会进入 2 级和 3 级例程。