openjdk-riscv / jdk11u

Read-only mirror of https://hg.openjdk.java.net/jdk-updates/jdk11u/
GNU General Public License v2.0
11 stars 14 forks source link

RV32 C2 模式下的 SPECjvm2008 测试情况 #594

Open zifeihan opened 10 months ago

zifeihan commented 10 months ago

SPECjvm2008 测试包链接:https://www.spec.org/jvm2008/

bishengJDK 版本为:https://gitee.com/openeuler/bishengjdk-11/commit/810e92efa5dca9ff556277fc4eed076fe0630e5e JDK11U RV32 版本为:https://github.com/openjdk-riscv/jdk11u/commit/cfc5c12f9bd5a0603736217ed3006773f8cf106a 通过测试 RV32 C2,RV32 解释器,BishengJDK RV64 C2 这三个版本,得出三者间的性能差异。 宿主机环境:C8服务器,128核,256G内存。 测试环境:目前还没有 RISC-V 32 位可运行linux的物理机器,因此开发和测试都是使用qemu模拟环境。搭建模拟环境参考:https://github.com/openjdk-riscv/jdk11u/wiki/Build-OpenJDK11-for-RV32G 测试JVM参数均为:-Xmx2048m -Xms2048m,RV32 解释器版本和 RV32 C2 使用同一个JDK11U可执行程序,只是RV32 解释器版本需要另外多加:-Xint 参数用来开启模版解释执行,因为RV32G最大堆内存只有4个G,但是bishengJDK 64位可以使用更大堆内存,为了屏蔽内存差异,因此这里无论是 bishengJDK 还是 JDK11U RV32 版本都设置使用2048m,在 java 程序中往往将 -Xmx 和-Xmx设置为一样的,是为了获取更好的性能,防止内存抖动。执行 SPECjvm2008 测试过程中指定 -bt 32 是设置 并发线程为32,默认为cpu核数,如果并发线程设置太大会导致线程占用内存过多,从而导致OutOfMemoryError异常发生。

BishengJDK RV64 C2 执行命令如下:

/home/zifeihan/bishengjdk-11/build/linux-riscv64-normal-custom-release/jdk/bin/java -Xmx2048m -Xms2048m -jar SPECjvm2008.jar -ikv -ict -coe -bt 32 >a.log

JDK11U RV32 解释器 执行命令如下:

/home/zifeihan/jdk11u/build/linux-riscv32-normal-custom-release/jdk/bin/java -Xmx2048m -Xms2048m -Xint -jar SPECjvm2008.jar -ikv -ict -coe -bt 32 >c.log

JDK11U RV32 C2 执行命令如下:

/home/zifeihan/jdk11u/build/linux-riscv32-normal-custom-release/jdk/bin/java -Xmx2048m -Xms2048m -jar SPECjvm2008.jar -ikv -ict -coe -bt 32 >b.log

BishengJDK RV64 C2 测试结果如下:

SPECjvm2008_bishengJDK64C2.log

JDK11U RV32 解释器 测试结果如下:

SPECjvm2008_jdk11u32Xint.log

JDK11U RV32 C2 测试结果如下:

SPECjvm2008_jdk11u32C2.log

通过测试结果中的测试开始时间和最终结束时间统计如下:

测试版本 开始时间 结束时间 执行时间
BishengJDK RV64 C2 14:39:57 16:41:20 2小时2分钟
JDK11U RV32 解释器 19:35:54 02:40:29 7小时5分钟
JDK11U RV32 C2 16:44:25 19:31:03 2小时47分钟

通过测试结果/报告 OPS 统计如下:

