共计 2420 个字符,预计需要花费 7 分钟才能阅读完成。
编者按:SIMD 是 CPU 硬件中一类实现数据并行的扩大指令,它的应用能够大幅晋升包含个别应用程序在内的软件性能,但在理论应用中也存在着一些限度。安谋科技(Arm China)资深软件工程师、OpenJDK 社区 Committer、龙蜥社区 Java 语言与虚拟机 SIG 成员李鹏飞从 Java 应用程序应用 SIMD 指令集的现状、Arm 架构的下一代 SIMD 指令集 SVE 及其个性以及 Arm 在 OpenJDK 社区为反对 SVE 所作的相干工作等方面解读《如何利用硬件 SIMD 指令晋升 Java 程序的性能》。
一、SIMD 在 Java 中的利用
学习过计算机体系结构的同学对 SIMD 这个概念应该不生疏,它是指 CPU 指令集中的一类指令,特点是一条指令能够解决多个数据。与一条指令只解决一个数据的标量指令相比,SIMD 指令有点像多车道的高速公路。SIMD 指令通常工作在向量寄存器(vector register)上。咱们把向量寄存器上每个待处理数据元素所占的比特位称为一个通道(lane)。如下图所示的两个向量求和的例子。将总长 128 比特的向量寄存器按每个数据元素为 int 型来划分,一个向量寄存器就有 4 个通道。因而下图中一条 SIMD 指令就做了 4 个加法运算。依照艰深的了解,在通道位宽(或数据元素宽度)肯定的状况下,向量长度越大,Lane 通道数越多,相当于高速公路车道数越多,数据的吞吐量就越大。
SIMD 指令集最早只用于科学计算和多媒体解决等专用畛域,但随着工夫的推移和指令集架构的演进,明天的 SIMD 曾经能够用来优化包含个别 C++/Java 应用程序在内的通用计算。利用开发者应用 SIMD 的办法有多种,包含:
- 内嵌 SIMD 汇编指令代码
- 调用一些优化好的内联(intrinsic)函数
- 交给编译器进行主动向量化
这三种办法各有其优缺点,在具体应用过程中也都存在一些局限性。Arm 在指令集架构层面始终在尝试冲破这些局限,其中一个比拟大的冲破就是基于 Arm AArch64 指令集的 SVE 扩大。
二、Arm SVE 指令集扩大
SVE 的全称是可变长向量扩大(Scalable Vector Extension),它有很多新个性和劣势,其中 1 两个比拟重要的是可变长(scalable)和向量掩码(predicate)。
第一个个性,“可变长”是指 SVE 有 32 个不规定长度的向量寄存器,其寄存器长度能够是 128 位的任意整数倍,最大能够是 2048 位。咱们这里说的“不规定”指的是 Arm 架构对寄存器长度没有具体限度,CPU 厂商能够依据其硬件设计自主决定。对此 SVE 有一个重要特点,就是蕴含 SVE 指令的代码能够间接运行在任意 SVE 寄存器长度的 CPU 上,而不须要重写代码或从新编译。
SVE 的第二个重要个性是向量掩码(predicate),SVE 的 16 个 predicate 寄存器能够用来管制向量操作中通道的活跃性(lane activity)。如上左图所示,predicate 值为 1 标识的沉闷通道参加向量加法运算,而不沉闷的通道不参加运算。此外,SVE 还提供了一种通过比拟操作产生 predicate 值的机制(如上右图所示),从而为循环管制提供了一种新的 predicate 驱动的办法。通过这种新的办法,向量化循环的每一趟能够跑同一套代码,并在循环的最初一趟操作向量的局部通道。
咱们用一个艰深的比喻来比照标量指令、传统 SIMD 指令以及 SVE 指令。好比咱们要用杯子打一定量的水,标量指令为咱们提供了一个小杯子,咱们要打很屡次;传统 SIMD 指令提供了一个大一点儿的杯子,能够少打几次,但打到最初不够打一满杯的时候还必须换小杯持续打;SVE 不仅为咱们提供了一个更大的杯子,这个杯子能够十分大(2048 位), 而且它是带刻度的(predicated),在不够打一满杯的状况下能够拿它打半杯。
三、在 OpenJDK 中反对 SVE
为了让 Java 虚拟机用得上 SVE 的这些好个性,咱们安谋科技(Arm China)的 JDK 团队在这方面曾经投入了近两年工夫,次要包含以下三个方面的工作:
- JDK 库函数 SVE 版本 intrinsics 的实现
- Java Vector API 的 SVE 实现
- SVE 主动向量化的反对
除此之外,咱们还做了一些根底的通用的反对,包含 SVE 的寄存器调配,代码生成规定(matching rules)以及运行时 SVE 个性查看(runtime feature detection)等等。这些工作大部分都切实 HotSpot 的 C2 编译器中实现的,对于 Vector API,咱们还有一些对于 JDK 库函数外部实现的探讨。
这些反对工作有的曾经交付社区,且在近期公布的 JDK 版本中曾经能够应用了,有的工程量比拟大且技术细节很多,还处在紧锣密鼓地开发之中。下图展现了目前咱们曾经交付的工作和一些将来的打算。
对于更多的技术实现方面的细节,欢送通过社区来和咱们交换(扫描下方二维码入群交换)。
四、龙蜥社区相干技术 SIG 介绍
龙蜥社区现已成立 43 个技术 SIG(更多 SIG 详情请到龙蜥官网查看),明天次要介绍 Arm 架构 SIG 和 Java 语言与虚拟机 SIG。
Arm 架构 SIG 是由来自 Arm、阿里云、Ampere 和飞腾等龙蜥社区开发人员一起发动,关注龙蜥操作系统中任何和 Arm 架构相干的话题。现阶段次要聚焦于 Arm 架构相干的性能的在龙蜥内核中的实现和优化以及不同厂商 Arm 服务器和龙蜥操作系统的适配。
Java 语言与虚拟机 SIG 次要关注 Java 后端的虚拟机以及 OpenJDK/Dragonwell 相干的话题。任何与 Arm 相干的 JDK/JVM 问题都能够在这里探讨,也能够通过 Arm 架构 SIG 转达。
对于回放和课件获取
【视频回放】:视频回访已上传至龙蜥官网(官网 - 社区 - 视频)。
【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件”即可获取。有任何疑难欢送随时征询龙蜥助手—小龙(微信:openanolis_assis,更多技术交换请搜寻钉钉群号:33311793 入群交换。)。
—— 完 ——