强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代

简介: VectorAPI 是 Java 在特定领域进行高性能计算的利器。

文/朱文杰、金钟晖

01 背景

Alibaba Dragonwell 作为 OpenJDK 的下游版本,是阿里巴巴针对 10万+ 服务器上运行的在线电商、金融、物流应用优化的 OpenJDK 实现。 阿里巴巴和 OpenJDK 社区紧密合作,将尽可能多的 Alibaba Dragonwell 定制功能带到上游。Dragonwell 是 OpenAnolis 的默认 JDK,Alibaba 的众多 Java 应用,正在逐步迁移到 Dragonwell 上。


Intel Java 团队长期致力于 OpenJDK 的发展,贡献了大量优化特性,这些工作使得 OpenJDK 可以更好利用现代 CPU 的强大特性。VectorAPI 是 Java 在特定领域进行高性能计算的利器,广大 Java 开发者通过 VectorAPI 可以精确地控制和利用现代 CPU 普遍存在的 SIMD (Single Instruction Multiple Data) 硬件单元,特定的应用可以获得数倍以上的性能提升。

02 Java 高性能计算现状

SIMD 计算单元在 X86 平台(非 X86 平台也普遍存在 SIMD)上从 MMX(Multi Media eXtension)时代,演进到当前的 AVX-512 (Advanced Vector Extensions)/AMX(Advanced Matrix Extensions)时代,SIMD 技术在多媒体处理,游戏娱乐,大数据处理和最近火热的 AI 领域都发挥了至关重要的作用。开发者可以利用 C/C++(intrinsic指令),汇编语言等语言工具显式的编写 SIMD 相关代码(称之为向量化编码)来利用 SIMD 单元;也可以利用编译器/解释器的自动向量化功能来进行。JVM(Java Virtual Machine)也具有自动向量化的能力。


在利用编译器/解释器的自动向量化功能的时候,虽然开发人员的负担较小,但由于这些工作都依赖于编译器/解释器的实现,很多时候无法达到预期的目的。而开发人员能做的却很有限,SIMD 硬件的性能往往不能充分发挥;而直接针对 SIMD 硬件编程,较老版本的 Java 却只能通过 JNI(Java Native Interface),调用使用 C/C++ 或者汇编语言实现的库来实现。JNI 的引入,将带来不容忽视的额外性能开销;同时混合编程模式也会增加系统管理维护的复杂度。Java VectorAPI (向量 API)的出现,给了 Java 开发者直接面向 SIMD 硬件的编程能力。使用 SIMD 硬件的途径:


自动向量化 调用本地语言库

直接针对 SIMD 单元编程

C/C++、汇编

等本地语言


 (Intrinsic/汇编)
Java 是(JNI) (VectorAPI)

03 VectorAPI 介绍

VectorAPI (Incubator, JEP 338, JEP:JDK Enhancement Proposals) 最初于 2018 年 4 月开始创建,在 OpenJDK16 作为孵化器项目(2020年10月)被引入。随着后续 OpenJDK 版本的升级,VectorAPI 也得到了同步升级:

  • OpenJDK 17 -> JEP 414,Second Incubator
  • OpenJDK 18 -> JEP 417,Third Incubator
  • OpenJDK 19 -> JEP 426,Fourth Incubator
  • OpenJDK 20 -> JEP 438,Fifth Incubator

每次 VectorAPI 的升级都会带来性能提升,更多功能和 Bugfix。VectorAPI 的编程使用的是纯 Java 代码,下面看一个简单例子

// 传统写法实现2个数组相加
void add (float[] A, float[] B, float[] C) { 
    for (int i = 0; i < C.length; i++) { 
        C[i] = A[i] + B[i]; 
    } 
} 
// 使用VectorAPI的2个数组相加
public class AddClass<S extends Vector.Shape<Vector<?, ?>>> { 
    private final FloatVector.FloatSpecies<S> spec; 
    AddClass (FloatVector.FloatSpecies<S> v) {spec = v; } 
    // vector routine for add  
    void add (float[] A, float[] B, float[] C) { 
        int i=0; 
        for (; i + spec.length() < C.length; i += spec.length()) { 
            FloatVector<S> av = spec.fromArray(A, i); 
            FloatVector<S> bv = spec.fromArray(B, i); 
            av.add (bv).intoArray(C, i); 
        } 
        // clean up loop 
        for (; i < a.length; i++) C[i] = A[i] + B[i]; 
    } 
}


