Scala 为什么spark blas在1级例程中使用f2jBLAS而不是本机blas?

Scala 为什么spark blas在1级例程中使用f2jBLAS而不是本机blas?,scala,apache-spark,apache-spark-mllib,blas,Scala,Apache Spark,Apache Spark Mllib,Blas,我在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级例程,有什么原因我不知道吗 谢谢大家! 答案很可

我在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级例程,有什么原因我不知道吗


谢谢大家!

答案很可能在存储库自述文件的性能部分找到

Java在老一代开发人员中享有盛誉,因为Java应用程序在20世纪90年代发展缓慢。现在,JIT确保java应用程序跟上或超过C/C++/FORTRAN应用程序的性能。 接下来是显示各种BLAS例程的详细基准测试结果的图表,这些BLAS例程使用纯Java(从Fortran和f2j翻译而来)以及ARM上的Linux和x86_64上的macOS上的本机BLAS。<代码> dDOT基准测试结果表明,在X86上(JRE对于ARM似乎没有JIT能力),F2J与参考的本地BLAS实现在更长的向量大小上保持一致,甚至比更短的向量大小要优于它。这里需要注意的是,JIT是在两次调用之后开始的,这不是一个问题,因为大多数ML算法本质上是迭代的。大多数1级例程都相当简单,JIT编译器能够生成优化良好的代码。这也是高度优化的BLAS实现中的调优工作进入2级和3级例程的原因