首页 > 其他分享 >毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线

毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线

时间:2022-12-12 21:39:33浏览次数:73  
标签:JDK riscv OpenJDK RISC https port

编者按:2022 年 3 月 14 日,华为毕昇 JDK 团队主导开发的 OpenJDK RISC-V port [1] 正式合入 OpenJDK 主线 [2],成为 OpenJDK 的官方 port 之一。OpenJDK 19 将会是第一个支持 RISC-V 后端的版本。



OpenJDK RISC-V port 介绍

RISC-V [3] 是一个开源免费的 RISC 指令集架构。随着指令集架构设计逐渐成熟,越来越多的开发者参与到了 RISC-V 生态建设中,将 Java 带到 RISC-V 世界的呼声也越来越高。毕昇 JDK 团队 RISC-V port 工作时间线如下:

  • 2019 年,开始基于 OpenJDK 11 的 Linux/RISC-V 的移植工作
  • 2020 年,在 OpenEuler 社区上开源: openEuler/bishengjdk-11 [4]
  • 2021 年,与社区合作,基于 OpenJDK RISC-V port [5],开展 upstream 流程
  • 2022 年,合入 OpenJDK 主线 (JDK19)


RISC-V port 特性介绍

RISC-V port 涉及的模块如下图所示:



毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线_github



OpenJDK RISC-V port 提供如下特性:

  • Template Interpreter 模板解释器
  • C1 (client) JIT 编译器
  • C2 (server) JIT 编译器
  • 当前主线支持的所有 GC (包括 ZGC 和 ShenandoahGC)

RISC-V port 基于 RV64G (IMAFD) 基础指令集提供了 64 位 RISC-V 架构支持,此外还为 Vector、Compressed (由阿里开发者贡献)、Bit-Manipulation 扩展提供了实验性支持。实验性扩展需要通过 ​​-XX:+UseRVV​​、​​-XX:+UseRVC​​、​​-XX:+UseZba​​ 和 ​​-XX:+UseZbb​

除此之外,基于正式发布的 ISA 扩展集合,RISC-V port 提供了 String、Array 和 BigInteger 等 Java 类的 intrinsic 支持。目前 RISC-V Cryptography Extension 尚未正式发布,因此涉及到其中加解密指令的 sha/crc 相关 intrinsic 还在计划中。

当前 RISC-V port 还提供了 32 位的 Zero 支持,RV32G 后端 port 由中科院软件所 PLCT 实验室团队主导开发,仓库地址:openjdk-riscv/jdk11u [6]。

更多 RISC-V port 的内容,可以回顾毕昇 JDK 团队在 RISC-V 中国峰会上的报告:Porting OpenJDK to RISC-V [7]。也可以在 riscv-port-dev [8] 上发起讨论。



RISC-V port 测试情况

RISC-V port 测试主要在 QEMU 和 Native 环境中展开 (感谢中科院软件所 PLCT 实验室提供的 RISC-V 硬件和测试支持)。测试内容主要有功能测试 (jtreg tier {1,2,3,4},jcstress) 和相关 Java benchmark (SPECjvm2008、dacapo 等) 测试。

RISC-V port 实现了 C1/C2 JIT 编译器,相比 Zero 版本有较大的性能提升。下图对比了 RISC-V Server 和 RISC-V Zero 在 SPECjvm2008 上的性能差异,结果显示 RISC-V Server 性能可以达到 Zero 的 39 倍 [9]。



毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线_java_02



RISC-V port 在 SPECjbb2015 上的性能数据如下图所示:



毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线_java_03





体验 RISC-V JDK

目前 RISC-V JDK (JDK19) 可以直接通过 builds.shipilev.net [10] 下载体验。如果没有硬件环境,可以通过交叉编译来构建 JDK。为了方便工具链的配置,文章中的构建步骤均基于 Docker,因此需要预先安装 Docker 环境。下面介绍如何从源码交叉编译 RISC-V JDK。



构建环境配置

  • x86_64 环境 (其他架构环境未经测试)
  • docker
  • adoptopenjdk/centos6_build_image [11]

拉取最新的构建镜像:

$ docker pull adoptopenjdk/centos6_build_image:latest

启动镜像:

$ docker run -it --rm adoptopenjdk/centos6_build_image



源码构建 RISC-V JDK

拉取代码:

$ git clone https://github.com/openjdk/jdk.git

交叉编译:

# add riscv toolchain to PATH and LD_LIBRARY_PATH
$ export RISCV64=/opt/riscv_toolchain_linux
$ export LD_LIBRARY_PATH=$RISCV64/lib64:/usr/local/gcc/lib64:/usr/local/gcc/lib
$ export PATH="$RISCV64/bin:$PATH"
$ export CC=$RISCV64/bin/riscv64-unknown-linux-gnu-gcc
$ export CXX=$RISCV64/bin/riscv64-unknown-linux-gnu-g++

# configure and build
$ bash configure \
--openjdk-target=riscv64-unknown-linux-gnu \
--with-sysroot=/opt/fedora28_riscv_root \
--with-boot-jdk=/usr/lib/jvm/jdk-18 \
BUILD_CC=/usr/local/gcc/bin/gcc-7.5 \
BUILD_CXX=/usr/local/gcc/bin/g++-7.5
$ make images

目前镜像中可能还未包含 jdk18,可以前往 Adoptium [12] 下载 jdk18 作为 bootjdk。



源码编译 QEMU RISC-V

