SIMD acceleration
EBGeometry can vectorise the innermost signed-distance computation for some primitives
using compiler intrinsics rather than relying on the compiler to auto-vectorise scalar code.
SIMD support is also included for BVH traversal itself, in BVH::PackedBVH.
Everything else in the library is scalar code. However, the performance-critical parts of
the BVH traversal are vectorized, and adding leaf-level vectorization support for new
types of primitives is quite possible – it mostly requires storing the primitives in a
structure-of-arrays (SoA) layout.
How it is enabled
EBGeometry detects the available SIMD instruction set at compile time, using the
standard pre-defined compiler macros __AVX512F__, __AVX__, __SSE4_1__, and
__FMA__ — there is no runtime dispatch. Whichever of these macros your compiler flags
define, that is the code path compiled in.
Target ISA |
Compiler macro(s) required |
|---|---|
AVX-512F (recent server/HEDT CPUs) |
|
AVX + FMA (recommended on x86-64 since ~2013) |
|
SSE 4.1 (older or constrained targets) |
|
No SIMD (portable fallback) |
(none of the above) |
See Building for the exact compiler/CMake/Makefile flags that define these macros for each of the three build methods.
Under the hood
The specific defaults this selects are the BVH branching factor K, the SIMD width W for
the SoA layout of the leaf primitives, and data alignment. How to override these factors
explicitly is an implementation detail, documented alongside the SIMD-supported classes in
SIMD-accelerated classes.