我们有一个带有英特尔 AVX 512 CPU 的新集群。我们对该主题进行了研究,但没有结果。我们想知道 spark 作业是否能够在本地运行 AVX 以对 DataFrames 对象进行处理,或者我们是否必须更改代码以允许 JVM 使用它,或者它是否完全没用。我们的 spark 应用程序是用 scala 编写的。我们的大部分工作是 DataFrames 对象处理和算法。在此先感谢您的帮助
2 回答
这将取决于几件事。
AVX512 支持已添加到 JDK 9 中的 OpenJDK(请参阅https://bugs.openjdk.java.net/browse/JDK-8076276),因此您需要在 JDK 9 或更高版本上运行。要显式启用此功能,您需要添加命令行标志-XX:UseAVX=3
。
但是,使用多少将在很大程度上取决于您的代码的工作方式以及 JIT 编译器如何能够使用矢量化。在 Azul(我为之工作),我们已将 Zing JVM 中的 C2 JIT 替换为 Falcon JIT。这基于 LLVM 编译器项目,并且能够在比 C2 通常识别的更复杂的情况下使用向量化。
正如@Speakjava 目前注意到的那样,在 Spark 代码中使用 SIMD 指令是不可行的,因为 AVX512 是在 Java 9 中添加的,而 Spark 尚不支持。但未来几年将会发生根本性的变化——巴拿马计划。一旦矢量 API 完成,像 Spark 这样的项目将能够从中获得巨大的收益。您可以跟进JEP-338以了解即将发生的变化。
如果您有兴趣利用低级英特尔 API 来获得性能,请查看英特尔的库数据分析加速库。英特尔表示,它可以为MLlib
. 它有一些 Spark 类的类似物——这里org.apache.spark.mllib.feature.{PCA, PCAModel} -> daal_for_mllib.{PCA, PCAModel}
有一个详细的例子。