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

这篇具有很好参考价值的文章主要介绍了强强联合,性能提升数倍!Alibaba Dragonwell11+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 的提升。

强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代,java,jvm,开发语言,云计算,阿里云

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

强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代,java,jvm,开发语言,云计算,阿里云

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

强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代,java,jvm,开发语言,云计算,阿里云

  • Parquet-Decoder 有 4~8 倍提升:https://github.com/apache/parquet-mr/pull/1011

强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代,java,jvm,开发语言,云计算,阿里云

由于 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 的风险

强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代,java,jvm,开发语言,云计算,阿里云

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

文/朱文杰、金钟晖

原文链接

本文为阿里云原创内容,未经允许不得转载。文章来源地址https://www.toymoban.com/news/detail-736852.html

到了这里,关于强强联合,性能提升数倍!Alibaba Dragonwell11+VectorAPI 助力 Java 高性能新时代的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微软扩大与Meta的AI合作,强强联合,友商岌岌可危?

    微软和Meta正在扩大他们正在进行的AI合作伙伴关系,Meta选择Azure作为“战略云提供商”,以加速自己的AI研究和开发。微软官员在Microsoft Build 2022开发者大会的第二天分享了有关Microsoft-Meta合作伙伴关系的最新细节。 微软和Meta在2017年宣布了ONNX(开放神经网络交换)格式,使开

    2024年02月08日
    浏览(24)
  • DB-GPT:强强联合Langchain-Vicuna的应用实战开源项目,彻底改变与数据库的交互方式

    今天看到 蚂蚁科技 Magic 开源的DB-GPT项目,觉得创意很好,集成了当前LLM的主流技术,主要如下 Langchain: 构建在LLM之上的应用开发框架 HuggingFace: 模型标准,提供大模型管理功能 Vicuna: 一个令GPT-4惊艳的开源聊天机器人,基于LLaMA模型和ShareGPT数据集训练的,能够达到接近Cha

    2024年02月15日
    浏览(22)
  • springcloud Alibaba中gateway和sentinel联合使用

    看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了,于是有了这个哈哈,给你看看官网的: 才sentinel1.6,现在都几了啊,所以有些过时。 下面开始讲解: 首先我们总的回顾一下,sentinel就是需要运行一个jar包,开启dashbord页面,来

    2024年01月17日
    浏览(26)
  • Spring Cloud Alibaba 2022 正式发布,启动速度提升 10 倍,各方面直接起飞!

    大家好,我是栈长。 经过 Spring Cloud Alibaba 2022 的第一个候选版本 2022.0.0.0-RC1 发布 7 个多月后,中间还有一个 2022.0.0.0-RC2 版本,就在前几天, Spring Cloud Alibaba 2022.0.0.0 正式版 终于正式发布了。 由于 Spring Boot 各个版本之间变化非常大,特别是 Spring Boot 2.4 和 3.0 版本,所以 S

    2024年02月14日
    浏览(26)
  • 1.UnityProfiler性能分析提升性能

    1.main thread 主线程 业务逻辑都在这里,我们调用Unity API都在这里;例如设置transform位置,main thread里面处理 2.render thread,渲染线程,负责渲染图像、执行渲染循环、处理GPU命令、帧同步。 3.  这个则表示当前负载最多可以绘制多少次(当前帧数) 4.Batches :批次,绘制场景,

    2024年01月25日
    浏览(41)
  • 性能优化实践:一行代码性能提升几十倍?

    Part1 问题背景 在一般的互联网公司,大家都非常忙碌。活儿是永远干不完的。这时候,我建议先做重要的事情。试想:一个人永远都在做「紧急不重要」的事情,他的产出必然是非常低的。这就是为什么「重要不紧急」在第二象限,仅仅排在「重要且紧急」后面。 所以对于

    2024年04月28日
    浏览(22)
  • ES性能优化最佳实践- 检索性能提升30倍!

            Elasticsearch是被广泛使用的搜索引擎技术,它的应用领域远不止搜索引擎,还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同

    2024年02月08日
    浏览(29)
  • .NET MAUI 性能提升

    .NET多平台应用程序UI (MAUI)将android、iOS、macOS和Windows API统一为一个API,这样你就可以编写一个应用程序在许多平台上本机运行。我们专注于提高您的日常生产力以及您的应用程序的性能。我们认为,开发人员生产率的提高不应该以应用程序性能为代价。 应用程序的大小也是如

    2024年02月07日
    浏览(30)
  • 接口性能提升方案

    1.索引 2.sql优化 3.远程调用多个服务,串行调用completeFuture,并行调用,需要定义线程池,并发情况,线程创建过多,方案二,数据异构,放缓存 详细参考: CompletableFuture 详解(一):基本概念及用法_tong_master的博客-CSDN博客 4.循环调用,改批量,500条 5.异步处理,不重要逻

    2023年04月10日
    浏览(22)
  • kettle配置提升读写性能

            在多个数据库之间进行数据的抽取,转换,处理等 1.增加批量写的速度         useServerPrepStmts=false (关闭服务器端编译,sql语句在客户端编译好再发送给服务器端,发送语句如上。如果为true,sql会采用占位符方式发送到服务器端,在服务器端再组装sql语句)     

    2024年02月01日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包