3月16日,JDK16正式对外发布了。
虽然只是一个短期支持版本,但是JDK16性能方面做了很多重要的升级,比如为了解决数据科学场景对极限性能的需求越来越强烈等老大难问题,Oracle官方这次终于在JDK16中集成了Vector API。
差点忘了(允许我傲娇下),据Oracle官方公告,腾讯Kona JDK团队蝉联JDK16中国企业贡献度排名第一,并再次作为全球Notable贡献者被Oracle点名致谢。
为什么要说再次,因为,去年腾讯的贡献度也是第一!摊手表情
言归正传,重点说下这次的新特性,Vector API
本质上,它是一组通用Java编程接口,其核心是通过Java虚拟机生成硬件所支持的SIMD指令来加速性能,生产验证效果显著,且充分利用了Java/JVM开发维护高效可靠的能力,并对典型数据科学场景具有显著的加速效果。
具体的实现是将多个标量运算转换为更高效的向量运算,以充分发掘处理器向量部件的功能。
例如,考虑下图中的for循环代码片段。如果使用常规的标量指令实现,需要16次数组读操作、8次数组写操作和8次数组元素加法操作;
若通过Vector API使用向量指令,仅需要2次数组向量读操作、1次数组向量写操作和1次数组元素向量加法操作。所需操作总次数由32次降为4次,故能达到非常显著的性能优化效果。
实际上,随着业务系统数据规模和算法复杂度的不断增加,数据科学场景对极限性能的需求越来越强烈,Java编程语言在该领域正所面临前所未有的压力。
例如,腾讯支付日志系统,每日新增数据高达万亿条,业务系统需要在规定的时限内,对海量数据进行处理。
腾讯大数据平台,每日需要处理的实时计算量已达到数十万亿次,支撑起超万亿级维度的模型训练。
长期以来,Java的向量优化主要依赖JNI、Intrinsic和自动向量化等方案。但它们都存在较大的短板。例如,JNI编码维护难,可移植性差;Intrinsic缺乏通用性和可扩展性;自动向量化条件苛刻,极易失效。Vector API彻底解决了上述问题,极大便利了高性能Java向量程序的编写,提高了Java程序开发和执行的效率。
有了Vector API之后,根据OpenJDK官方公布的数据,其对浮点矩阵乘法可获得2~5倍性能提速,而对于浮点向量点积运算,则可获得14~16倍的性能优化效果。
可以说效果非常惊人,这也是这次新版本让人期待的主要因素之一。
作为JDK领域,国内贡献度最高的厂商,腾讯Kona在这个特性上也做了诸多重要的贡献。
Kona JDK通过内部广告大数据/机器学习海量业务系统的长期实践,在国际上率先解决了Vector API的生产可用性痛点,为产业界的大规模实际应用蹚平了道路。
Vector API也是在经历了3~4年的孵化才在JDK16中首次发布,在此之前,腾讯Kona JDK已将该特性完善集成入Kona JDK11向量版本中,并率先应用在广告大数据/机器学习核心业务系统。通过深度改造提升,以及长期规模化和高强度的验证,Kona JDK增强了Vector API多个方面功能和性能。包括:
• 向量指令支持不完整:如AVX512向量并未妥善支持,新硬件会导致JVM崩溃;
• 计算错误:如VectorReinterpret相关方法计算错误;
• 耦合错误:如Vector API与ZGC耦合联调所触发的执行错误;
• 其它类型:如向量保存恢复、冗余逻辑消除和汇编可调试性增强等。
Kona已贡献部分相关优化到OpenJDK社区:
顺便和大家透露下,随着自身业务规模增长和极限能力要求,腾讯大数据专门成立了JVM研发团队,并通过内部开源协同战略协同全公司伙伴,负责Kona JDK的研发和维护。
在解决公司内部迫切需求的同时,团队高度重视对外开源工作,参与了包括JDK、Panama和Loom等OpenJDK社区重要项目。在刚刚发布的JDK16中,Kona向OpenJDK社区贡献了50多个Patch,涉及HotSpot(JIT、Runtime和GC)、SVC、Core Libraries和Infrastructure等领域。
后续,我们还将持续贡献开源,把更多内部经过验证的技术分享给广大的开发者。
https://github.com/Tencent
(点击文末阅读原文直接访问)
请给项目 一个 Star !
欢迎提出你的 issue 和 PR!
国内镜像地址:
https://git.code.tencent.com/Tencent_Open_Source
(登录后才能访问公开项目)
腾讯工蜂源码系统为开源开发者提供完整、最新的腾讯开源项目国内镜像