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