2.1 KiB
2.1 KiB
Optimization: SoA (float version)
- Author: Smail
- Predecessor: variant_float_inlining_SoA.cpp
- File(s): variants/variant_float_inlining_SoA_symmetry.cpp
- Status: TBD
What this changes
Implemented a LUT for calculating the distances since they are symmetric. Saves n_p/2 sqrt
Code (relevant snippet)
See variants/variant_float_inlining_SoA.cpp.
Benchmark
Conditions: min of N runs (TBD), N_ITER=1000, -O3 -march=native -flto.
Diff is vs variant_float_inlining.
x86
Machine: TBD
Frequency: TBD
| N | W(n) [Flops] | T(n) [Cycles] | Performance [Flops/Cycle] | Diff vs Predecessor |
|---|---|---|---|---|
| 50 | ||||
| 100 | ||||
| 200 | ||||
| 500 |
ARM (Apple)
Machine: TBD
Frequency: TBD
| N | W(n) [Flops] | T(n) [Cycles] | Performance [Flops/Cycle] | Diff vs Predecessor |
|---|---|---|---|---|
| 50 | ||||
| 100 | ||||
| 200 | ||||
| 500 |
Analysis
Layout change only, so the expectation is roughly no win on its own. The
float scalar loop already auto-vectorises in pieces with -O3 -march=native, so SoA doesnt buy much over what the AoS version was
already doing. The real payoff lands in the AVX2 child.
Verify passes against baseline_float_n60_i500.csv (from
variant_float_baseline) at the 1cm tolerance.
Takeaway
Setup step for the AVX2 variant.