RFR: 8294198: Implement isFinite intrinsic for RISC-V

Fei Yang fyang at openjdk.org
Fri Sep 23 09:42:22 UTC 2022


On Thu, 22 Sep 2022 12:56:49 GMT, Aleksei Voitylov <avoitylov at openjdk.org> wrote:

> Unlike on x86 (see 8285868 and the discussion in review), isFinite intrinsic turned out to be profitable on RISC-V using the same fclass instruction as for 8293695 (isInfinite instrinsic). Therefore, I'm proposing to have it added on RISC-V in this PR.
> 
> benchmark results:
> 
> before:
> 
> Benchmark                              Mode  Cnt   Score   Error  Units
> DoubleClassCheck.testIsFiniteBranch    avgt   15  52.824 ± 1.744  ns/op
> DoubleClassCheck.testIsFiniteCMov      avgt   15  16.104 ± 0.358  ns/op
> DoubleClassCheck.testIsFiniteStore     avgt   15  14.366 ± 2.174  ns/op
> FloatClassCheck.testIsFiniteBranch     avgt   15  49.821 ± 0.330  ns/op
> FloatClassCheck.testIsFiniteCMov       avgt   15  14.702 ± 0.335  ns/op
> FloatClassCheck.testIsFiniteStore      avgt   15  14.749 ± 0.496  ns/op
> 
> after:
> 
> DoubleClassCheck.testIsFiniteBranch    avgt   15  48.921 ± 0.557  ns/op
> DoubleClassCheck.testIsFiniteCMov      avgt   15  13.716 ± 0.304  ns/op
> DoubleClassCheck.testIsFiniteStore     avgt   15   9.152 ± 0.158  ns/op
> FloatClassCheck.testIsFiniteBranch     avgt   15  47.740 ± 2.028  ns/op
> FloatClassCheck.testIsFiniteCMov       avgt   15  13.299 ± 0.282  ns/op
> FloatClassCheck.testIsFiniteStore      avgt   15   9.185 ± 0.396  ns/op
> 
> Existing isInfinite jtreg test was altered to be able to use common code for isFinite test and fine-grained requires tag filtering. Existing benchmark was modified to include isFinite case. A typo ("Atleast" -> "At least") was fixed on the way.
> 
> Test passed on both release and fastdebug builds. Hotspot tier1 tests were run on x86_64 and RISC-V with no issues.

May I ask on which platform was the JMH test performed? I see some fluctuations for 'testIsFiniteBranch' on SiFive Unmatched board:

Before:
Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  32.114 ± 3.514  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   8.656 ± 0.023  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   7.757 ± 1.691  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  32.446 ± 3.130  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.801 ± 0.011  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   7.279 ± 1.483  ns/op

Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  33.724 ± 5.157  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   8.642 ± 0.012  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   7.765 ± 1.711  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  31.401 ± 4.104  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.799 ± 0.014  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   8.234 ± 0.023  ns/op

Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  32.461 ± 3.688  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   8.643 ± 0.007  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   7.772 ± 1.701  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  33.258 ± 3.131  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.815 ± 0.014  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   6.343 ± 1.475  ns/op

After:
Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  33.915 ± 4.193  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   7.736 ± 0.012  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   5.931 ± 0.007  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  33.845 ± 3.449  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.543 ± 0.013  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   6.035 ± 0.006  ns/op

Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  33.421 ± 4.262  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   7.734 ± 0.012  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   5.940 ± 0.010  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  33.348 ± 2.656  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.542 ± 0.013  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   6.040 ± 0.004  ns/op

Benchmark                              Mode  Cnt   Score   Error  Units
DoubleClassCheck.testIsFiniteBranch    avgt   15  31.669 ± 2.517  ns/op
DoubleClassCheck.testIsFiniteCMov      avgt   15   7.761 ± 0.092  ns/op
DoubleClassCheck.testIsFiniteStore     avgt   15   5.940 ± 0.007  ns/op
FloatClassCheck.testIsFiniteBranch     avgt   15  33.508 ± 3.680  ns/op
FloatClassCheck.testIsFiniteCMov       avgt   15   7.534 ± 0.009  ns/op
FloatClassCheck.testIsFiniteStore      avgt   15   6.031 ± 0.007  ns/op

-------------

PR: https://git.openjdk.org/jdk/pull/10391


More information about the hotspot-dev mailing list