可以看出,在使用 VectorAPI 后,在支持 AVX-512 的硬件平台上,一次加法可以处理 (512/32=16) 16 个浮点数;而传统加法一次只能处理一个浮点数。下面是一些 VectorAPI 的实际例子:

  • 高性能计算、AI、多媒体领域广泛使用的 BLAS (Basic Linear Algebra Subprograms,基本线性代数子程序),可以得到 2.2X~4.5X 的提升。

  • 图像处理 Sepia 过滤 ,最多得到 6 倍提升:

  • 数据库应用 2 倍以上提升:

由于 VectorAPI 是一个比较新的模块,更多利用 VectorAPI 的新项目正在开发中。

04 业界 Java 版本现状

在 Apache Parquet-mr 项目中,使用 VectorAPI 需要 JDK17 的支持。一方面 JDK17 是 Java 的 LTS (Long-Term Support) 版本,更为重要的是前一个 Java LTS 版本 JDK11 并不支持 VectorAPI。但是业界 JDK11 的使用比 JDK17 更为广泛,而在成熟的生产环境中升级 Java 版本是一件代价高昂的事情,这就造成了 VectorAPI 在业界推广使用的一个显而易见的巨大障碍。对此业界也做了不少努力和尝试,比如阿里巴巴在其内部使用的 AJDK上,已经加入了 VectorAPI 的支持,但是其实现和 OpenJDK 社区还是有差别,后续的升级维护不是一件容易的事情。因此阿里巴巴和英特尔开始了将 VectorAPI  (JEP 338)移植到 Dragonwell11 上的项目。这样既可以利用 VectorAPI 的强大功能,又保护了现在的投资,避免了升级 JDK 的风险

05 移植难点

  • 涉及代码量巨大

社区 JEP 338 涉及 336 文件修改,涉及代码行数 29 万行。而这些都是以 JDK16 为基准的和基于 JDK11 的 Dragonwell 相比,差异会更大。

  • 保持和上游 OpenJDK 的关联

而且一方面要让 Dragonwell11 能继续方便追踪上游 OpenJDK11 的修正增强,还要让 VectorAPI 也能较为方便跟踪上游 OpenJDK 后续 VectorAPI 的演进,对移植工作带来了不小挑战。

  • 性能要和上游 OpenJDK 接近

OpenJDK11 以后的版本的一些性能相关改动以及如何引入 Dragonwell11?

  • 稳定可靠的强需求

Dragonwell 需要支持现有的大量业务,稳定可靠是第一位的要求。


06 解决方案


针对海量的代码,阿里巴巴和英特尔都投入了大量资源,其中双方都包括了上游 OpenJDK 社区 VectorAPI 的关键贡献者,双方紧密合作,讨论方案,检查代码。在移植过程中,尽量保持 Dragonwell11 的原有结构,只涉及 VectorAPI 的部分才采用上游的实现。一些上游 JDK11 以后的改动,分析其实现,如果可以使用现有 Dragonwell11 的组件,就不引入额外的改动。这样把对 Dragonwell11 的影响降到最小。并且利用 OpenJDK 内建的测试集,完整覆盖移植后的 Dragonwell11,来保证移植的质量。

07 Dragonwell11 + VectorAPI

目前,VectorAPI 已经合并到 Dragonwell11 的主分支(master),且完全兼容 VectorAPI 1st Incubator (JEP 338),后续还会把 JEP 414、JEP 417、JEP 426、JEP 438 的功能移植到 Dragonwel11 上。


相关链接:

Alibaba Dragonwell:https://github.com/alibaba/dragonwell11

OpenJDK :https://github.com/openjdk/jdk


—— 完 ——

相关文章
|
3月前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
45 1
|
2月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
69 5
|
5月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
247 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
23 2
|
2月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
37 4
|
2月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
51 1
|
3月前
|
缓存 前端开发 JavaScript
9大高性能优化经验总结,Java高级岗必备技能,强烈建议收藏
关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。本文介绍了9种性能优化方法,涵盖代码优化、数据库优化、连接池调优、架构层面优化、分布式缓存、异步化、Web前端优化、服务化、硬件升级、搜索引擎和产品逻辑优化。欢迎留言交流。
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
47 2
|
4月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
3250 14

热门文章

最新文章