测试用例/版本 BishengJDK RV64 C2 JDK11U RV32 解释器 JDK11U RV32 C2 JDK11U RV32 C2 比 JDK11U RV32 解释器提升N倍
startup.helloworld 8.23 ops/m 5.82 ops/m 5.87 ops/m 0
startup.compiler.compiler 8.42 ops/m 5.94 ops/m 5.87 ops/m 0
startup.compiler.sunflow 8.27 ops/m 5.92 ops/m 5.93 ops/m 0
startup.compress 5.07 ops/m 4.25 ops/m 4.44 ops/m 0
startup.crypto.aes 2.82 ops/m 2.29 ops/m 2.31 ops/m 0
startup.crypto.rsa 4.51 ops/m 3.19 ops/m 3.47 ops/m 0
startup.crypto.signverify 4.75 ops/m 3.57 ops/m 3.64 ops/m 0
startup.mpegaudio 1.19 ops/m 1.12 ops/m 1.05 ops/m 0
startup.scimark.fft 5.60 ops/m 4.42 ops/m 4.46 ops/m 0
startup.scimark.lu 4.56 ops/m 3.82 ops/m 3.78 ops/m 0
startup.scimark.monte_carlo 3.24 ops/m 3.52 ops/m 3.53 ops/m 0
startup.scimark.sor 4.38 ops/m 3.67 ops/m 3.72 ops/m 0
startup.scimark.sparse 3.22 ops/m 3.57 ops/m 3.65 ops/m 0
startup.serial 2.26 ops/m 1.36 ops/m 1.36 ops/m 0
startup.sunflow 1.64 ops/m 1.37 ops/m 1.26 ops/m 0
startup.xml.transform 0.63 ops/m 0.80 ops/m 0.80 ops/m 0
startup.xml.validation 2.26 ops/m 2.59 ops/m 2.57 ops/m 0
compiler.compiler Warmup (120s) NOT VALID NOT VALID NOT VALID 0
compiler.sunflow Warmup (120s) NOT VALID NOT VALID NOT VALID 0
compress 500.78 ops/m 12.04 ops/m 740.66 ops/m 61
crypto.aes 95.54 ops/m 2.64 ops/m 82.23 ops/m 31
crypto.rsa 854.00 ops/m 9.55 ops/m 258.91 ops/m 27
crypto.signverify 553.40 ops/m 7.61 ops/m 248.62 ops/m 32
derby 134.61 ops/m 9.08 ops/m 11.63 ops/m 1
mpegaudio 42.68 ops/m 6.26 ops/m 16.64 ops/m 2
scimark.fft.large OutOfMemoryError OutOfMemoryError OutOfMemoryError 0
scimark.lu.large OutOfMemoryError OutOfMemoryError OutOfMemoryError 0
scimark.sor.large 70.42 ops/m 3.51 ops/m 77.06 ops/m 21
scimark.sparse.large OutOfMemoryError 3.74 ops/m 42.98 ops/m 11
scimark.fft.small 181.82 ops/m 19.95 ops/m 616.99 ops/m 30
scimark.lu.small 368.13 ops/m 11.78 ops/m 346.04 ops/m 29
scimark.sor.small 326.39 ops/m 14.87 ops/m 331.28 ops/m 22
scimark.sparse.small 314.62 ops/m 11.24 ops/m 305.53 ops/m 27
scimark.monte_carlo 291.62 ops/m 6.29 ops/m 290.61 ops/m 46
serial 161.42 ops/m 6.45 ops/m 41.37 ops/m 6
sunflow 44.76 ops/m 6.55 ops/m 11.94 ops/m 1
xml.transform 192.32 ops/m 13.21 ops/m 120.77 ops/m 9
xml.validation 197.56 ops/m 20.97 ops/m 56.80 ops/m 2

测试结论:

  1. 测试过程中无报错,JVM 无崩溃,无异常。
  2. 通过测试报告可以看到 JDK11U RV32 C2 相比 JDK11U RV32 解释器 OPS 最少提升一倍,在多数情况下提升了10-30倍左右。在某些情况下,OPS 比 BishengJDK 高一些,但是在大多数情况下,OPS 还是比BishengJDK 低(BishengJDK 实现了更多的Intrinsic加速)。
sonicyouth98 commented 9 months ago

你好呀,我比较好奇有没有考虑会测试Dacapo,Rena

zifeihan commented 9 months ago

你好呀,我比较好奇有没有考虑会测试Dacapo,Rena

谢谢关注,这个近期会进行测试并给出详细测试报告,欢迎持续关注。

  1. 对 RV32 C2 使用java -jar dacapo-9.12-MR1-bach.jar -s small avrora fop h2 jython lusearch lusearch-fix xalan pmd 测试过,这几个测试全部正常通过。因为版本问题不是所有的测试用例都能通过,因此没有给出测试报告,后续会给出详细测试报告。
  2. renaissance-gpl-0.15.0.jar 这个后续也会纳入到测试中,后续会给出详细测试报告。