wg icon indicating copy to clipboard operation
wg copied to clipboard

Branch prediction hints (i.e. Likely/Unlikely)

Open aclysma opened this issue 6 years ago • 1 comments

In some performance sensitive code, hinting to the compiler that a certain path is likely or unlikely to be taken can be a helpful optimization:

  • Sometimes the unlikely path is extremely unlikely/unintended (for example, a fixed-size object pool being full, trying to normalize a 0-length vector). Sometimes, the path is completely unreachable.
  • Sometimes you may want to optimize for the unlikely path - for example a spin loop waiting for an event.

There is a discussion here: https://github.com/rust-lang/rust/issues/26179

The RFC was accepted but the intrinsics are not stabilized, I think mainly because:

  • The LLVM team recommends (and clang uses) branch weights instead. (These intrinsics disable certain optimizations in LLVM, which might defeat the purpose of using them.)
  • This doesn't support hinting if let or match statements.

Workarounds:

  • Compiler intrinsics std::intrinsics::likely and std::intrinsics::unlikely are available in nightly, even though they could be harmful the way they work now
  • #[cold] will hint to llvm that a certain path is less likely to be called. This also prevents inlining which can reduce icache pressure
  • unreachable!() and unreachable_unchecked!() are worth considering for the unreachable case. It's not clear to me if unreachable!() does any optimization, but unreachable_unchecked does. (not sure, but probably via llvm's assume)
  • Profile-guided optimization

aclysma avatar Sep 02 '19 07:09 aclysma

My crate nudge is possibly a good workaround for now. It does not require nightly.

mtak- avatar Oct 02 '19 18:10 mtak-