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

cloudgamer 阅读:137 2025-06-02 22:19:02 评论:0

我在 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(从带有 f2j 的 Fortran 翻译而来)和 ARM 上的 Linux 和 x86_64 上的 macOS 上的原生 BLAS。 ddot 基准测试表明,在 x86 上(ARM 的 JRE 似乎没有 JIT 功能)F2J 对于较长的向量大小与引用 native BLAS 实现的性能相当,甚至在较短的向量大小方面优于它。这里需要注意的是,JIT 在几次调用后启动,这不是问题,因为大多数 ML 算法本质上都是迭代的。大多数 1 级例程都相当简单,并且 JIT 编译器能够生成优化良好的代码。这也是高度优化的 BLAS 实现中的调优工作进入第 2 级和第 3 级例程的原因。


标签:Spark
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号