RFR: 8257815: Replace global log2 functions with efficient implementations

Claes Redestad redestad at openjdk.java.net
Mon Dec 7 15:08:20 UTC 2020


This patch replaces the log2 functions in globalDefinitions.hpp with more efficient counterparts in utilities/powerOfTwo.hpp

Naming is hard, but I think the following scheme is reasonable:

- log2i: any integral type. 0-hostile
- log2i_allow_zero: any integral type. gracefully handles zero (adds a branch)
- exact_log2i: any integral type. value must be a power of two

I chose log2i rather than log2 to stand out from the log2 functions defined in various standard libraries.

Going through all usage, quite a few uses of log2_long et.c. could be replaced by exact_log2i since they take something that has been checked to be a power of two. Most of the remaining usage seem to be able to use the 0-hostile variant, which avoids a branch.

To sanity check that calculating log2 using count_leading_zeros gives better performance I added a couple of trivial and short-running microbenchmarks to test_powerOfTwo. For small values (<= 1025) the new impl is ~5x faster, with a larger speed-up for larger integer values:

[ RUN      ] power_of_2.log2_long_micro
[       OK ] power_of_2.log2_long_micro (3581 ms)
[ RUN      ] power_of_2.log2_long_small_micro
[       OK ] power_of_2.log2_long_small_micro (549 ms)
[ RUN      ] power_of_2.log2i_micro
[       OK ] power_of_2.log2i_micro (259 ms)
[ RUN      ] power_of_2.log2i_small_micro
[       OK ] power_of_2.log2i_small_micro (113 ms)

I'm not sure if this naive microbenchmark carries its own weight, but it just adds a few seconds and can be useful for quickly checking this performance assumption on other H/W

(Intending this for 17)

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

Commit messages:
 - Clean up exact_log2 comments
 - Invalid use of uintptr_t, use uint64_t to handle 64-bit integers properly on 32-bit
 - Renaming: log2_integral->log2i, _zero->_allow_zero
 - Merge branch 'master' into log2_template
 - Add simple microbenchmarks
 - fix log2_int use in c1_LIRGenerator_ppc/s390
 - Merge branch 'master' into log2_template
 - Cast CPU_MAX_FEATURE to uint64_t
 - Move use of exact_log2_long to exact_log2_integral
 - Clear up exact_log2 preconditions, allow 0x8000...
 - ... and 3 more: https://git.openjdk.java.net/jdk/compare/566d77a2...e4a51060

Changes: https://git.openjdk.java.net/jdk/pull/1663/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1663&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8257815
  Stats: 324 lines in 40 files changed: 130 ins; 98 del; 96 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1663.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1663/head:pull/1663

PR: https://git.openjdk.java.net/jdk/pull/1663


More information about the hotspot-dev mailing list