如果没有硬件环境,可以通过 QEMU 模拟的方式来运行 JDK,下面简单介绍一下从源码编译 QEMU RISC-V:

获取 QEMU 源码:

$ git clone https://github.com/qemu/qemu.git

构建 QEMU RISC-V:

$ cd qemu && mkdir build && cd build
$ ../configure --prefix=/path/to/install/qemu \
--target-list=riscv64-linux-user,riscv64-softmmu
$ make -j && make install

源码编译过程中需要一些额外的依赖如 ninja 等,按需安装即可。编译完成后,可以在 /path/to/install/qemu 中找到对应的二进制。



测试 java -version

QEMU user 模式下:

$ qemu-riscv64 -L /path/to/sysroot /path/to/openjdk-riscv/bin/java -version

QEMU system 下,直接执行如下命令即可:

$ /path/to/openjdk-riscv/bin/java -version



结语

经过 OpenJDK 开源社区和毕昇 JDK 团队的共同努力,OpenJDK RISC-V 终于成为 OpenJDK 的家族成员之一。这是第一个由华为团队主导的 OpenJDK 社区项目,也体现了毕昇 JDK 团队持续拥抱开源,回馈开源的信念。欢迎大家参与到 RISC-V OpenJDK 的开发中来,为 RISC-V 生态建设添砖加瓦。



参考链接

  1. ​ https://wiki.openjdk.java.net/display/RISCVPort ​
  2. ​ https://github.com/openjdk/jdk/pull/6294 ​
  3. ​ https://riscv.org/about ​
  4. ​ https://gitee.com/openeuler/bishengjdk-11/tree/risc-v ​
  5. ​ https://github.com/openjdk/riscv-port ​
  6. ​ https://github.com/openjdk-riscv/jdk11u ​
  7. ​ https://www.bilibili.com/video/BV1n64y1t7gc ​
  8. ​ https://mail.openjdk.java.net/mailman/listinfo/riscv-port-dev ​
  9. ​ https://twitter.com/shipilev/status/1479179438625595399 ​
  10. ​ https://builds.shipilev.net ​
  11. ​ https://hub.docker.com/r/adoptopenjdk/centos6_build_image ​
  12. ​ https://adoptium.net/index.html ​


后记

如果遇到相关技术问题(包括不限于毕昇 JDK),可以通过 Compiler SIG 求助。





关注 毕昇编译 获取编译技术更多信息


微信公众号 - openEuler(openEulercommunity)。


标签:JDK,riscv,OpenJDK,RISC,https,port
From: https://blog.51cto.com/u_15127420/5931850

相关文章

  • 毕昇 JDK 登陆 Eclipse Adoptium 开源 JDK 发行版市场
    毕昇JDK[1]作为高质量企业级的开源JDK发行版,被openEuler和业界Java用户广泛使用,它的兼容性和质量也受到了EclipseAdoptium工作组的认可,于2022年05月26日......
  • 超详细过程步骤讲解 CentOS 7 安装jdk1.8
    linux系统下安装jdk以及环境变量的设置、真的是比window下方便一万倍1、卸载系统自带jdk1.1查看系统自带jdkjava-version1.2查看java相关文件rpm-qa|grepja......
  • Ubuntu20.04 Java相关环境(JDK、Mysql、Redis、nacos、influxdb)部署以及运行
     重装了系统,系统版本号为:Ubuntu20.041、云平台登录云平台,选择要重装的服务器,关机、一键重装即可 2、安装jdk下载jdk-8u341-linux-x64.tar.gz,并复制到服务器目录下,比......
  • 阿里云服务器 jdk1.8 安装配置
     阿里云服务器jdk1.8安装配置下载/上传jdk安装包解压到指定目录重命名解压后的文件夹名称配置环境变量验证JAVA环境是否安装成功step0.安装包准备1wget......
  • linux安装jdk
    1、安装包下载wget--no-check-certificate--no-cookies--header"Cookie:oraclelicense=accept-securebackup-cookie"http://download.oracle.com/otn-pub/java/jdk/......
  • Linux系统下安装JDK8和Maven3.8.5
    一、下载JDK8Linux版本官网下载太慢了,小编这里为大家下载好了:二、下载Maven三、使用xftp上传到linux上四、解压1.解压maventar-zxvfapache-maven-3.8.5-bin.tar.gz2.重......
  • Windows搭建react-native(RN)环境,RN版本0.55,jdk8,node12.2.0,Android Studio
    Windows搭建react-native(RN)环境,RN版本0.55,jdk8,node12.2.0,AndroidStudio七月星辰已于 2022-09-2609:20:38 修改1319收藏6分类专栏:AndroidStud......
  • JDK 新特性学习笔记之模块系统
    封装是指将数据与操作该数据的方法捆绑在一起。而信息隐藏是隐藏实现细节。封装和信息隐藏常常出现在一起,以致于它们几乎成了同义词,在一些上下文,它们也的确是同义词。封装提......
  • JVM调优1- JVM参数及JDK自带的JVM查询工具
    1.JVM的运行参数1.1三种参数类型标准参数help-version-X参数(非标准参数)-Xint-Xcomp-XX参数(使用率比较高,常用语jvm调优)-XX:newSize-XX:+UseSeriaIGC1.2标准参数-D设置......
  • JDK17新特性,真的好像scala
    背景截止目前,jdk最新版本为17,自jdk9之后开发了很多新特性!!!看完这些特性,我在想为啥不直接用scala???特性JShelljdk9之后出现的一款交互式工具,一般这玩意都是用于新手......