gpt4 book ai didi

java - 我如何编写代码来提示 JVM 使用 vector 操作?

转载 作者:太空狗 更新时间:2023-10-29 22:35:48 25 4
gpt4 key购买 nike

有点相关的问题,一岁:Do any JVM's JIT compilers generate code that uses vectorized floating point instructions?

前言:我正尝试在纯 Java 中执行此操作(没有 JNI 到 C++,没有 GPGPU 工作,等等...)。我已经分析过,大部分处理时间来自此方法中的数学运算(可能是 95% 的 float 学和 5% 的整数数学)。我已经将所有 Math.xxx() 调用减少到一个足够好的近似值,所以现在大部分数学都是浮点乘法和一些加法。

我有一些处理音频处理的代码。我一直在进行调整,并且已经取得了很大的收获。现在我正在研究手动循环展开以查看是否有任何好处(至少在手动展开 2 时,我看到大约有 25% 的改进)。在尝试手动展开 4 时(这开始变得非常复杂,因为我正在展开嵌套循环的两个循环)我想知道是否有什么我可以做的来暗示 jvm 在运行时它可以使用 vector操作(例如 SSE2、AVX 等)。音频的每个样本都可以完全独立于其他样本进行计算,这就是为什么我已经能够看到 25% 的改进(减少对浮点计算的依赖性)。

例如,我有 4 个 float ,一个用于循环的 4 个展开中的每一个,以保存部分计算的值。我如何声明和使用这些 float 重要吗?如果我将它设为 float[4] 是否会向 jvm 暗示它们彼此无关,而不是具有 float、float、float、float 甚至一类 4 个公共(public) float ?有什么我可以毫无意义地做的事情会扼杀我对代码进行矢量化的机会吗?

我在网上看到过关于“正常”编写代码的文章,因为编译器/jvm 知道常见的模式以及如何优化它们,偏离这些模式可能意味着更少的优化。然而,至少在这种情况下,我不希望将循环展开 2 次来提高性能,所以我想知道是否还有其他我可以做的事情(或者至少不能 做)来帮助我的机会。我知道编译器/jvm 只会变得更好,所以我也想警惕将来会伤害我的事情。

为好奇而编辑:展开 4 比展开 2 提高了 ~25% 的性能 另一个,所以我真的认为如果 jvm 支持 vector 操作(或者可能已经支持它) 正在使用它们)。

谢谢!

最佳答案

How can I..audio processing..pure java (no JNI to C++, no GPGPU work, etc...)..use vector operations (e.g. SSE2, AVX, etc...)

Java 是 high level语言(Java 中的一条指令生成许多硬件指令)是设计使然(例如垃圾收集器内存管理),不适合实时处理大量数据的任务。

通常有针对特定角色优化的特殊硬件(例如 image processingspeech recognition),它们多次通过几个简化的处理管道利用并行化。

这类任务也有专门的编程语言,主要是hardware description languagesassembly language .

即使是 C++(被认为是快速语言)也不会自动为您使用一些 super 优化的硬件操作。它可能只是在某些地方内联了几种手工制作的汇编语言方法中的一种。

所以我的回答是,“可能没有办法”指示 JVM 对您的代码使用一些硬件优化(例如 SSE ),即使有一些 Java 语言运行时仍然会有太多其他因素会降低您的代码速度。

使用为此任务设计的低级语言并将其链接到 Java 以实现高级逻辑。

编辑:根据评论添加更多信息

如果您确信高级“一次编写随处运行”的语言运行时肯定也应该为您做很多低级优化并自动将您的高级代码转换为优化的低级代码那么......方式JIT 编译器优化取决于 Java Virtual Machine 的实现.有很多。

如果是 Oracle JVM (HotSpot),您可以通过 downloading the source code 开始寻找答案。 ,文本 SSE2 出现在以下文件中:

  • openjdk/hotspot/src/cpu/x86/vm/assembler_x86.cpp
  • openjdk/hotspot/src/cpu/x86/vm/assembler_x86.hpp
  • openjdk/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
  • openjdk/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp
  • openjdk/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
  • openjdk/hotspot/src/cpu/x86/vm/vm_version_x86.cpp
  • openjdk/hotspot/src/cpu/x86/vm/vm_version_x86.hpp
  • openjdk/hotspot/src/cpu/x86/vm/x86_32.ad
  • openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
  • openjdk/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp
  • openjdk/hotspot/src/share/vm/c1/c1_LinearScan.cpp
  • openjdk/hotspot/src/share/vm/runtime/globals.hpp

它们是用 C++ 和汇编语言编写的,因此无论如何您都必须学习一些低级语言才能阅读它们。

即使有 +500 赏金,我也不会猎到那么深。恕我直言,问题是基于错误的假设是错误的

关于java - 我如何编写代码来提示 JVM 使用 vector 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23450352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com