From 822e9d0ef37cface567e2f1b0e4724a6a160ef9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BQuy=20Anh=5D=20=C2=ABElliot=C2=BB=20Nguyen?= <23906-nguyenquy@users.noreply.gitlab.inf.ethz.ch> Date: Thu, 18 Jun 2026 22:25:19 +0200 Subject: [PATCH] Best Non-Vectorized Version Benchmark + Duplicate Files Removal --- analysis/fig_tracks.svg | 662 ++++++++-------- analysis/plots.py | 53 +- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 64 -- .../x86/1.log | 66 -- .../x86/2.log | 64 -- .../x86/3.log | 64 -- .../x86/1.log | 66 -- .../x86/2.log | 64 -- .../x86/3.log | 64 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 64 -- .../x86/3.log | 64 -- .../x86/1.log | 66 -- .../x86/2.log | 64 -- .../x86/3.log | 64 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../arm/1.log | 58 -- .../arm/1.log | 0 .../arm/2.log | 0 .../arm/3.log | 0 .../2.log => variant_inlining_8/x86/4.log} | 38 +- .../3.log => variant_inlining_8/x86/5.log} | 38 +- .../1.log => variant_inlining_8/x86/6.log} | 38 +- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- .../x86/1.log | 66 -- .../x86/2.log | 66 -- .../x86/3.log | 66 -- ...oat_inlining_SoA_AVX512_polyexp_expfix.cpp | 540 ------------- ..._SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp | 557 ------------- ...ning_SoA_AVX512_polyexp_moreavx_expfix.cpp | 577 -------------- ...oA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp | 638 --------------- ...2_polyexp_moreavx_ilp_2_moreilp_expfix.cpp | 735 ------------------ ...512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp | 634 --------------- ...oA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp | 727 ----------------- ..._polyexp_moreavx_ilp_2_rsqrt_morersqrt.cpp | 646 --------------- ...olyexp_morevect_ilp_2_rsqrt_morersqrt.cpp} | 0 ..._SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp | 483 ------------ ...A_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp | 576 -------------- ...ng_8_SoA_AVX512_polyexp_moreavx_expfix.cpp | 563 -------------- ...oA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp | 640 --------------- 73 files changed, 446 insertions(+), 11105 deletions(-) delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/1.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/2.log delete mode 100644 measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/3.log delete mode 100644 measurements/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt/arm/1.log rename measurements/{variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix => variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt}/arm/1.log (100%) rename measurements/{variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix => variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt}/arm/2.log (100%) rename measurements/{variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix => variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt}/arm/3.log (100%) rename measurements/{variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/2.log => variant_inlining_8/x86/4.log} (61%) rename measurements/{variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/3.log => variant_inlining_8/x86/5.log} (61%) rename measurements/{variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/1.log => variant_inlining_8/x86/6.log} (58%) delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/1.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/2.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/3.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log delete mode 100644 measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp delete mode 100644 variants/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt.cpp rename variants/{variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix.cpp => variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt.cpp} (100%) delete mode 100644 variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp delete mode 100644 variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp delete mode 100644 variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp delete mode 100644 variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp diff --git a/analysis/fig_tracks.svg b/analysis/fig_tracks.svg index 078a79e..17ff873 100644 --- a/analysis/fig_tracks.svg +++ b/analysis/fig_tracks.svg @@ -1,12 +1,12 @@ - + - 2026-06-17T10:45:24.236157 + 2026-06-18T21:57:12.920540 image/svg+xml @@ -21,42 +21,42 @@ - - - + - - + - + - + - + - + - + - + - + - + - + - + @@ -212,18 +212,18 @@ L 283.242201 50.483625 - + - + - + - + - + - + @@ -266,18 +266,18 @@ L 432.284368 50.483625 - + - + - + @@ -285,18 +285,18 @@ L 530.795882 50.483625 - + - + - + @@ -306,123 +306,123 @@ L 605.316966 50.483625 - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + @@ -858,18 +858,18 @@ L 633.524062 211.470292 - + - + - + @@ -877,18 +877,18 @@ L 633.524062 171.223625 - + - + - + @@ -896,18 +896,18 @@ L 633.524062 130.976958 - + - + - + @@ -915,18 +915,18 @@ L 633.524062 90.730292 - + - + - + - + - - - - - - - - - + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + - + - - - - + + - - - + - - + + @@ -1499,7 +1539,7 @@ z - + - + + - + - + + + - + - + - + - + - + @@ -2382,7 +2434,7 @@ z - + - + - + @@ -2570,8 +2622,8 @@ z - - + + diff --git a/analysis/plots.py b/analysis/plots.py index 37e17f4..ad3b309 100644 --- a/analysis/plots.py +++ b/analysis/plots.py @@ -114,7 +114,7 @@ tracks = [ "AVX-512 + PolyExp + RSQRT + ILP-Outer (float)", crimson, "-"), ] -fig, ax = plt.subplots(figsize=(9, 4.7)) +fig, ax = plt.subplots(figsize=(10, 7)) ends = [] for v, lab, c, ls in tracks: @@ -129,19 +129,49 @@ for v, lab, c, ls in tracks: lw=2.4 if c == maroon else 1.8) if c == maroon: side = "below" - xpos = 5600 + xpos = 2000 + y = y - 1 + elif v == "variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_improved_moreilp": + xpos = 2000 + side = "above" + y = y + 0.25 + elif lab == "Scalar Baseline (double)": + xpos = 750 + # y = + side = "above" + elif lab == "AVX-512 (double)": + xpos = 725 + side = "above" + elif lab == "AVX-256 + PolyExp + RSQRT (float)": + xpos = 800 + y = y + 0.2 + side = "above" + elif lab == "AVX-256 + PolyExp (float)": + xpos = 775 + y = y + 0.2 + side = "above" + elif lab == "AVX-512 + PolyExp (double)": + xpos = 775 + y = y + 0.1 + side = "above" + elif lab == "AVX-256 (double)": + xpos = 725 + side = "above" else: side = "above" xpos = None ends.append((x, y, lab, c, xpos, side)) +perf_bound_instruction_mix = 28.19 for yv, t in [ - (27.43, f"Peak π based on instruction mix [{27.43} flops/cycle]"), + (perf_bound_instruction_mix, + f"Peak π based on instruction mix [{perf_bound_instruction_mix} flops/cycle]" + ), # (PEAK_D, f"Peak π par. w/ doubles ({PEAK_D} flops/cycle)"), # (PEAK_F, f"Peak π par. w/ floats ({PEAK_F} flops/cycle)") ]: - ax.axhline(yv, ls=":", color="#999", lw=1.2) - ax.text(52, yv * 1.03, t, fontsize=9, color="#888", fontweight="bold") + ax.axhline(yv, ls=":", color="#999", lw=4) + ax.text(52, yv * 1.03, t, fontsize=15, color="#888", fontweight="bold") ax.set_xscale("log", base=10) ax.set_xticks([50, 100, 200, 500, 1000, 2000, 5000, 10000]) @@ -150,22 +180,23 @@ ax.set_xlim(46, 13000) ax.set_ylim(0, 30) for label in ax.get_yticklabels(): label.set_fontweight('bold') - label.set_fontsize(9) + label.set_fontsize(14) for label in ax.get_xticklabels(): label.set_fontweight('bold') - label.set_fontsize(9) -ax.set_xlabel("Number of Pedestrians", fontweight="bold", fontsize=9) + label.set_fontsize(14) +ax.set_xlabel("Number of Pedestrians", fontweight="bold", fontsize=16) ax.grid(color="#e9e9e9") ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) plt.title( - 'Performance (flops/cycle) [N = 3]\nCPU: AMD Ryzen AI 7 350 @ 2 GHz\nCompiler: g++ (Debian 15.2.0-17) 15.2.0\nFlags: -O3 -march=native -std=c++23 -Wall -Wextra -flto', + 'Performance (flops/cycle) [N = 3]\nCPU: AMD Ryzen AI 7 350 @ 2 GHz\nCompiler: g++ (Debian 15.2.0-17) 15.2.0\nFlags: -O3 -march=native -std=c++23 -Wall -Wextra -flto\n', loc='left', - size=9, + size=18, fontweight="bold") ax.grid(color="#e9e9e9") plt.tight_layout() -label_lines_above(ax, ends, fontsize=7.25, dy_frac=0.012) +label_lines_above(ax, ends, fontsize=15, dy_frac=0.003, halo=0) +# fig.set_size_inches(15, 10) plt.savefig("analysis/fig_tracks.svg", bbox_inches="tight") # plot 2: all the milestones + the symmetry one that got slower diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/1.log deleted file mode 100644 index 6062c1a..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX2_polyexp_expfix.cpp -o main_float_inlining_SoA_AVX2_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5860437.00 cycles -P(n): 6.27 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 19736818.00 cycles -P(n): 7.37 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 71295200.00 cycles -P(n): 8.12 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 434200736.00 cycles -P(n): 8.31 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1690932352.00 cycles -P(n): 8.52 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 6726832128.00 cycles -P(n): 8.57 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 41595662336.00 cycles -P(n): 8.66 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 166348996608.00 cycles -P(n): 3.49 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/2.log deleted file mode 100644 index 652e0a6..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX2_polyexp_expfix.cpp -o main_float_inlining_SoA_AVX2_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5885449.00 cycles -P(n): 6.24 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 19775262.00 cycles -P(n): 7.36 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 71759640.00 cycles -P(n): 8.07 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 442073856.00 cycles -P(n): 8.16 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1698162944.00 cycles -P(n): 8.49 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 6719285248.00 cycles -P(n): 8.58 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 41795964928.00 cycles -P(n): 8.62 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 166340608000.00 cycles -P(n): 3.49 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/3.log deleted file mode 100644 index 543ba85..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_expfix/x86/3.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5839795.00 cycles -P(n): 6.29 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 19706848.00 cycles -P(n): 7.38 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 71913632.00 cycles -P(n): 8.05 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 431199296.00 cycles -P(n): 8.37 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1710698496.00 cycles -P(n): 8.43 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 6773665792.00 cycles -P(n): 8.51 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 43346759680.00 cycles -P(n): 8.31 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 169504800768.00 cycles -P(n): 3.43 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/1.log deleted file mode 100644 index 7e95d51..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix.cpp -o main_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5075402.00 cycles -P(n): 7.24 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 16874942.00 cycles -P(n): 8.62 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 60586048.00 cycles -P(n): 9.56 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 363991840.00 cycles -P(n): 9.91 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1424352768.00 cycles -P(n): 10.12 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5638619648.00 cycles -P(n): 10.22 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 35081228288.00 cycles -P(n): 10.26 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 140734889984.00 cycles -P(n): 4.13 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/2.log deleted file mode 100644 index 322109b..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/2.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5095124.00 cycles -P(n): 7.21 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 16958378.00 cycles -P(n): 8.58 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 60894740.00 cycles -P(n): 9.51 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 364922464.00 cycles -P(n): 9.89 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1432131456.00 cycles -P(n): 10.07 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5669585408.00 cycles -P(n): 10.16 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 35706060800.00 cycles -P(n): 10.08 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 143150546944.00 cycles -P(n): 4.06 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/3.log deleted file mode 100644 index a1c9040..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_expfix/x86/3.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 5107488.00 cycles -P(n): 7.19 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 16972588.00 cycles -P(n): 8.57 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 61120552.00 cycles -P(n): 9.47 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 375650720.00 cycles -P(n): 9.60 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1444334464.00 cycles -P(n): 9.98 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5717088768.00 cycles -P(n): 10.08 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 36025249792.00 cycles -P(n): 10.00 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 143378251776.00 cycles -P(n): 4.05 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/1.log deleted file mode 100644 index eab143b..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix.cpp -o main_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4870774.50 cycles -P(n): 7.54 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 15640118.00 cycles -P(n): 9.30 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 55310808.00 cycles -P(n): 10.47 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 329563872.00 cycles -P(n): 10.95 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1283268352.00 cycles -P(n): 11.23 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5083250688.00 cycles -P(n): 11.34 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 31586570240.00 cycles -P(n): 11.40 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 126882955264.00 cycles -P(n): 4.58 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/2.log deleted file mode 100644 index e4dcd7a..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/2.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4872185.50 cycles -P(n): 7.54 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 15664138.00 cycles -P(n): 9.29 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 55368740.00 cycles -P(n): 10.46 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 329987008.00 cycles -P(n): 10.93 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1293044736.00 cycles -P(n): 11.15 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5130688512.00 cycles -P(n): 11.23 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 32060348416.00 cycles -P(n): 11.23 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 129057972224.00 cycles -P(n): 4.50 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/3.log deleted file mode 100644 index da0c24a..0000000 --- a/measurements/variant_float_inlining_SoA_AVX2_polyexp_rsqrt_loopopt_expfix/x86/3.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4901788.00 cycles -P(n): 7.50 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 15669965.00 cycles -P(n): 9.28 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 55911480.00 cycles -P(n): 10.35 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 338225088.00 cycles -P(n): 10.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1302161408.00 cycles -P(n): 11.07 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 5189515776.00 cycles -P(n): 11.11 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 32577761280.00 cycles -P(n): 11.05 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 129035010048.00 cycles -P(n): 4.50 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/1.log deleted file mode 100644 index 533d3a6..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4618692.00 cycles -P(n): 7.95 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14020708.00 cycles -P(n): 10.38 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47426524.00 cycles -P(n): 12.21 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 271672832.00 cycles -P(n): 13.28 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1041892096.00 cycles -P(n): 13.84 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4086357760.00 cycles -P(n): 14.10 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25345890304.00 cycles -P(n): 14.21 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 100797374464.00 cycles -P(n): 5.77 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/2.log deleted file mode 100644 index 1d0ae94..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4660804.50 cycles -P(n): 7.88 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14015782.00 cycles -P(n): 10.38 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47630040.00 cycles -P(n): 12.16 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 272007200.00 cycles -P(n): 13.26 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1042778816.00 cycles -P(n): 13.82 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4092400640.00 cycles -P(n): 14.08 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25352386560.00 cycles -P(n): 14.20 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 101285814272.00 cycles -P(n): 5.74 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/3.log deleted file mode 100644 index 49a7e56..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4633135.50 cycles -P(n): 7.93 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14098810.00 cycles -P(n): 10.32 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47519168.00 cycles -P(n): 12.18 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 272423904.00 cycles -P(n): 13.24 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1060791424.00 cycles -P(n): 13.59 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4102831872.00 cycles -P(n): 14.05 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25357774848.00 cycles -P(n): 14.20 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 100551254016.00 cycles -P(n): 5.78 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log deleted file mode 100644 index 7cc9274..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4899351.00 cycles -P(n): 7.50 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14704840.00 cycles -P(n): 9.89 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 48870456.00 cycles -P(n): 11.85 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 274548320.00 cycles -P(n): 13.14 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1067638016.00 cycles -P(n): 13.50 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4133780736.00 cycles -P(n): 13.94 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25536294912.00 cycles -P(n): 14.10 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 101531860992.00 cycles -P(n): 5.72 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log deleted file mode 100644 index b038931..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4906050.00 cycles -P(n): 7.49 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14798538.00 cycles -P(n): 9.83 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 48817384.00 cycles -P(n): 11.86 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 276943584.00 cycles -P(n): 13.03 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1052295168.00 cycles -P(n): 13.70 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4133724672.00 cycles -P(n): 13.94 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25570220032.00 cycles -P(n): 14.08 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 101490999296.00 cycles -P(n): 5.73 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log deleted file mode 100644 index ed48881..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4896082.00 cycles -P(n): 7.50 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14589518.00 cycles -P(n): 9.97 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 48579536.00 cycles -P(n): 11.92 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 275277376.00 cycles -P(n): 13.10 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1050094400.00 cycles -P(n): 13.73 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4110344448.00 cycles -P(n): 14.02 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25639516160.00 cycles -P(n): 14.04 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 101213003776.00 cycles -P(n): 5.74 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log deleted file mode 100644 index 29aad47..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4444855.00 cycles -P(n): 8.27 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13834708.00 cycles -P(n): 10.52 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47410956.00 cycles -P(n): 12.21 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 276381408.00 cycles -P(n): 13.05 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1067362496.00 cycles -P(n): 13.51 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4156325376.00 cycles -P(n): 13.87 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 26170245120.00 cycles -P(n): 13.76 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 104163885056.00 cycles -P(n): 5.58 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log deleted file mode 100644 index dcd470c..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4415419.00 cycles -P(n): 8.32 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13731945.00 cycles -P(n): 10.59 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47216112.00 cycles -P(n): 12.26 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 273902208.00 cycles -P(n): 13.17 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1066031616.00 cycles -P(n): 13.52 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4168480512.00 cycles -P(n): 13.83 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25959776256.00 cycles -P(n): 13.87 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 103256596480.00 cycles -P(n): 5.63 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log deleted file mode 100644 index a66e481..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4421310.50 cycles -P(n): 8.31 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13851305.00 cycles -P(n): 10.50 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 47453300.00 cycles -P(n): 12.20 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 275350432.00 cycles -P(n): 13.10 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 1059425216.00 cycles -P(n): 13.61 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 4161480448.00 cycles -P(n): 13.85 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 25909958656.00 cycles -P(n): 13.90 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 102891044864.00 cycles -P(n): 5.65 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log deleted file mode 100644 index 8b8601d..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4116743.00 cycles -P(n): 8.92 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14193060.00 cycles -P(n): 10.25 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46275016.00 cycles -P(n): 12.51 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 250446432.00 cycles -P(n): 14.40 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 977844992.00 cycles -P(n): 14.74 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3811610624.00 cycles -P(n): 15.12 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23616888832.00 cycles -P(n): 15.25 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 94000291840.00 cycles -P(n): 6.18 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log deleted file mode 100644 index 2a209b9..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4130377.00 cycles -P(n): 8.90 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14179700.00 cycles -P(n): 10.26 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46318220.00 cycles -P(n): 12.50 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 250998336.00 cycles -P(n): 14.37 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 982180672.00 cycles -P(n): 14.68 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3805426944.00 cycles -P(n): 15.14 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23592302592.00 cycles -P(n): 15.26 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 93937680384.00 cycles -P(n): 6.19 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log deleted file mode 100644 index 7f8cb13..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4107580.00 cycles -P(n): 8.94 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14142018.00 cycles -P(n): 10.29 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46132236.00 cycles -P(n): 12.55 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 248790048.00 cycles -P(n): 14.50 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 974417088.00 cycles -P(n): 14.79 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3791391744.00 cycles -P(n): 15.20 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23488210944.00 cycles -P(n): 15.33 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 93195214848.00 cycles -P(n): 6.24 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/1.log deleted file mode 100644 index 3ea961d..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4119329.50 cycles -P(n): 8.92 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14140615.00 cycles -P(n): 10.29 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46104904.00 cycles -P(n): 12.56 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 248777184.00 cycles -P(n): 14.50 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 972575296.00 cycles -P(n): 14.82 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3793779712.00 cycles -P(n): 15.19 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23662673920.00 cycles -P(n): 15.22 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 93648879616.00 cycles -P(n): 6.21 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/2.log deleted file mode 100644 index 29375a1..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4131873.00 cycles -P(n): 8.89 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14207365.00 cycles -P(n): 10.24 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46157304.00 cycles -P(n): 12.54 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 249512304.00 cycles -P(n): 14.46 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 974145152.00 cycles -P(n): 14.80 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3796545280.00 cycles -P(n): 15.18 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23539767296.00 cycles -P(n): 15.30 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 93385080832.00 cycles -P(n): 6.22 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/3.log deleted file mode 100644 index d853e35..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4133901.25 cycles -P(n): 8.89 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14286805.00 cycles -P(n): 10.18 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46514768.00 cycles -P(n): 12.45 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 250415104.00 cycles -P(n): 14.41 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 979476864.00 cycles -P(n): 14.72 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3790536448.00 cycles -P(n): 15.20 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23435288576.00 cycles -P(n): 15.36 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 93591674880.00 cycles -P(n): 6.21 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/1.log deleted file mode 100644 index 4022b05..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4119765.00 cycles -P(n): 8.92 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14158772.00 cycles -P(n): 10.27 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46276376.00 cycles -P(n): 12.51 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 249878624.00 cycles -P(n): 14.44 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 982863872.00 cycles -P(n): 14.67 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3826156544.00 cycles -P(n): 15.06 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23693496320.00 cycles -P(n): 15.20 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 94222524416.00 cycles -P(n): 6.17 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/2.log deleted file mode 100644 index 4c1d8cf..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4102695.50 cycles -P(n): 8.96 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14151872.00 cycles -P(n): 10.28 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46248272.00 cycles -P(n): 12.52 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 249935680.00 cycles -P(n): 14.43 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 977354240.00 cycles -P(n): 14.75 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3821584896.00 cycles -P(n): 15.08 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23594674176.00 cycles -P(n): 15.26 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 94093844480.00 cycles -P(n): 6.18 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/3.log deleted file mode 100644 index a80e32c..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 4124268.00 cycles -P(n): 8.91 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 14218675.00 cycles -P(n): 10.23 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 46843476.00 cycles -P(n): 12.36 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 250210640.00 cycles -P(n): 14.42 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 982352128.00 cycles -P(n): 14.67 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3823222016.00 cycles -P(n): 15.07 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 23695175680.00 cycles -P(n): 15.20 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 94304829440.00 cycles -P(n): 6.16 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/1.log deleted file mode 100644 index fd8f66f..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3472917.50 cycles -P(n): 10.58 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11763622.00 cycles -P(n): 12.37 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 38070640.00 cycles -P(n): 15.21 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 204154320.00 cycles -P(n): 17.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 798999808.00 cycles -P(n): 18.04 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3114275584.00 cycles -P(n): 18.50 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 19146825728.00 cycles -P(n): 18.81 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 76207964160.00 cycles -P(n): 7.63 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/2.log deleted file mode 100644 index 0a1f7d4..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3503500.00 cycles -P(n): 10.49 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11802675.00 cycles -P(n): 12.33 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 37947776.00 cycles -P(n): 15.26 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 203323776.00 cycles -P(n): 17.74 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 821986944.00 cycles -P(n): 17.54 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3103710720.00 cycles -P(n): 18.57 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 19254915072.00 cycles -P(n): 18.70 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 76036898816.00 cycles -P(n): 7.64 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/3.log deleted file mode 100644 index 8fb271d..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3474629.50 cycles -P(n): 10.57 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11869545.00 cycles -P(n): 12.26 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 38112416.00 cycles -P(n): 15.19 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 203449264.00 cycles -P(n): 17.73 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 816738752.00 cycles -P(n): 17.65 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3081998592.00 cycles -P(n): 18.70 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 19241965568.00 cycles -P(n): 18.71 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 76032835584.00 cycles -P(n): 7.64 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/1.log deleted file mode 100644 index ed597a5..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3443131.25 cycles -P(n): 10.67 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11289992.00 cycles -P(n): 12.89 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 36293512.00 cycles -P(n): 15.95 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 193259072.00 cycles -P(n): 18.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 752713344.00 cycles -P(n): 19.15 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2940765440.00 cycles -P(n): 19.60 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18122862592.00 cycles -P(n): 19.87 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 71869390848.00 cycles -P(n): 8.09 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/2.log deleted file mode 100644 index 08bfc3e..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/2.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3387230.00 cycles -P(n): 10.85 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11326786.00 cycles -P(n): 12.84 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 36351516.00 cycles -P(n): 15.93 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 194490336.00 cycles -P(n): 18.55 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 753201792.00 cycles -P(n): 19.14 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2954236416.00 cycles -P(n): 19.51 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18356828160.00 cycles -P(n): 19.62 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 73678970880.00 cycles -P(n): 7.89 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/3.log deleted file mode 100644 index 70f3e89..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved/x86/3.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3445767.00 cycles -P(n): 10.66 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 11501729.00 cycles -P(n): 12.65 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 36756200.00 cycles -P(n): 15.75 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 198376320.00 cycles -P(n): 18.18 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 765950336.00 cycles -P(n): 18.82 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2987576576.00 cycles -P(n): 19.29 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18625347584.00 cycles -P(n): 19.33 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 73340780544.00 cycles -P(n): 7.92 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/1.log deleted file mode 100644 index 5b20e8e..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 2430659.75 cycles -P(n): 15.12 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 8285106.00 cycles -P(n): 17.56 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 30615050.00 cycles -P(n): 18.91 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 186199040.00 cycles -P(n): 19.37 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 728076288.00 cycles -P(n): 19.80 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2895743232.00 cycles -P(n): 19.90 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18180956160.00 cycles -P(n): 19.81 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 72372396032.00 cycles -P(n): 8.03 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/2.log deleted file mode 100644 index 66eac2b..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/2.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 2443465.25 cycles -P(n): 15.04 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 8370210.00 cycles -P(n): 17.38 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 30839560.00 cycles -P(n): 18.77 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 185338336.00 cycles -P(n): 19.46 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 737704256.00 cycles -P(n): 19.54 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2915981056.00 cycles -P(n): 19.76 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18362775552.00 cycles -P(n): 19.61 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 73707225088.00 cycles -P(n): 7.88 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/3.log deleted file mode 100644 index a9c7550..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_morersqrt_expfix_improved_moreilp/x86/3.log +++ /dev/null @@ -1,64 +0,0 @@ -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 2445340.00 cycles -P(n): 15.02 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 8350645.00 cycles -P(n): 17.42 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 30609110.00 cycles -P(n): 18.91 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 186796768.00 cycles -P(n): 19.31 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 733212800.00 cycles -P(n): 19.66 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 2960800768.00 cycles -P(n): 19.46 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 18505687040.00 cycles -P(n): 19.46 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 73613836288.00 cycles -P(n): 7.89 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/1.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/1.log deleted file mode 100644 index 9eac607..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3897775.00 cycles -P(n): 9.43 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13522278.00 cycles -P(n): 10.76 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 50063060.00 cycles -P(n): 11.56 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 240297888.00 cycles -P(n): 15.01 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 942706688.00 cycles -P(n): 15.29 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3722795008.00 cycles -P(n): 15.48 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 22749288448.00 cycles -P(n): 15.83 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 90110476288.00 cycles -P(n): 6.45 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/2.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/2.log deleted file mode 100644 index e61cf75..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3907767.50 cycles -P(n): 9.40 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13510660.00 cycles -P(n): 10.77 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 50107380.00 cycles -P(n): 11.55 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 239951200.00 cycles -P(n): 15.03 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 940302272.00 cycles -P(n): 15.33 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3722942720.00 cycles -P(n): 15.48 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 22711234560.00 cycles -P(n): 15.85 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 90064855040.00 cycles -P(n): 6.45 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/3.log b/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/3.log deleted file mode 100644 index 98b4ec6..0000000 --- a/measurements/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main-float.cpp ./variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp -o main_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 3864792.00 cycles -P(n): 9.51 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 13472545.00 cycles -P(n): 10.80 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 49757488.00 cycles -P(n): 11.64 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 238792880.00 cycles -P(n): 15.11 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 953924224.00 cycles -P(n): 15.11 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 3701525248.00 cycles -P(n): 15.57 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 22775025664.00 cycles -P(n): 15.81 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772800.00 flops -Q(n) per iteration: 640056 bytes -I(n): 4539.87 flops/byte -W(n): 581154570240.00 flops -T(n): 90258751488.00 cycles -P(n): 6.44 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt/arm/1.log b/measurements/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt/arm/1.log deleted file mode 100644 index 8f7a2a2..0000000 --- a/measurements/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt/arm/1.log +++ /dev/null @@ -1,58 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -sudo /usr/bin/g++ main-float.cpp ./variants/variant_float_inlining.cpp -o main_float_inlining -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 3256 bytes -I(n): 56.42 flops/byte -W(n): 36740000.00 flops -T(n): 10826171.00 cycles -P(n): 3.39 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 6456 bytes -I(n): 112.67 flops/byte -W(n): 145480000.00 flops -T(n): 48929320.00 cycles -P(n): 2.97 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 12856 bytes -I(n): 225.17 flops/byte -W(n): 578960000.00 flops -T(n): 190686384.00 cycles -P(n): 3.04 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 32056 bytes -I(n): 562.67 flops/byte -W(n): 3607399936.00 flops -T(n): 1427274624.00 cycles -P(n): 2.53 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 64056 bytes -I(n): 1125.17 flops/byte -W(n): 14414799872.00 flops -T(n): 6172825600.00 cycles -P(n): 2.34 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 128056 bytes -I(n): 2250.17 flops/byte -W(n): 57629601792.00 flops -T(n): 27468242944.00 cycles -P(n): 2.10 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800369920.00 flops -Q(n) per iteration: 320056 bytes -I(n): 5625.17 flops/byte -W(n): 360073986048.00 flops -T(n): 192917569536.00 cycles -P(n): 1.87 flops/cycle - diff --git a/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/1.log b/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/1.log similarity index 100% rename from measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/1.log rename to measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/1.log diff --git a/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/2.log b/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/2.log similarity index 100% rename from measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/2.log rename to measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/2.log diff --git a/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/3.log b/measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/3.log similarity index 100% rename from measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix/arm/3.log rename to measurements/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt/arm/3.log diff --git a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/2.log b/measurements/variant_inlining_8/x86/4.log similarity index 61% rename from measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/2.log rename to measurements/variant_inlining_8/x86/4.log index f46ef75..0397599 100644 --- a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/2.log +++ b/measurements/variant_inlining_8/x86/4.log @@ -1,64 +1,58 @@ +rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o +/usr/bin/g++ main.cpp ./variants/variant_inlining_8.cpp -o main_inlining_8 -O3 -march=native -std=c++23 -Wall -Wextra -flto -fno-tree-vectorize -fno-tree-slp-vectorize -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 === N_P=50 N_ITER=200 === W(n) per iteration: 183700.00 flops Q(n) per iteration: 6512 bytes I(n): 28.21 flops/byte W(n): 36740000.00 flops -T(n): 11368170.00 cycles -P(n): 3.23 flops/cycle +T(n): 26033555.00 cycles +P(n): 1.41 flops/cycle === N_P=100 N_ITER=200 === W(n) per iteration: 727400.00 flops Q(n) per iteration: 12912 bytes I(n): 56.34 flops/byte W(n): 145480000.00 flops -T(n): 39909820.00 cycles -P(n): 3.65 flops/cycle +T(n): 101832660.00 cycles +P(n): 1.43 flops/cycle === N_P=200 N_ITER=200 === W(n) per iteration: 2894800.00 flops Q(n) per iteration: 25712 bytes I(n): 112.59 flops/byte W(n): 578960000.00 flops -T(n): 152279380.00 cycles -P(n): 3.80 flops/cycle +T(n): 413861080.00 cycles +P(n): 1.40 flops/cycle === N_P=500 N_ITER=200 === W(n) per iteration: 18037000.00 flops Q(n) per iteration: 64112 bytes I(n): 281.34 flops/byte W(n): 3607400000.00 flops -T(n): 925130680.00 cycles -P(n): 3.90 flops/cycle +T(n): 2656371140.00 cycles +P(n): 1.36 flops/cycle === N_P=1000 N_ITER=200 === W(n) per iteration: 72074000.00 flops Q(n) per iteration: 128112 bytes I(n): 562.59 flops/byte W(n): 14414800000.00 flops -T(n): 3668254420.00 cycles -P(n): 3.93 flops/cycle +T(n): 10821923320.00 cycles +P(n): 1.33 flops/cycle === N_P=2000 N_ITER=200 === W(n) per iteration: 288148000.00 flops Q(n) per iteration: 256112 bytes I(n): 1125.09 flops/byte W(n): 57629600000.00 flops -T(n): 14660040260.00 cycles -P(n): 3.93 flops/cycle +T(n): 44189161700.00 cycles +P(n): 1.30 flops/cycle === N_P=5000 N_ITER=200 === W(n) per iteration: 1800370000.00 flops Q(n) per iteration: 640112 bytes I(n): 2812.59 flops/byte W(n): 360074000000.00 flops -T(n): 93340296780.00 cycles -P(n): 3.86 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 362367747120.00 cycles -P(n): 1.60 flops/cycle +T(n): 301595160640.00 cycles +P(n): 1.19 flops/cycle diff --git a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/3.log b/measurements/variant_inlining_8/x86/5.log similarity index 61% rename from measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/3.log rename to measurements/variant_inlining_8/x86/5.log index 25880a8..49d66a6 100644 --- a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/3.log +++ b/measurements/variant_inlining_8/x86/5.log @@ -1,64 +1,58 @@ +rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o +/usr/bin/g++ main.cpp ./variants/variant_inlining_8.cpp -o main_inlining_8 -O3 -march=native -std=c++23 -Wall -Wextra -flto -fno-tree-vectorize -fno-tree-slp-vectorize -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 === N_P=50 N_ITER=200 === W(n) per iteration: 183700.00 flops Q(n) per iteration: 6512 bytes I(n): 28.21 flops/byte W(n): 36740000.00 flops -T(n): 11342471.25 cycles -P(n): 3.24 flops/cycle +T(n): 25831475.00 cycles +P(n): 1.42 flops/cycle === N_P=100 N_ITER=200 === W(n) per iteration: 727400.00 flops Q(n) per iteration: 12912 bytes I(n): 56.34 flops/byte W(n): 145480000.00 flops -T(n): 40124180.00 cycles -P(n): 3.63 flops/cycle +T(n): 103789940.00 cycles +P(n): 1.40 flops/cycle === N_P=200 N_ITER=200 === W(n) per iteration: 2894800.00 flops Q(n) per iteration: 25712 bytes I(n): 112.59 flops/byte W(n): 578960000.00 flops -T(n): 151911440.00 cycles -P(n): 3.81 flops/cycle +T(n): 412306040.00 cycles +P(n): 1.40 flops/cycle === N_P=500 N_ITER=200 === W(n) per iteration: 18037000.00 flops Q(n) per iteration: 64112 bytes I(n): 281.34 flops/byte W(n): 3607400000.00 flops -T(n): 923357200.00 cycles -P(n): 3.91 flops/cycle +T(n): 2661212560.00 cycles +P(n): 1.36 flops/cycle === N_P=1000 N_ITER=200 === W(n) per iteration: 72074000.00 flops Q(n) per iteration: 128112 bytes I(n): 562.59 flops/byte W(n): 14414800000.00 flops -T(n): 3687447740.00 cycles -P(n): 3.91 flops/cycle +T(n): 10822175600.00 cycles +P(n): 1.33 flops/cycle === N_P=2000 N_ITER=200 === W(n) per iteration: 288148000.00 flops Q(n) per iteration: 256112 bytes I(n): 1125.09 flops/byte W(n): 57629600000.00 flops -T(n): 14732693600.00 cycles -P(n): 3.91 flops/cycle +T(n): 44231659260.00 cycles +P(n): 1.30 flops/cycle === N_P=5000 N_ITER=200 === W(n) per iteration: 1800370000.00 flops Q(n) per iteration: 640112 bytes I(n): 2812.59 flops/byte W(n): 360074000000.00 flops -T(n): 90864696480.00 cycles -P(n): 3.96 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 361983172200.00 cycles -P(n): 1.61 flops/cycle +T(n): 300195617220.00 cycles +P(n): 1.20 flops/cycle diff --git a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/1.log b/measurements/variant_inlining_8/x86/6.log similarity index 58% rename from measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/1.log rename to measurements/variant_inlining_8/x86/6.log index 7ff1112..27cdde1 100644 --- a/measurements/variant_inlining_7_SoA_AVX2_polyexp_expfix/x86/1.log +++ b/measurements/variant_inlining_8/x86/6.log @@ -1,66 +1,58 @@ rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_7_SoA_AVX2_polyexp_expfix.cpp -o main_inlining_7_SoA_AVX2_polyexp_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 +/usr/bin/g++ main.cpp ./variants/variant_inlining_8.cpp -o main_inlining_8 -O3 -march=native -std=c++23 -Wall -Wextra -flto -fno-tree-vectorize -fno-tree-slp-vectorize -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 === N_P=50 N_ITER=200 === W(n) per iteration: 183700.00 flops Q(n) per iteration: 6512 bytes I(n): 28.21 flops/byte W(n): 36740000.00 flops -T(n): 11371033.75 cycles -P(n): 3.23 flops/cycle +T(n): 25817360.00 cycles +P(n): 1.42 flops/cycle === N_P=100 N_ITER=200 === W(n) per iteration: 727400.00 flops Q(n) per iteration: 12912 bytes I(n): 56.34 flops/byte W(n): 145480000.00 flops -T(n): 39890030.00 cycles -P(n): 3.65 flops/cycle +T(n): 101855300.00 cycles +P(n): 1.43 flops/cycle === N_P=200 N_ITER=200 === W(n) per iteration: 2894800.00 flops Q(n) per iteration: 25712 bytes I(n): 112.59 flops/byte W(n): 578960000.00 flops -T(n): 153171560.00 cycles -P(n): 3.78 flops/cycle +T(n): 411909020.00 cycles +P(n): 1.41 flops/cycle === N_P=500 N_ITER=200 === W(n) per iteration: 18037000.00 flops Q(n) per iteration: 64112 bytes I(n): 281.34 flops/byte W(n): 3607400000.00 flops -T(n): 926036960.00 cycles -P(n): 3.90 flops/cycle +T(n): 2676205320.00 cycles +P(n): 1.35 flops/cycle === N_P=1000 N_ITER=200 === W(n) per iteration: 72074000.00 flops Q(n) per iteration: 128112 bytes I(n): 562.59 flops/byte W(n): 14414800000.00 flops -T(n): 3676943300.00 cycles -P(n): 3.92 flops/cycle +T(n): 10820544340.00 cycles +P(n): 1.33 flops/cycle === N_P=2000 N_ITER=200 === W(n) per iteration: 288148000.00 flops Q(n) per iteration: 256112 bytes I(n): 1125.09 flops/byte W(n): 57629600000.00 flops -T(n): 14545721140.00 cycles -P(n): 3.96 flops/cycle +T(n): 44152816920.00 cycles +P(n): 1.31 flops/cycle === N_P=5000 N_ITER=200 === W(n) per iteration: 1800370000.00 flops Q(n) per iteration: 640112 bytes I(n): 2812.59 flops/byte W(n): 360074000000.00 flops -T(n): 90702048200.00 cycles -P(n): 3.97 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 362081083160.00 cycles -P(n): 1.61 flops/cycle +T(n): 300163261180.00 cycles +P(n): 1.20 flops/cycle diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log deleted file mode 100644 index b741ee1..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8339301.25 cycles -P(n): 4.41 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28662660.00 cycles -P(n): 5.08 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 104402900.00 cycles -P(n): 5.55 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 636519040.00 cycles -P(n): 5.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2499027620.00 cycles -P(n): 5.77 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9941452140.00 cycles -P(n): 5.80 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61650558000.00 cycles -P(n): 5.84 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 246792591620.00 cycles -P(n): 2.35 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log deleted file mode 100644 index 5762311..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8445907.50 cycles -P(n): 4.35 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28691310.00 cycles -P(n): 5.07 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 104933160.00 cycles -P(n): 5.52 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 639568720.00 cycles -P(n): 5.64 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2515964020.00 cycles -P(n): 5.73 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9996713720.00 cycles -P(n): 5.76 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 62098746740.00 cycles -P(n): 5.80 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 247013435860.00 cycles -P(n): 2.35 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log deleted file mode 100644 index f95f05f..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8335317.50 cycles -P(n): 4.41 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28557990.00 cycles -P(n): 5.09 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 104404360.00 cycles -P(n): 5.55 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 635858120.00 cycles -P(n): 5.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2509183840.00 cycles -P(n): 5.74 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9956726160.00 cycles -P(n): 5.79 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61839346220.00 cycles -P(n): 5.82 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 246699025260.00 cycles -P(n): 2.36 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/1.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/1.log deleted file mode 100644 index 18b6f5f..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8308587.50 cycles -P(n): 4.42 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28404470.00 cycles -P(n): 5.12 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 103978120.00 cycles -P(n): 5.57 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 633362280.00 cycles -P(n): 5.70 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2494262100.00 cycles -P(n): 5.78 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9899453320.00 cycles -P(n): 5.82 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61865956520.00 cycles -P(n): 5.82 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 246306063920.00 cycles -P(n): 2.36 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/2.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/2.log deleted file mode 100644 index 1653c69..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8344811.25 cycles -P(n): 4.40 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28520365.00 cycles -P(n): 5.10 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 104404120.00 cycles -P(n): 5.55 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 636400560.00 cycles -P(n): 5.67 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2501258800.00 cycles -P(n): 5.76 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9901533780.00 cycles -P(n): 5.82 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61815669960.00 cycles -P(n): 5.82 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 247091597180.00 cycles -P(n): 2.35 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/3.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/3.log deleted file mode 100644 index a60b0dc..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8321530.00 cycles -P(n): 4.42 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 28458355.00 cycles -P(n): 5.11 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 104209360.00 cycles -P(n): 5.56 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 634333640.00 cycles -P(n): 5.69 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2496796020.00 cycles -P(n): 5.77 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9914787460.00 cycles -P(n): 5.81 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61721090840.00 cycles -P(n): 5.83 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 246519066200.00 cycles -P(n): 2.36 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log deleted file mode 100644 index c33cf4f..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 7985528.75 cycles -P(n): 4.60 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27703355.00 cycles -P(n): 5.25 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 102292560.00 cycles -P(n): 5.66 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 629804220.00 cycles -P(n): 5.73 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2472263180.00 cycles -P(n): 5.83 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9851588140.00 cycles -P(n): 5.85 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61479499820.00 cycles -P(n): 5.86 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 245617006060.00 cycles -P(n): 2.37 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log deleted file mode 100644 index 5ee8171..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8028216.25 cycles -P(n): 4.58 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27833730.00 cycles -P(n): 5.23 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 102829680.00 cycles -P(n): 5.63 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 629698060.00 cycles -P(n): 5.73 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2469782600.00 cycles -P(n): 5.84 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9826240720.00 cycles -P(n): 5.86 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61490138600.00 cycles -P(n): 5.86 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 245848977420.00 cycles -P(n): 2.36 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log deleted file mode 100644 index 27a1fc5..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 7992830.00 cycles -P(n): 4.60 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27693680.00 cycles -P(n): 5.25 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 102340840.00 cycles -P(n): 5.66 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 638328340.00 cycles -P(n): 5.65 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2468865800.00 cycles -P(n): 5.84 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9838254540.00 cycles -P(n): 5.86 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 61344519940.00 cycles -P(n): 5.87 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 245174501540.00 cycles -P(n): 2.37 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log deleted file mode 100644 index 7a9a201..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/1.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8506121.25 cycles -P(n): 4.32 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27681145.00 cycles -P(n): 5.26 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 98048030.00 cycles -P(n): 5.90 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 594320700.00 cycles -P(n): 6.07 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2270890500.00 cycles -P(n): 6.35 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 8985906260.00 cycles -P(n): 6.41 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 56358587540.00 cycles -P(n): 6.39 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 224065475420.00 cycles -P(n): 2.59 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log deleted file mode 100644 index e6443dc..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/2.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8512763.75 cycles -P(n): 4.32 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27679115.00 cycles -P(n): 5.26 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 98109310.00 cycles -P(n): 5.90 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 583896260.00 cycles -P(n): 6.18 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2292138700.00 cycles -P(n): 6.29 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 9006037600.00 cycles -P(n): 6.40 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 56211721500.00 cycles -P(n): 6.41 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 223879818840.00 cycles -P(n): 2.60 flops/cycle - diff --git a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log b/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log deleted file mode 100644 index c702109..0000000 --- a/measurements/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix/x86/3.log +++ /dev/null @@ -1,66 +0,0 @@ -rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o -/usr/bin/g++ main.cpp ./variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp -o main_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix -O3 -march=native -std=c++23 -Wall -Wextra -flto -DFLOPCOUNT=0 -DRANDOM_SEED=0 -DROOFLINE=0 -DBENCHMARK=1 -=== N_P=50 N_ITER=200 === -W(n) per iteration: 183700.00 flops -Q(n) per iteration: 6512 bytes -I(n): 28.21 flops/byte -W(n): 36740000.00 flops -T(n): 8550285.00 cycles -P(n): 4.30 flops/cycle - -=== N_P=100 N_ITER=200 === -W(n) per iteration: 727400.00 flops -Q(n) per iteration: 12912 bytes -I(n): 56.34 flops/byte -W(n): 145480000.00 flops -T(n): 27834905.00 cycles -P(n): 5.23 flops/cycle - -=== N_P=200 N_ITER=200 === -W(n) per iteration: 2894800.00 flops -Q(n) per iteration: 25712 bytes -I(n): 112.59 flops/byte -W(n): 578960000.00 flops -T(n): 98660270.00 cycles -P(n): 5.87 flops/cycle - -=== N_P=500 N_ITER=200 === -W(n) per iteration: 18037000.00 flops -Q(n) per iteration: 64112 bytes -I(n): 281.34 flops/byte -W(n): 3607400000.00 flops -T(n): 587210580.00 cycles -P(n): 6.14 flops/cycle - -=== N_P=1000 N_ITER=200 === -W(n) per iteration: 72074000.00 flops -Q(n) per iteration: 128112 bytes -I(n): 562.59 flops/byte -W(n): 14414800000.00 flops -T(n): 2280133880.00 cycles -P(n): 6.32 flops/cycle - -=== N_P=2000 N_ITER=200 === -W(n) per iteration: 288148000.00 flops -Q(n) per iteration: 256112 bytes -I(n): 1125.09 flops/byte -W(n): 57629600000.00 flops -T(n): 8974668040.00 cycles -P(n): 6.42 flops/cycle - -=== N_P=5000 N_ITER=200 === -W(n) per iteration: 1800370000.00 flops -Q(n) per iteration: 640112 bytes -I(n): 2812.59 flops/byte -W(n): 360074000000.00 flops -T(n): 56052905260.00 cycles -P(n): 6.42 flops/cycle - -=== N_P=10000 N_ITER=200 === -W(n) per iteration: 2905772704.00 flops -Q(n) per iteration: 1280112 bytes -I(n): 2269.94 flops/byte -W(n): 581154540800.00 flops -T(n): 224433219680.00 cycles -P(n): 2.59 flops/cycle - diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp deleted file mode 100644 index bcbeeea..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_expfix.cpp +++ /dev/null @@ -1,540 +0,0 @@ -// # Changes: Ported AVX2 to AVX512 -// # Predecessor: variant_float_inlining_SoA_AVX2_polyexp.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 15) & ~15; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 15) & ~15; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 36 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p * 7 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p * 17 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles + - // # n_p * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x = _mm512_setzero_ps(); - __m512 acc_y = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 16) { - - // # 16 ADDs - __m512 j_idx = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - - __mmask16 m_neq_i = _mm512_cmp_ps_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask16 m_in_range = _mm512_cmp_ps_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask16 active = m_neq_i & m_in_range; - - __m512 pjx = _mm512_loadu_ps(&pos_x[j]); - __m512 pjy = _mm512_loadu_ps(&pos_y[j]); - __m512 sbe_jx = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jy = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sb_jsq = _mm512_loadu_ps(&sb_sq[j]); - - // # 32 ADDs - __m512 r_ab_x = _mm512_sub_ps(pix, pjx); - __m512 r_ab_y = _mm512_sub_ps(piy, pjy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab_n2 = _mm512_fmadd_ps(r_ab_x, r_ab_x, _mm512_mul_ps(r_ab_y, r_ab_y)); - - // # 16 SQRTs - __m512 r_ab_n = _mm512_sqrt_ps(r_ab_n2); - - r_ab_n = _mm512_max_ps(r_ab_n, v_eps); - - // # 32 ADDs - __m512 r_ab2_x = _mm512_sub_ps(r_ab_x, sbe_jx); - __m512 r_ab2_y = _mm512_sub_ps(r_ab_y, sbe_jy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab2_n2 = _mm512_fmadd_ps(r_ab2_x, r_ab2_x, _mm512_mul_ps(r_ab2_y, r_ab2_y)); - - // # 16 SQRTs - __m512 r_ab2_n = _mm512_sqrt_ps(r_ab2_n2); - - r_ab2_n = _mm512_max_ps(r_ab2_n, v_eps); - - // # 16 ADDs - __m512 r_sum = _mm512_add_ps(r_ab_n, r_ab2_n); - - // # 16 MULTs, 16 ADDs - __m512 two_b_sq = _mm512_fmsub_ps(r_sum, r_sum, sb_jsq); - - two_b_sq = _mm512_max_ps(two_b_sq, v_eps_sq); - - // # 16 SQRTs - __m512 two_b = _mm512_sqrt_ps(two_b_sq); - - // # 16 MULTs - __m512 e_arg = _mm512_mul_ps(two_b, v_neg_2s_inv); - - e_arg = _mm512_max_ps(e_arg, v_exp_min); - - // # 256 MULTs, 224 ADDs - __m512 e_val = _avx512_exp_ps(e_arg); - - // # 64 MULTs - __m512 numer = _mm512_mul_ps(_mm512_mul_ps(r_sum, v_neg_v0_div_2s), e_val); - __m512 denom = _mm512_mul_ps(_mm512_mul_ps(two_b, r_ab_n), r_ab2_n); - - __m512 denom_safe = _mm512_mask_blend_ps(active, v_one, denom); - - // # 16 DIVs - __m512 smc = _mm512_div_ps(numer, denom_safe); - - // # 32 MULTs - __m512 sm_r_ab = _mm512_mul_ps(smc, r_ab2_n); - __m512 sm_r_ab2 = _mm512_mul_ps(smc, r_ab_n); - - // # 64 MULTs, 32 ADDs - __m512 f_x = _mm512_fmadd_ps(r_ab2_x, sm_r_ab2, _mm512_mul_ps(r_ab_x, sm_r_ab)); - __m512 f_y = _mm512_fmadd_ps(r_ab2_y, sm_r_ab2, _mm512_mul_ps(r_ab_y, sm_r_ab)); - - // # 32 MULTs, 16 ADDs - __m512 f_norm_sq = _mm512_fmadd_ps(f_x, f_x, _mm512_mul_ps(f_y, f_y)); - - // # 16 MULTs - __m512 rhs = _mm512_mul_ps(f_norm_sq, v_cos_phi_sq); - - // # 32 MULTs, 16 ADDs - __m512 e_dot_f = _mm512_fmadd_ps(eix, f_x, _mm512_mul_ps(eiy, f_y)); - - // # 16 MULTs - __m512 e_dot_f_sq = _mm512_mul_ps(e_dot_f, e_dot_f); - - __mmask16 c1 = _mm512_cmp_ps_mask(e_dot_f, v_zero, _CMP_LT_OQ); - __mmask16 c2 = _mm512_cmp_ps_mask(e_dot_f_sq, rhs, _CMP_GT_OQ); - __mmask16 cond = c1 & c2; - - __m512 w_val = _mm512_mask_blend_ps(cond, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe = _mm512_maskz_mov_ps(active, f_x); - __m512 f_y_safe = _mm512_maskz_mov_ps(active, f_y); - - // # 32 MULTs, 32 ADDs - acc_x = _mm512_fmadd_ps(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_ps(f_y_safe, w_val, acc_y); - } - - // # 32 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(acc_x); - f_alpha_dt_y += _mm512_reduce_add_ps(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 4 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTS - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p; i++) { - - // # 1 SQRT, 2 MULTs, 1 ADD - float w_norm = sqrt(w_x[i] * w_x[i] + w_y[i] * w_y[i]); - - float w_norm2 = w_norm > EPS ? w_norm : EPS; - - // # 1 DIV - float correction_factor = min(1.0f, v_max[i] / w_norm2); - - // # 2 MULTs - curr_vel_x[i] = w_x[i] * correction_factor; - curr_vel_y[i] = w_y[i] * correction_factor; - - // # 2 MULTs, 2 ADDs - pos_x[i] = pos_x[i] + curr_vel_x[i] * dt; - pos_y[i] = pos_y[i] + curr_vel_y[i] * dt; - - if (color[i] == 0 && pos_x[i] > BOARD_LENGTH_MINUS_ONE_POINT_FIVE) { - pos_x[i] = 1.0f; - destination_y[i] = pos_y[i]; - w_x[i] = desired_v0[i]; - w_y[i] = 0.0f; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - if (color[i] == 1 && pos_x[i] < 1.5f) { - pos_x[i] = BOARD_LENGTH_MINUS_ONE; - destination_y[i] = pos_y[i]; - w_x[i] = -desired_v0[i]; - w_y[i] = 0.0f; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - - pos_y[i] = clamp(pos_y[i], WALL_EPS, BOARD_WIDTH_MINUS_WALL_EPS); - - // # 2 ADDs - float ex = destination_x[i] - pos_x[i]; - float ey = destination_y[i] - pos_y[i]; - - // # 1 SQRT, 2 MULTs, 1 ADD - float e_norm = sqrt(ex * ex + ey * ey); - - float e_norm2 = e_norm > EPS ? e_norm : EPS; - - // # 1 DIV - float e_norm_inv = 1.0f / e_norm2; - - // # 2 MULTs - e_x[i] = ex * e_norm_inv; - e_y[i] = ey * e_norm_inv; - - // # 2 MULTs, 1 ADD - float velocity_norm_sq = curr_vel_x[i] * curr_vel_x[i] + curr_vel_y[i] * curr_vel_y[i]; - - // # 1 SQRT - float velocity_norm = sqrt(velocity_norm_sq); - - // # 5 MULTs - sb_sq[i] = velocity_norm_sq * delta_t_sq; - sb_e_x[i] = e_x[i] * (velocity_norm * delta_t); - sb_e_y[i] = e_y[i] * (velocity_norm * delta_t); - -#if !BENCHMARK - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } -#endif - } - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp deleted file mode 100644 index f0ab633..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp +++ /dev/null @@ -1,557 +0,0 @@ -// # Changes: Added more correction rounds to _avx512_exp_ps to do 30 flops per scalar -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_fastinvsqrt.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 15) & ~15; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -// # 7 MULTs, 2 ADDs -static inline float fast_inv_sqrt(float number) { - float y = number; - - uint32_t i = bit_cast(y); - - i = 0x5f3759df - (i >> 1); - - y = bit_cast(i); - - // # 1 MULT - float x2 = number * 0.5; - - // # 6 MULTs, 2 ADDs - y = y * (1.5 - (x2 * y * y)); - y = y * (1.5 - (x2 * y * y)); - - return y; -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 15) & ~15; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 36 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p * 11 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p * 30 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x = _mm512_setzero_ps(); - __m512 acc_y = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 16) { - - // # 16 ADDs - __m512 j_idx = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - - __mmask16 m_neq_i = _mm512_cmp_ps_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask16 m_in_range = _mm512_cmp_ps_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask16 active = m_neq_i & m_in_range; - - __m512 pjx = _mm512_loadu_ps(&pos_x[j]); - __m512 pjy = _mm512_loadu_ps(&pos_y[j]); - __m512 sbe_jx = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jy = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sb_jsq = _mm512_loadu_ps(&sb_sq[j]); - - // # 32 ADDs - __m512 r_ab_x = _mm512_sub_ps(pix, pjx); - __m512 r_ab_y = _mm512_sub_ps(piy, pjy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab_n2 = _mm512_fmadd_ps(r_ab_x, r_ab_x, _mm512_mul_ps(r_ab_y, r_ab_y)); - - // # 16 SQRTs - __m512 r_ab_n = _mm512_sqrt_ps(r_ab_n2); - - r_ab_n = _mm512_max_ps(r_ab_n, v_eps); - - // # 32 ADDs - __m512 r_ab2_x = _mm512_sub_ps(r_ab_x, sbe_jx); - __m512 r_ab2_y = _mm512_sub_ps(r_ab_y, sbe_jy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab2_n2 = _mm512_fmadd_ps(r_ab2_x, r_ab2_x, _mm512_mul_ps(r_ab2_y, r_ab2_y)); - - // # 16 SQRTs - __m512 r_ab2_n = _mm512_sqrt_ps(r_ab2_n2); - - r_ab2_n = _mm512_max_ps(r_ab2_n, v_eps); - - // # 16 ADDs - __m512 r_sum = _mm512_add_ps(r_ab_n, r_ab2_n); - - // # 16 MULTs, 16 ADDs - __m512 two_b_sq = _mm512_fmsub_ps(r_sum, r_sum, sb_jsq); - - two_b_sq = _mm512_max_ps(two_b_sq, v_eps_sq); - - // # 16 SQRTs - __m512 two_b = _mm512_sqrt_ps(two_b_sq); - - // # 16 MULTs - __m512 e_arg = _mm512_mul_ps(two_b, v_neg_2s_inv); - - e_arg = _mm512_max_ps(e_arg, v_exp_min); - - // # 256 MULTs, 224 ADDs - __m512 e_val = _avx512_exp_ps(e_arg); - - // # 64 MULTs - __m512 numer = _mm512_mul_ps(_mm512_mul_ps(r_sum, v_neg_v0_div_2s), e_val); - __m512 denom = _mm512_mul_ps(_mm512_mul_ps(two_b, r_ab_n), r_ab2_n); - - __m512 denom_safe = _mm512_mask_blend_ps(active, v_one, denom); - - // # 16 DIVs - __m512 smc = _mm512_div_ps(numer, denom_safe); - - // # 32 MULTs - __m512 sm_r_ab = _mm512_mul_ps(smc, r_ab2_n); - __m512 sm_r_ab2 = _mm512_mul_ps(smc, r_ab_n); - - // # 64 MULTs, 32 ADDs - __m512 f_x = _mm512_fmadd_ps(r_ab2_x, sm_r_ab2, _mm512_mul_ps(r_ab_x, sm_r_ab)); - __m512 f_y = _mm512_fmadd_ps(r_ab2_y, sm_r_ab2, _mm512_mul_ps(r_ab_y, sm_r_ab)); - - // # 32 MULTs, 16 ADDs - __m512 f_norm_sq = _mm512_fmadd_ps(f_x, f_x, _mm512_mul_ps(f_y, f_y)); - - // # 16 MULTs - __m512 rhs = _mm512_mul_ps(f_norm_sq, v_cos_phi_sq); - - // # 32 MULTs, 16 ADDs - __m512 e_dot_f = _mm512_fmadd_ps(eix, f_x, _mm512_mul_ps(eiy, f_y)); - - // # 16 MULTs - __m512 e_dot_f_sq = _mm512_mul_ps(e_dot_f, e_dot_f); - - __mmask16 c1 = _mm512_cmp_ps_mask(e_dot_f, v_zero, _CMP_LT_OQ); - __mmask16 c2 = _mm512_cmp_ps_mask(e_dot_f_sq, rhs, _CMP_GT_OQ); - __mmask16 cond = c1 & c2; - - __m512 w_val = _mm512_mask_blend_ps(cond, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe = _mm512_maskz_mov_ps(active, f_x); - __m512 f_y_safe = _mm512_maskz_mov_ps(active, f_y); - - // # 32 MULTs, 32 ADDs - acc_x = _mm512_fmadd_ps(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_ps(f_y_safe, w_val, acc_y); - } - - // # 32 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(acc_x); - f_alpha_dt_y += _mm512_reduce_add_ps(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - - // # 2 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - - // # 2 MULTs - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p; i++) { - // # 9 MULTs, 3 ADDs - float w_norm_inv = fast_inv_sqrt(w_x[i] * w_x[i] + w_y[i] * w_y[i]); - - // # 1 MULT - float correction_factor = min(1.0f, v_max[i] * w_norm_inv); - - // # 2 MULTs - curr_vel_x[i] = w_x[i] * correction_factor; - curr_vel_y[i] = w_y[i] * correction_factor; - - // # 2 MULTs, 2 ADDs - pos_x[i] = pos_x[i] + curr_vel_x[i] * dt; - pos_y[i] = pos_y[i] + curr_vel_y[i] * dt; - - if (color[i] == 0 && pos_x[i] > (BOARD_LENGTH_MINUS_ONE_POINT_FIVE)) { - pos_x[i] = 1.0f; - destination_y[i] = pos_y[i]; - w_x[i] = desired_v0[i]; - w_y[i] = 0.0f; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - if (color[i] == 1 && pos_x[i] < 1.5f) { - pos_x[i] = BOARD_LENGTH_MINUS_ONE; - destination_y[i] = pos_y[i]; - w_x[i] = -desired_v0[i]; - w_y[i] = 0.0f; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - - pos_y[i] = clamp(pos_y[i], WALL_EPS, BOARD_WIDTH_MINUS_WALL_EPS); - - // # 2 ADDs - float ex = destination_x[i] - pos_x[i]; - float ey = destination_y[i] - pos_y[i]; - - // # 9 MULTs, 3 ADDs - float e_norm_inv = fast_inv_sqrt(ex * ex + ey * ey); - - // # 2 MULTs - e_x[i] = ex * e_norm_inv; - e_y[i] = ey * e_norm_inv; - - // # 2 MULTs, 1 ADD - double velocity_norm_sq = curr_vel_x[i] * curr_vel_x[i] + curr_vel_y[i] * curr_vel_y[i]; - - // # 1 MULT - double sb_sq_i = velocity_norm_sq * delta_t_sq; - - // # 1 SQRT - double velocity_norm_mul_delta_t = sqrt(sb_sq_i); - - sb_sq[i] = sb_sq_i; - - // # 2 MULTs - sb_e_x[i] = e_x[i] * velocity_norm_mul_delta_t; - sb_e_y[i] = e_y[i] * velocity_norm_mul_delta_t; - -#if !BENCHMARK - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } -#endif - } - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp deleted file mode 100644 index 720810a..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_expfix.cpp +++ /dev/null @@ -1,577 +0,0 @@ -// # Changes: Added more correction rounds to _avx512_exp_ps to do 30 flops per scalar -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_moreavx.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 15) & ~15; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 15) & ~15; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 36 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p_pad * 7 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p_pad * 15 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles + - // # n_p_pad * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x = _mm512_setzero_ps(); - __m512 acc_y = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 16) { - - // # 16 ADDs - __m512 j_idx = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - - __mmask16 m_neq_i = _mm512_cmp_ps_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask16 m_in_range = _mm512_cmp_ps_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask16 active = m_neq_i & m_in_range; - - __m512 pjx = _mm512_loadu_ps(&pos_x[j]); - __m512 pjy = _mm512_loadu_ps(&pos_y[j]); - __m512 sbe_jx = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jy = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sb_jsq = _mm512_loadu_ps(&sb_sq[j]); - - // # 32 ADDs - __m512 r_ab_x = _mm512_sub_ps(pix, pjx); - __m512 r_ab_y = _mm512_sub_ps(piy, pjy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab_n2 = _mm512_fmadd_ps(r_ab_x, r_ab_x, _mm512_mul_ps(r_ab_y, r_ab_y)); - - // # 16 SQRTs - __m512 r_ab_n = _mm512_sqrt_ps(r_ab_n2); - - r_ab_n = _mm512_max_ps(r_ab_n, v_eps); - - // # 32 ADDs - __m512 r_ab2_x = _mm512_sub_ps(r_ab_x, sbe_jx); - __m512 r_ab2_y = _mm512_sub_ps(r_ab_y, sbe_jy); - - // # 32 MULTs, 16 ADDs - __m512 r_ab2_n2 = _mm512_fmadd_ps(r_ab2_x, r_ab2_x, _mm512_mul_ps(r_ab2_y, r_ab2_y)); - - // # 16 SQRTs - __m512 r_ab2_n = _mm512_sqrt_ps(r_ab2_n2); - - r_ab2_n = _mm512_max_ps(r_ab2_n, v_eps); - - // # 16 ADDs - __m512 r_sum = _mm512_add_ps(r_ab_n, r_ab2_n); - - // # 16 MULTs, 16 ADDs - __m512 two_b_sq = _mm512_fmsub_ps(r_sum, r_sum, sb_jsq); - - two_b_sq = _mm512_max_ps(two_b_sq, v_eps_sq); - - // # 16 SQRTs - __m512 two_b = _mm512_sqrt_ps(two_b_sq); - - // # 16 MULTs - __m512 e_arg = _mm512_mul_ps(two_b, v_neg_2s_inv); - - e_arg = _mm512_max_ps(e_arg, v_exp_min); - - // # 256 MULTs, 224 ADDs - __m512 e_val = _avx512_exp_ps(e_arg); - - // # 64 MULTs - __m512 numer = _mm512_mul_ps(_mm512_mul_ps(r_sum, v_neg_v0_div_2s), e_val); - __m512 denom = _mm512_mul_ps(_mm512_mul_ps(two_b, r_ab_n), r_ab2_n); - __m512 denom_safe = _mm512_mask_blend_ps(active, v_one, denom); - - // # 16 DIVs - __m512 smc = _mm512_div_ps(numer, denom_safe); - - // # 32 MULTs - __m512 sm_r_ab = _mm512_mul_ps(smc, r_ab2_n); - __m512 sm_r_ab2 = _mm512_mul_ps(smc, r_ab_n); - - // # 64 MULTs, 32 ADDs - __m512 f_x = _mm512_fmadd_ps(r_ab2_x, sm_r_ab2, _mm512_mul_ps(r_ab_x, sm_r_ab)); - __m512 f_y = _mm512_fmadd_ps(r_ab2_y, sm_r_ab2, _mm512_mul_ps(r_ab_y, sm_r_ab)); - - // # 32 MULTs, 16 ADDs - __m512 f_norm_sq = _mm512_fmadd_ps(f_x, f_x, _mm512_mul_ps(f_y, f_y)); - - // # 16 MULTs - __m512 rhs = _mm512_mul_ps(f_norm_sq, v_cos_phi_sq); - - // # 32 MULTs, 16 ADDs - __m512 e_dot_f = _mm512_fmadd_ps(eix, f_x, _mm512_mul_ps(eiy, f_y)); - - // # 16 MULTs - __m512 e_dot_f_sq = _mm512_mul_ps(e_dot_f, e_dot_f); - - __mmask16 c1 = _mm512_cmp_ps_mask(e_dot_f, v_zero, _CMP_LT_OQ); - __mmask16 c2 = _mm512_cmp_ps_mask(e_dot_f_sq, rhs, _CMP_GT_OQ); - __mmask16 cond = c1 & c2; - - __m512 w_val = _mm512_mask_blend_ps(cond, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe = _mm512_maskz_mov_ps(active, f_x); - __m512 f_y_safe = _mm512_maskz_mov_ps(active, f_y); - - // # 32 MULTs, 32 ADDs - acc_x = _mm512_fmadd_ps(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_ps(f_y_safe, w_val, acc_y); - } - - // # 32 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(acc_x); - f_alpha_dt_y += _mm512_reduce_add_ps(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 4 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTS - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 16) { - __m512 w_x_i_vec = _mm512_loadu_ps(&w_x[i]); - __m512 w_y_i_vec = _mm512_loadu_ps(&w_y[i]); - __m512 v_max_i_vec = _mm512_loadu_ps(&v_max[i]); - __m512 pos_x_i_vec = _mm512_loadu_ps(&pos_x[i]); - __m512 pos_y_i_vec = _mm512_loadu_ps(&pos_y[i]); - __m512 destination_y_i_vec = _mm512_loadu_ps(&destination_y[i]); - __m512 destination_x_i_vec = _mm512_loadu_ps(&destination_x[i]); - __m512 desired_v0_i_vec = _mm512_loadu_ps(&desired_v0[i]); - - __m512i color_i_vec = _mm512_loadu_si512((__m512i *)&color[i]); - - // # 32 MULTs, 16 ADDs - __m512 w_norm_sq = _mm512_fmadd_ps(w_x_i_vec, w_x_i_vec, _mm512_mul_ps(w_y_i_vec, w_y_i_vec)); - - // # 16 SQRTs - __m512 w_norm = _mm512_sqrt_ps(w_norm_sq); - __m512 w_norm_safe = _mm512_max_ps(w_norm, _mm512_set1_ps(EPS)); - - // # 16 DIVs - __m512 correction_factor = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_div_ps(v_max_i_vec, w_norm_safe)); - - // # 32 MULTs - __m512 curr_vel_x_i_vec = _mm512_mul_ps(w_x_i_vec, correction_factor); - __m512 curr_vel_y_i_vec = _mm512_mul_ps(w_y_i_vec, correction_factor); - - __m512 dt_vec = _mm512_set1_ps(dt); - - // # 32 MULTs, 32 ADDs - pos_x_i_vec = _mm512_fmadd_ps(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_ps(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask16 cond_1_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_setzero_si512()); - __mmask16 cond_1_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask16 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_1, pos_x_i_vec, _mm512_set1_ps(1.0f)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_ps(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_ps(cond_1, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask16 cond_2_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_set1_epi32(1)); - __mmask16 cond_2_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - __mmask16 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_2, pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512 neg_desired_v0 = _mm512_xor_ps(desired_v0_i_vec, _mm512_set1_ps(-0.0f)); - w_x_i_vec = _mm512_mask_blend_ps(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_ps(cond_2, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_ps(pos_y_i_vec, _mm512_set1_ps(WALL_EPS)); - pos_y_i_vec = _mm512_min_ps(pos_y_i_vec, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 32 ADDs - __m512 ex_vec = _mm512_sub_ps(destination_x_i_vec, pos_x_i_vec); - __m512 ey_vec = _mm512_sub_ps(destination_y_i_vec, pos_y_i_vec); - - // # 32 MULTs, 16 ADDs - __m512 e_norm_sq = _mm512_fmadd_ps(ex_vec, ex_vec, _mm512_mul_ps(ey_vec, ey_vec)); - - // # 16 SQRTs - __m512 e_norm = _mm512_sqrt_ps(e_norm_sq); - - // # 16 DIVs - __m512 e_norm_inv = _mm512_div_ps(_mm512_set1_ps(1.0f), e_norm); - - // # 32 MULTs - __m512 e_x_i_vec = _mm512_mul_ps(ex_vec, e_norm_inv); - __m512 e_y_i_vec = _mm512_mul_ps(ey_vec, e_norm_inv); - - // # 32 MULTs, 16 ADDs - __m512 vel_norm_sq = _mm512_fmadd_ps(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_ps(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 16 MULTs - __m512 sb_sq_i_vec = _mm512_mul_ps(vel_norm_sq, _mm512_set1_ps(delta_t_sq)); - - // # 16 SQRTs - __m512 vel_norm_dt = _mm512_sqrt_ps(sb_sq_i_vec); - - _mm512_storeu_ps(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_ps(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_ps(&w_x[i], w_x_i_vec); - _mm512_storeu_ps(&w_y[i], w_y_i_vec); - _mm512_storeu_ps(&pos_x[i], pos_x_i_vec); - _mm512_storeu_ps(&pos_y[i], pos_y_i_vec); - _mm512_storeu_ps(&e_x[i], e_x_i_vec); - _mm512_storeu_ps(&e_y[i], e_y_i_vec); - _mm512_storeu_ps(&destination_y[i], destination_y_i_vec); - _mm512_storeu_ps(&sb_sq[i], sb_sq_i_vec); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_x[i], _mm512_mul_ps(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_ps(&sb_e_y[i], _mm512_mul_ps(e_y_i_vec, vel_norm_dt)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp deleted file mode 100644 index 85eac51..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp +++ /dev/null @@ -1,638 +0,0 @@ -// # Changes: Added ILP with k = 2 to j-loop, removed EPS checks where possible -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_moreavx.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 31) & ~31; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 31) & ~31; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 68 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p_pad * 7 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p_pad * 15 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 3 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles + - // # n_p_pad * 2 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x_0 = _mm512_setzero_ps(); - __m512 acc_y_0 = _mm512_setzero_ps(); - __m512 acc_x_1 = _mm512_setzero_ps(); - __m512 acc_y_1 = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 32) { - - // # 32 ADDs - __m512 j_idx_0 = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - __m512 j_idx_1 = _mm512_add_ps(_mm512_set1_ps((float)j + 16), lane_off); - - __mmask16 m_neq_i_0 = _mm512_cmp_ps_mask(j_idx_0, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_1 = _mm512_cmp_ps_mask(j_idx_1, v_i, _CMP_NEQ_OQ); - - __mmask16 m_in_range_0 = _mm512_cmp_ps_mask(j_idx_0, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_1 = _mm512_cmp_ps_mask(j_idx_1, v_np, _CMP_LT_OQ); - - __mmask16 active_0 = m_neq_i_0 & m_in_range_0; - __mmask16 active_1 = m_neq_i_1 & m_in_range_1; - - __m512 pjx_0 = _mm512_loadu_ps(&pos_x[j]); - __m512 pjx_1 = _mm512_loadu_ps(&pos_x[j + 16]); - - __m512 pjy_0 = _mm512_loadu_ps(&pos_y[j]); - __m512 pjy_1 = _mm512_loadu_ps(&pos_y[j + 16]); - - __m512 sbe_jx_0 = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jx_1 = _mm512_loadu_ps(&sb_e_x[j + 16]); - - __m512 sbe_jy_0 = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sbe_jy_1 = _mm512_loadu_ps(&sb_e_y[j + 16]); - - __m512 sb_jsq_0 = _mm512_loadu_ps(&sb_sq[j]); - __m512 sb_jsq_1 = _mm512_loadu_ps(&sb_sq[j + 16]); - - // # 32 ADDs - __m512 r_ab_x_0 = _mm512_sub_ps(pix, pjx_0); - __m512 r_ab_x_1 = _mm512_sub_ps(pix, pjx_1); - - // # 32 ADDs - __m512 r_ab_y_0 = _mm512_sub_ps(piy, pjy_0); - __m512 r_ab_y_1 = _mm512_sub_ps(piy, pjy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab_n2_0 = _mm512_fmadd_ps(r_ab_x_0, r_ab_x_0, _mm512_mul_ps(r_ab_y_0, r_ab_y_0)); - __m512 r_ab_n2_1 = _mm512_fmadd_ps(r_ab_x_1, r_ab_x_1, _mm512_mul_ps(r_ab_y_1, r_ab_y_1)); - - // # 32 SQRTs - __m512 r_ab_n_0 = _mm512_sqrt_ps(r_ab_n2_0); - __m512 r_ab_n_1 = _mm512_sqrt_ps(r_ab_n2_1); - - // # 32 ADDs - __m512 r_ab2_x_0 = _mm512_sub_ps(r_ab_x_0, sbe_jx_0); - __m512 r_ab2_x_1 = _mm512_sub_ps(r_ab_x_1, sbe_jx_1); - - // # 32 ADDs - __m512 r_ab2_y_0 = _mm512_sub_ps(r_ab_y_0, sbe_jy_0); - __m512 r_ab2_y_1 = _mm512_sub_ps(r_ab_y_1, sbe_jy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab2_n2_0 = _mm512_fmadd_ps(r_ab2_x_0, r_ab2_x_0, _mm512_mul_ps(r_ab2_y_0, r_ab2_y_0)); - __m512 r_ab2_n2_1 = _mm512_fmadd_ps(r_ab2_x_1, r_ab2_x_1, _mm512_mul_ps(r_ab2_y_1, r_ab2_y_1)); - - // # 32 SQRTs - __m512 r_ab2_n_0 = _mm512_sqrt_ps(r_ab2_n2_0); - __m512 r_ab2_n_1 = _mm512_sqrt_ps(r_ab2_n2_1); - - // # 32 ADDs - __m512 r_sum_0 = _mm512_add_ps(r_ab_n_0, r_ab2_n_0); - __m512 r_sum_1 = _mm512_add_ps(r_ab_n_1, r_ab2_n_1); - - // # 32 MULTs, 32 ADDs - __m512 two_b_sq_0 = _mm512_fmsub_ps(r_sum_0, r_sum_0, sb_jsq_0); - __m512 two_b_sq_1 = _mm512_fmsub_ps(r_sum_1, r_sum_1, sb_jsq_1); - - // # 32 SQRTs - __m512 two_b_0 = _mm512_sqrt_ps(two_b_sq_0); - __m512 two_b_1 = _mm512_sqrt_ps(two_b_sq_1); - - // # 32 MULTs - __m512 e_arg_0 = _mm512_mul_ps(two_b_0, v_neg_2s_inv); - __m512 e_arg_1 = _mm512_mul_ps(two_b_1, v_neg_2s_inv); - - e_arg_0 = _mm512_max_ps(e_arg_0, v_exp_min); - e_arg_1 = _mm512_max_ps(e_arg_1, v_exp_min); - - // # 512 MULTs, 448 ADDs - __m512 e_val_0 = _avx512_exp_ps(e_arg_0); - __m512 e_val_1 = _avx512_exp_ps(e_arg_1); - - // # 64 MULTs - __m512 numer_0 = _mm512_mul_ps(_mm512_mul_ps(r_sum_0, v_neg_v0_div_2s), e_val_0); - __m512 numer_1 = _mm512_mul_ps(_mm512_mul_ps(r_sum_1, v_neg_v0_div_2s), e_val_1); - - // # 64 MULTs - __m512 denom_0 = _mm512_mul_ps(_mm512_mul_ps(two_b_0, r_ab_n_0), r_ab2_n_0); - __m512 denom_1 = _mm512_mul_ps(_mm512_mul_ps(two_b_1, r_ab_n_1), r_ab2_n_1); - - __m512 denom_safe_0 = _mm512_mask_blend_ps(active_0, v_one, denom_0); - __m512 denom_safe_1 = _mm512_mask_blend_ps(active_1, v_one, denom_1); - - // # 32 DIVs - __m512 smc_0 = _mm512_div_ps(numer_0, denom_safe_0); - __m512 smc_1 = _mm512_div_ps(numer_1, denom_safe_1); - - // # 32 MULTs - __m512 sm_r_ab_0 = _mm512_mul_ps(smc_0, r_ab2_n_0); - __m512 sm_r_ab_1 = _mm512_mul_ps(smc_1, r_ab2_n_1); - - // # 32 MULTs - __m512 sm_r_ab2_0 = _mm512_mul_ps(smc_0, r_ab_n_0); - __m512 sm_r_ab2_1 = _mm512_mul_ps(smc_1, r_ab_n_1); - - // # 64 MULTs, 32 ADDs - __m512 f_x_0 = _mm512_fmadd_ps(r_ab2_x_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_x_0, sm_r_ab_0)); - __m512 f_x_1 = _mm512_fmadd_ps(r_ab2_x_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_x_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_y_0 = _mm512_fmadd_ps(r_ab2_y_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_y_0, sm_r_ab_0)); - __m512 f_y_1 = _mm512_fmadd_ps(r_ab2_y_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_y_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_norm_sq_0 = _mm512_fmadd_ps(f_x_0, f_x_0, _mm512_mul_ps(f_y_0, f_y_0)); - __m512 f_norm_sq_1 = _mm512_fmadd_ps(f_x_1, f_x_1, _mm512_mul_ps(f_y_1, f_y_1)); - - // # 32 MULTs - __m512 rhs_0 = _mm512_mul_ps(f_norm_sq_0, v_cos_phi_sq); - __m512 rhs_1 = _mm512_mul_ps(f_norm_sq_1, v_cos_phi_sq); - - // # 64 MULTs, 32 ADDs - __m512 e_dot_f_0 = _mm512_fmadd_ps(eix, f_x_0, _mm512_mul_ps(eiy, f_y_0)); - __m512 e_dot_f_1 = _mm512_fmadd_ps(eix, f_x_1, _mm512_mul_ps(eiy, f_y_1)); - - // # 32 MULTs - __m512 e_dot_f_sq_0 = _mm512_mul_ps(e_dot_f_0, e_dot_f_0); - __m512 e_dot_f_sq_1 = _mm512_mul_ps(e_dot_f_1, e_dot_f_1); - - __mmask16 c1_0 = _mm512_cmp_ps_mask(e_dot_f_0, v_zero, _CMP_LT_OQ); - __mmask16 c1_1 = _mm512_cmp_ps_mask(e_dot_f_1, v_zero, _CMP_LT_OQ); - - __mmask16 c2_0 = _mm512_cmp_ps_mask(e_dot_f_sq_0, rhs_0, _CMP_GT_OQ); - __mmask16 c2_1 = _mm512_cmp_ps_mask(e_dot_f_sq_1, rhs_1, _CMP_GT_OQ); - - __mmask16 cond_0 = c1_0 & c2_0; - __mmask16 cond_1 = c1_1 & c2_1; - - __m512 w_val_0 = _mm512_mask_blend_ps(cond_0, v_dt_neg, v_c_neg_dt); - __m512 w_val_1 = _mm512_mask_blend_ps(cond_1, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe_0 = _mm512_maskz_mov_ps(active_0, f_x_0); - __m512 f_x_safe_1 = _mm512_maskz_mov_ps(active_1, f_x_1); - - __m512 f_y_safe_0 = _mm512_maskz_mov_ps(active_0, f_y_0); - __m512 f_y_safe_1 = _mm512_maskz_mov_ps(active_1, f_y_1); - - // # 32 MULTs, 32 ADDs - acc_x_0 = _mm512_fmadd_ps(f_x_safe_0, w_val_0, acc_x_0); - acc_x_1 = _mm512_fmadd_ps(f_x_safe_1, w_val_1, acc_x_1); - - // # 32 MULTs, 32 ADDs - acc_y_0 = _mm512_fmadd_ps(f_y_safe_0, w_val_0, acc_y_0); - acc_y_1 = _mm512_fmadd_ps(f_y_safe_1, w_val_1, acc_y_1); - } - - // # 64 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(_mm512_add_ps(acc_x_0, acc_x_1)); - f_alpha_dt_y += _mm512_reduce_add_ps(_mm512_add_ps(acc_y_0, acc_y_1)); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 1 EXP, 4 MULTs, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 16) { - - __m512 w_x_i_vec = _mm512_loadu_ps(&w_x[i]); - __m512 w_y_i_vec = _mm512_loadu_ps(&w_y[i]); - __m512 v_max_i_vec = _mm512_loadu_ps(&v_max[i]); - __m512 pos_x_i_vec = _mm512_loadu_ps(&pos_x[i]); - __m512 pos_y_i_vec = _mm512_loadu_ps(&pos_y[i]); - __m512 destination_y_i_vec = _mm512_loadu_ps(&destination_y[i]); - __m512 destination_x_i_vec = _mm512_loadu_ps(&destination_x[i]); - __m512 desired_v0_i_vec = _mm512_loadu_ps(&desired_v0[i]); - - __m512i color_i_vec = _mm512_loadu_si512((__m512i*)&color[i]); - - // # 32 MULTs, 16 ADDs - __m512 w_norm_sq = _mm512_fmadd_ps(w_x_i_vec, w_x_i_vec, _mm512_mul_ps(w_y_i_vec, w_y_i_vec)); - - // # 16 SQRTs - __m512 w_norm = _mm512_sqrt_ps(w_norm_sq); - - // # 16 DIVs - __m512 correction_factor = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_div_ps(v_max_i_vec, w_norm)); - - // # 32 MULTs - __m512 curr_vel_x_i_vec = _mm512_mul_ps(w_x_i_vec, correction_factor); - __m512 curr_vel_y_i_vec = _mm512_mul_ps(w_y_i_vec, correction_factor); - - __m512 dt_vec = _mm512_set1_ps(dt); - - // # 32 MULTs, 32 ADDs - pos_x_i_vec = _mm512_fmadd_ps(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_ps(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask16 cond_1_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_setzero_si512()); - __mmask16 cond_1_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask16 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_1, pos_x_i_vec, _mm512_set1_ps(1.0f)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_ps(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_ps(cond_1, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask16 cond_2_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_set1_epi32(1)); - __mmask16 cond_2_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - __mmask16 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_2, pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512 neg_desired_v0 = _mm512_xor_ps(desired_v0_i_vec, _mm512_set1_ps(-0.0f)); - w_x_i_vec = _mm512_mask_blend_ps(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_ps(cond_2, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_ps(pos_y_i_vec, _mm512_set1_ps(WALL_EPS)); - pos_y_i_vec = _mm512_min_ps(pos_y_i_vec, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 32 ADDs - __m512 ex_vec = _mm512_sub_ps(destination_x_i_vec, pos_x_i_vec); - __m512 ey_vec = _mm512_sub_ps(destination_y_i_vec, pos_y_i_vec); - - // # 32 MULTs, 16 ADDs - __m512 e_norm_sq = _mm512_fmadd_ps(ex_vec, ex_vec, _mm512_mul_ps(ey_vec, ey_vec)); - - // # 16 SQRTs - __m512 e_norm = _mm512_sqrt_ps(e_norm_sq); - - // # 16 DIVs - __m512 e_norm_inv = _mm512_div_ps(_mm512_set1_ps(1.0f), e_norm); - - // # 32 MULTs - __m512 e_x_i_vec = _mm512_mul_ps(ex_vec, e_norm_inv); - __m512 e_y_i_vec = _mm512_mul_ps(ey_vec, e_norm_inv); - - // # 32 MULTs, 16 ADDs - __m512 vel_norm_sq = _mm512_fmadd_ps(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_ps(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 16 MULTs - __m512 sb_sq_i_vec = _mm512_mul_ps(vel_norm_sq, _mm512_set1_ps(delta_t_sq)); - - // # 16 SQRTs - __m512 vel_norm_dt = _mm512_sqrt_ps(sb_sq_i_vec); - - _mm512_storeu_ps(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_ps(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_ps(&w_x[i], w_x_i_vec); - _mm512_storeu_ps(&w_y[i], w_y_i_vec); - _mm512_storeu_ps(&pos_x[i], pos_x_i_vec); - _mm512_storeu_ps(&pos_y[i], pos_y_i_vec); - _mm512_storeu_ps(&e_x[i], e_x_i_vec); - _mm512_storeu_ps(&e_y[i], e_y_i_vec); - _mm512_storeu_ps(&destination_y[i], destination_y_i_vec); - _mm512_storeu_ps(&sb_sq[i], sb_sq_i_vec); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_x[i], _mm512_mul_ps(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_ps(&sb_e_y[i], _mm512_mul_ps(e_y_i_vec, vel_norm_dt)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp deleted file mode 100644 index 25a468c..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_moreilp_expfix.cpp +++ /dev/null @@ -1,735 +0,0 @@ -// # Changes: Added ILP with k = 2 to second pass -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 31) & ~31; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 31) & ~31; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 68 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p_pad * 7 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p_pad * 15 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles + - // # n_p_pad * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x_0 = _mm512_setzero_ps(); - __m512 acc_y_0 = _mm512_setzero_ps(); - __m512 acc_x_1 = _mm512_setzero_ps(); - __m512 acc_y_1 = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 32) { - - // # 32 ADDs - __m512 j_idx_0 = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - __m512 j_idx_1 = _mm512_add_ps(_mm512_set1_ps((float)j + 16), lane_off); - - __mmask16 m_neq_i_0 = _mm512_cmp_ps_mask(j_idx_0, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_1 = _mm512_cmp_ps_mask(j_idx_1, v_i, _CMP_NEQ_OQ); - - __mmask16 m_in_range_0 = _mm512_cmp_ps_mask(j_idx_0, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_1 = _mm512_cmp_ps_mask(j_idx_1, v_np, _CMP_LT_OQ); - - __mmask16 active_0 = m_neq_i_0 & m_in_range_0; - __mmask16 active_1 = m_neq_i_1 & m_in_range_1; - - __m512 pjx_0 = _mm512_loadu_ps(&pos_x[j]); - __m512 pjx_1 = _mm512_loadu_ps(&pos_x[j + 16]); - - __m512 pjy_0 = _mm512_loadu_ps(&pos_y[j]); - __m512 pjy_1 = _mm512_loadu_ps(&pos_y[j + 16]); - - __m512 sbe_jx_0 = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jx_1 = _mm512_loadu_ps(&sb_e_x[j + 16]); - - __m512 sbe_jy_0 = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sbe_jy_1 = _mm512_loadu_ps(&sb_e_y[j + 16]); - - __m512 sb_jsq_0 = _mm512_loadu_ps(&sb_sq[j]); - __m512 sb_jsq_1 = _mm512_loadu_ps(&sb_sq[j + 16]); - - // # 32 ADDs - __m512 r_ab_x_0 = _mm512_sub_ps(pix, pjx_0); - __m512 r_ab_x_1 = _mm512_sub_ps(pix, pjx_1); - - // # 32 ADDs - __m512 r_ab_y_0 = _mm512_sub_ps(piy, pjy_0); - __m512 r_ab_y_1 = _mm512_sub_ps(piy, pjy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab_n2_0 = _mm512_fmadd_ps(r_ab_x_0, r_ab_x_0, _mm512_mul_ps(r_ab_y_0, r_ab_y_0)); - __m512 r_ab_n2_1 = _mm512_fmadd_ps(r_ab_x_1, r_ab_x_1, _mm512_mul_ps(r_ab_y_1, r_ab_y_1)); - - // # 32 SQRTs - __m512 r_ab_n_0 = _mm512_sqrt_ps(r_ab_n2_0); - __m512 r_ab_n_1 = _mm512_sqrt_ps(r_ab_n2_1); - - // # 32 ADDs - __m512 r_ab2_x_0 = _mm512_sub_ps(r_ab_x_0, sbe_jx_0); - __m512 r_ab2_x_1 = _mm512_sub_ps(r_ab_x_1, sbe_jx_1); - - // # 32 ADDs - __m512 r_ab2_y_0 = _mm512_sub_ps(r_ab_y_0, sbe_jy_0); - __m512 r_ab2_y_1 = _mm512_sub_ps(r_ab_y_1, sbe_jy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab2_n2_0 = _mm512_fmadd_ps(r_ab2_x_0, r_ab2_x_0, _mm512_mul_ps(r_ab2_y_0, r_ab2_y_0)); - __m512 r_ab2_n2_1 = _mm512_fmadd_ps(r_ab2_x_1, r_ab2_x_1, _mm512_mul_ps(r_ab2_y_1, r_ab2_y_1)); - - // # 32 SQRTs - __m512 r_ab2_n_0 = _mm512_sqrt_ps(r_ab2_n2_0); - __m512 r_ab2_n_1 = _mm512_sqrt_ps(r_ab2_n2_1); - - // # 32 ADDs - __m512 r_sum_0 = _mm512_add_ps(r_ab_n_0, r_ab2_n_0); - __m512 r_sum_1 = _mm512_add_ps(r_ab_n_1, r_ab2_n_1); - - // # 32 MULTs, 32 ADDs - __m512 two_b_sq_0 = _mm512_fmsub_ps(r_sum_0, r_sum_0, sb_jsq_0); - __m512 two_b_sq_1 = _mm512_fmsub_ps(r_sum_1, r_sum_1, sb_jsq_1); - - // # 32 SQRTs - __m512 two_b_0 = _mm512_sqrt_ps(two_b_sq_0); - __m512 two_b_1 = _mm512_sqrt_ps(two_b_sq_1); - - // # 32 MULTs - __m512 e_arg_0 = _mm512_mul_ps(two_b_0, v_neg_2s_inv); - __m512 e_arg_1 = _mm512_mul_ps(two_b_1, v_neg_2s_inv); - - e_arg_0 = _mm512_max_ps(e_arg_0, v_exp_min); - e_arg_1 = _mm512_max_ps(e_arg_1, v_exp_min); - - // # 512 MULTs, 448 ADDs - __m512 e_val_0 = _avx512_exp_ps(e_arg_0); - __m512 e_val_1 = _avx512_exp_ps(e_arg_1); - - // # 64 MULTs - __m512 numer_0 = _mm512_mul_ps(_mm512_mul_ps(r_sum_0, v_neg_v0_div_2s), e_val_0); - __m512 numer_1 = _mm512_mul_ps(_mm512_mul_ps(r_sum_1, v_neg_v0_div_2s), e_val_1); - - // # 64 MULTs - __m512 denom_0 = _mm512_mul_ps(_mm512_mul_ps(two_b_0, r_ab_n_0), r_ab2_n_0); - __m512 denom_1 = _mm512_mul_ps(_mm512_mul_ps(two_b_1, r_ab_n_1), r_ab2_n_1); - - __m512 denom_safe_0 = _mm512_mask_blend_ps(active_0, v_one, denom_0); - __m512 denom_safe_1 = _mm512_mask_blend_ps(active_1, v_one, denom_1); - - // # 32 DIVs - __m512 smc_0 = _mm512_div_ps(numer_0, denom_safe_0); - __m512 smc_1 = _mm512_div_ps(numer_1, denom_safe_1); - - // # 32 MULTs - __m512 sm_r_ab_0 = _mm512_mul_ps(smc_0, r_ab2_n_0); - __m512 sm_r_ab_1 = _mm512_mul_ps(smc_1, r_ab2_n_1); - - // # 32 MULTs - __m512 sm_r_ab2_0 = _mm512_mul_ps(smc_0, r_ab_n_0); - __m512 sm_r_ab2_1 = _mm512_mul_ps(smc_1, r_ab_n_1); - - // # 64 MULTs, 32 ADDs - __m512 f_x_0 = _mm512_fmadd_ps(r_ab2_x_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_x_0, sm_r_ab_0)); - __m512 f_x_1 = _mm512_fmadd_ps(r_ab2_x_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_x_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_y_0 = _mm512_fmadd_ps(r_ab2_y_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_y_0, sm_r_ab_0)); - __m512 f_y_1 = _mm512_fmadd_ps(r_ab2_y_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_y_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_norm_sq_0 = _mm512_fmadd_ps(f_x_0, f_x_0, _mm512_mul_ps(f_y_0, f_y_0)); - __m512 f_norm_sq_1 = _mm512_fmadd_ps(f_x_1, f_x_1, _mm512_mul_ps(f_y_1, f_y_1)); - - // # 32 MULTs - __m512 rhs_0 = _mm512_mul_ps(f_norm_sq_0, v_cos_phi_sq); - __m512 rhs_1 = _mm512_mul_ps(f_norm_sq_1, v_cos_phi_sq); - - // # 64 MULTs, 32 ADDs - __m512 e_dot_f_0 = _mm512_fmadd_ps(eix, f_x_0, _mm512_mul_ps(eiy, f_y_0)); - __m512 e_dot_f_1 = _mm512_fmadd_ps(eix, f_x_1, _mm512_mul_ps(eiy, f_y_1)); - - // # 32 MULTs - __m512 e_dot_f_sq_0 = _mm512_mul_ps(e_dot_f_0, e_dot_f_0); - __m512 e_dot_f_sq_1 = _mm512_mul_ps(e_dot_f_1, e_dot_f_1); - - __mmask16 c1_0 = _mm512_cmp_ps_mask(e_dot_f_0, v_zero, _CMP_LT_OQ); - __mmask16 c1_1 = _mm512_cmp_ps_mask(e_dot_f_1, v_zero, _CMP_LT_OQ); - - __mmask16 c2_0 = _mm512_cmp_ps_mask(e_dot_f_sq_0, rhs_0, _CMP_GT_OQ); - __mmask16 c2_1 = _mm512_cmp_ps_mask(e_dot_f_sq_1, rhs_1, _CMP_GT_OQ); - - __mmask16 cond_0 = c1_0 & c2_0; - __mmask16 cond_1 = c1_1 & c2_1; - - __m512 w_val_0 = _mm512_mask_blend_ps(cond_0, v_dt_neg, v_c_neg_dt); - __m512 w_val_1 = _mm512_mask_blend_ps(cond_1, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe_0 = _mm512_maskz_mov_ps(active_0, f_x_0); - __m512 f_x_safe_1 = _mm512_maskz_mov_ps(active_1, f_x_1); - - __m512 f_y_safe_0 = _mm512_maskz_mov_ps(active_0, f_y_0); - __m512 f_y_safe_1 = _mm512_maskz_mov_ps(active_1, f_y_1); - - // # 32 MULTs, 32 ADDs - acc_x_0 = _mm512_fmadd_ps(f_x_safe_0, w_val_0, acc_x_0); - acc_x_1 = _mm512_fmadd_ps(f_x_safe_1, w_val_1, acc_x_1); - - // # 32 MULTs, 32 ADDs - acc_y_0 = _mm512_fmadd_ps(f_y_safe_0, w_val_0, acc_y_0); - acc_y_1 = _mm512_fmadd_ps(f_y_safe_1, w_val_1, acc_y_1); - } - - // # 64 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(_mm512_add_ps(acc_x_0, acc_x_1)); - f_alpha_dt_y += _mm512_reduce_add_ps(_mm512_add_ps(acc_y_0, acc_y_1)); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 4 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTS - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 32) { - - __m512 w_x_i_vec_0 = _mm512_loadu_ps(&w_x[i]); - __m512 w_x_i_vec_1 = _mm512_loadu_ps(&w_x[i + 16]); - - __m512 w_y_i_vec_0 = _mm512_loadu_ps(&w_y[i]); - __m512 w_y_i_vec_1 = _mm512_loadu_ps(&w_y[i + 16]); - - __m512 v_max_i_vec_0 = _mm512_loadu_ps(&v_max[i]); - __m512 v_max_i_vec_1 = _mm512_loadu_ps(&v_max[i + 16]); - - __m512 pos_x_i_vec_0 = _mm512_loadu_ps(&pos_x[i]); - __m512 pos_x_i_vec_1 = _mm512_loadu_ps(&pos_x[i + 16]); - - __m512 pos_y_i_vec_0 = _mm512_loadu_ps(&pos_y[i]); - __m512 pos_y_i_vec_1 = _mm512_loadu_ps(&pos_y[i + 16]); - - __m512 destination_y_i_vec_0 = _mm512_loadu_ps(&destination_y[i]); - __m512 destination_y_i_vec_1 = _mm512_loadu_ps(&destination_y[i + 16]); - - __m512 destination_x_i_vec_0 = _mm512_loadu_ps(&destination_x[i]); - __m512 destination_x_i_vec_1 = _mm512_loadu_ps(&destination_x[i + 16]); - - __m512 desired_v0_i_vec_0 = _mm512_loadu_ps(&desired_v0[i]); - __m512 desired_v0_i_vec_1 = _mm512_loadu_ps(&desired_v0[i + 16]); - - __m512i color_i_vec_0 = _mm512_loadu_si512((__m512i *)&color[i]); - __m512i color_i_vec_1 = _mm512_loadu_si512((__m512i *)&color[i + 16]); - - // # 64 MULTs, 32 ADDs - __m512 w_norm_sq_0 = _mm512_fmadd_ps(w_x_i_vec_0, w_x_i_vec_0, _mm512_mul_ps(w_y_i_vec_0, w_y_i_vec_0)); - __m512 w_norm_sq_1 = _mm512_fmadd_ps(w_x_i_vec_1, w_x_i_vec_1, _mm512_mul_ps(w_y_i_vec_1, w_y_i_vec_1)); - - // # 32 SQRTs - __m512 w_norm_0 = _mm512_sqrt_ps(w_norm_sq_0); - __m512 w_norm_1 = _mm512_sqrt_ps(w_norm_sq_1); - - // # 32 DIVs - __m512 correction_factor_0 = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_div_ps(v_max_i_vec_0, w_norm_0)); - __m512 correction_factor_1 = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_div_ps(v_max_i_vec_1, w_norm_1)); - - // # 32 MULTs - __m512 curr_vel_x_i_vec_0 = _mm512_mul_ps(w_x_i_vec_0, correction_factor_0); - __m512 curr_vel_x_i_vec_1 = _mm512_mul_ps(w_x_i_vec_1, correction_factor_1); - - // # 32 MULTs - __m512 curr_vel_y_i_vec_0 = _mm512_mul_ps(w_y_i_vec_0, correction_factor_0); - __m512 curr_vel_y_i_vec_1 = _mm512_mul_ps(w_y_i_vec_1, correction_factor_1); - - __m512 dt_vec = _mm512_set1_ps(dt); - - // # 32 MULTs, 32 ADDs - pos_x_i_vec_0 = _mm512_fmadd_ps(curr_vel_x_i_vec_0, dt_vec, pos_x_i_vec_0); - pos_x_i_vec_1 = _mm512_fmadd_ps(curr_vel_x_i_vec_1, dt_vec, pos_x_i_vec_1); - - // # 32 MULTs, 32 ADDs - pos_y_i_vec_0 = _mm512_fmadd_ps(curr_vel_y_i_vec_0, dt_vec, pos_y_i_vec_0); - pos_y_i_vec_1 = _mm512_fmadd_ps(curr_vel_y_i_vec_1, dt_vec, pos_y_i_vec_1); - - __mmask16 cond_1_left_0 = _mm512_cmpeq_epi32_mask(color_i_vec_0, _mm512_setzero_si512()); - __mmask16 cond_1_left_1 = _mm512_cmpeq_epi32_mask(color_i_vec_1, _mm512_setzero_si512()); - - __mmask16 cond_1_right_0 = _mm512_cmp_ps_mask(pos_x_i_vec_0, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask16 cond_1_right_1 = _mm512_cmp_ps_mask(pos_x_i_vec_1, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - - __mmask16 cond_1_0 = cond_1_left_0 & cond_1_right_0; - __mmask16 cond_1_1 = cond_1_left_1 & cond_1_right_1; - - pos_x_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, pos_x_i_vec_0, _mm512_set1_ps(1.0f)); - pos_x_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, pos_x_i_vec_1, _mm512_set1_ps(1.0f)); - - destination_y_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, destination_y_i_vec_0, pos_y_i_vec_0); - destination_y_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, destination_y_i_vec_1, pos_y_i_vec_1); - - w_x_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, w_x_i_vec_0, desired_v0_i_vec_0); - w_x_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, w_x_i_vec_1, desired_v0_i_vec_1); - - w_y_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, w_y_i_vec_0, _mm512_setzero_ps()); - w_y_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, w_y_i_vec_1, _mm512_setzero_ps()); - - curr_vel_x_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, curr_vel_x_i_vec_0, w_x_i_vec_0); - curr_vel_x_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, curr_vel_x_i_vec_1, w_x_i_vec_1); - - curr_vel_y_i_vec_0 = _mm512_mask_blend_ps(cond_1_0, curr_vel_y_i_vec_0, w_y_i_vec_0); - curr_vel_y_i_vec_1 = _mm512_mask_blend_ps(cond_1_1, curr_vel_y_i_vec_1, w_y_i_vec_1); - - __mmask16 cond_2_left_0 = _mm512_cmpeq_epi32_mask(color_i_vec_0, _mm512_set1_epi32(1)); - __mmask16 cond_2_left_1 = _mm512_cmpeq_epi32_mask(color_i_vec_1, _mm512_set1_epi32(1)); - - __mmask16 cond_2_right_0 = _mm512_cmp_ps_mask(pos_x_i_vec_0, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - __mmask16 cond_2_right_1 = _mm512_cmp_ps_mask(pos_x_i_vec_1, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - - __mmask16 cond_2_0 = cond_2_left_0 & cond_2_right_0; - __mmask16 cond_2_1 = cond_2_left_1 & cond_2_right_1; - - pos_x_i_vec_0 = _mm512_mask_blend_ps(cond_2_0, pos_x_i_vec_0, _mm512_set1_ps(BOARD_LENGTH - 1.0f)); - pos_x_i_vec_1 = _mm512_mask_blend_ps(cond_2_1, pos_x_i_vec_1, _mm512_set1_ps(BOARD_LENGTH - 1.0f)); - - destination_y_i_vec_0 = _mm512_mask_blend_ps(cond_2_0, destination_y_i_vec_0, pos_y_i_vec_0); - destination_y_i_vec_1 = _mm512_mask_blend_ps(cond_2_1, destination_y_i_vec_1, pos_y_i_vec_1); - - __m512 neg_desired_v0_0 = _mm512_xor_ps(desired_v0_i_vec_0, _mm512_set1_ps(-0.0f)); - __m512 neg_desired_v0_1 = _mm512_xor_ps(desired_v0_i_vec_1, _mm512_set1_ps(-0.0f)); - - w_x_i_vec_0 = _mm512_mask_blend_ps(cond_2_0, w_x_i_vec_0, neg_desired_v0_0); - w_x_i_vec_1 = _mm512_mask_blend_ps(cond_2_1, w_x_i_vec_1, neg_desired_v0_1); - - w_y_i_vec_0 = _mm512_mask_blend_ps(cond_2_0, w_y_i_vec_0, _mm512_setzero_ps()); - w_y_i_vec_1 = _mm512_mask_blend_ps(cond_2_1, w_y_i_vec_1, _mm512_setzero_ps()); - - curr_vel_x_i_vec_0 = _mm512_mask_blend_ps(cond_2_0, curr_vel_x_i_vec_0, w_x_i_vec_0); - curr_vel_y_i_vec_1 = _mm512_mask_blend_ps(cond_2_1, curr_vel_y_i_vec_1, w_y_i_vec_1); - - pos_y_i_vec_0 = _mm512_max_ps(pos_y_i_vec_0, _mm512_set1_ps(WALL_EPS)); - pos_y_i_vec_1 = _mm512_max_ps(pos_y_i_vec_1, _mm512_set1_ps(WALL_EPS)); - - pos_y_i_vec_0 = _mm512_min_ps(pos_y_i_vec_0, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - pos_y_i_vec_1 = _mm512_min_ps(pos_y_i_vec_1, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 32 ADDs - __m512 ex_vec_0 = _mm512_sub_ps(destination_x_i_vec_0, pos_x_i_vec_0); - __m512 ex_vec_1 = _mm512_sub_ps(destination_x_i_vec_1, pos_x_i_vec_1); - - // # 32 ADDs - __m512 ey_vec_0 = _mm512_sub_ps(destination_y_i_vec_0, pos_y_i_vec_0); - __m512 ey_vec_1 = _mm512_sub_ps(destination_y_i_vec_1, pos_y_i_vec_1); - - // # 64 MULTs, 32 ADDs - __m512 e_norm_sq_0 = _mm512_fmadd_ps(ex_vec_0, ex_vec_0, _mm512_mul_ps(ey_vec_0, ey_vec_0)); - __m512 e_norm_sq_1 = _mm512_fmadd_ps(ex_vec_1, ex_vec_1, _mm512_mul_ps(ey_vec_1, ey_vec_1)); - - // # 32 SQRTs - __m512 e_norm_0 = _mm512_sqrt_ps(e_norm_sq_0); - __m512 e_norm_1 = _mm512_sqrt_ps(e_norm_sq_1); - - // # 32 DIVs - __m512 e_norm_inv_0 = _mm512_div_ps(_mm512_set1_ps(1.0f), e_norm_0); - __m512 e_norm_inv_1 = _mm512_div_ps(_mm512_set1_ps(1.0f), e_norm_1); - - // # 32 MULTs - __m512 e_x_i_vec_0 = _mm512_mul_ps(ex_vec_0, e_norm_inv_0); - __m512 e_x_i_vec_1 = _mm512_mul_ps(ex_vec_1, e_norm_inv_1); - - // # 32 MULTs - __m512 e_y_i_vec_0 = _mm512_mul_ps(ey_vec_0, e_norm_inv_0); - __m512 e_y_i_vec_1 = _mm512_mul_ps(ey_vec_1, e_norm_inv_1); - - // # 64 MULTs, 32 ADDs - __m512 vel_norm_sq_0 = _mm512_fmadd_ps(curr_vel_x_i_vec_0, curr_vel_x_i_vec_0, _mm512_mul_ps(curr_vel_y_i_vec_0, curr_vel_y_i_vec_0)); - __m512 vel_norm_sq_1 = _mm512_fmadd_ps(curr_vel_x_i_vec_1, curr_vel_x_i_vec_1, _mm512_mul_ps(curr_vel_y_i_vec_1, curr_vel_y_i_vec_1)); - - // # 32 MULTs - __m512 sb_sq_i_vec_0 = _mm512_mul_ps(vel_norm_sq_0, _mm512_set1_ps(delta_t_sq)); - __m512 sb_sq_i_vec_1 = _mm512_mul_ps(vel_norm_sq_1, _mm512_set1_ps(delta_t_sq)); - - // # 32 SQRTs - __m512 vel_norm_dt_0 = _mm512_sqrt_ps(sb_sq_i_vec_0); - __m512 vel_norm_dt_1 = _mm512_sqrt_ps(sb_sq_i_vec_1); - - _mm512_storeu_ps(&curr_vel_x[i], curr_vel_x_i_vec_0); - _mm512_storeu_ps(&curr_vel_x[i + 16], curr_vel_x_i_vec_1); - - _mm512_storeu_ps(&curr_vel_y[i], curr_vel_y_i_vec_0); - _mm512_storeu_ps(&curr_vel_y[i + 16], curr_vel_y_i_vec_1); - - _mm512_storeu_ps(&w_x[i], w_x_i_vec_0); - _mm512_storeu_ps(&w_x[i + 16], w_x_i_vec_1); - - _mm512_storeu_ps(&w_y[i], w_y_i_vec_0); - _mm512_storeu_ps(&w_y[i + 16], w_y_i_vec_1); - - _mm512_storeu_ps(&pos_x[i], pos_x_i_vec_0); - _mm512_storeu_ps(&pos_x[i + 16], pos_x_i_vec_1); - - _mm512_storeu_ps(&pos_y[i], pos_y_i_vec_0); - _mm512_storeu_ps(&pos_y[i + 16], pos_y_i_vec_1); - - _mm512_storeu_ps(&e_x[i], e_x_i_vec_0); - _mm512_storeu_ps(&e_x[i + 16], e_x_i_vec_1); - - _mm512_storeu_ps(&e_y[i], e_y_i_vec_0); - _mm512_storeu_ps(&e_y[i + 16], e_y_i_vec_1); - - _mm512_storeu_ps(&destination_y[i], destination_y_i_vec_0); - _mm512_storeu_ps(&destination_y[i + 16], destination_y_i_vec_1); - - _mm512_storeu_ps(&sb_sq[i], sb_sq_i_vec_0); - _mm512_storeu_ps(&sb_sq[i + 16], sb_sq_i_vec_1); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_x[i], _mm512_mul_ps(e_x_i_vec_0, vel_norm_dt_0)); - _mm512_storeu_ps(&sb_e_x[i + 16], _mm512_mul_ps(e_x_i_vec_1, vel_norm_dt_1)); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_y[i], _mm512_mul_ps(e_y_i_vec_0, vel_norm_dt_0)); - _mm512_storeu_ps(&sb_e_y[i + 16], _mm512_mul_ps(e_y_i_vec_1, vel_norm_dt_1)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp deleted file mode 100644 index ec69800..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt_expfix.cpp +++ /dev/null @@ -1,634 +0,0 @@ -// # Changes: Used _mm512_rsqrt14_ps() instead of _mm512_sqrt_ps() and _mm512_div_ps() -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 31) & ~31; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 31) & ~31; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 68 + - // # n_p * n_p_pad * 29 - // # n_p * board.n_obstacles * 10 - // # n_p_pad * 9 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 - // # n_p * board.n_obstacles * 13 - // # n_p_pad * 17 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad - // # n_p * board.n_obstacles - // # n_p_pad * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 - // # n_p * board.n_obstacles - // # n_p_pad * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x_0 = _mm512_setzero_ps(); - __m512 acc_y_0 = _mm512_setzero_ps(); - __m512 acc_x_1 = _mm512_setzero_ps(); - __m512 acc_y_1 = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 32) { - - // # 32 ADDs - __m512 j_idx_0 = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - __m512 j_idx_1 = _mm512_add_ps(_mm512_set1_ps((float)j + 16), lane_off); - - __mmask16 m_neq_i_0 = _mm512_cmp_ps_mask(j_idx_0, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_1 = _mm512_cmp_ps_mask(j_idx_1, v_i, _CMP_NEQ_OQ); - - __mmask16 m_in_range_0 = _mm512_cmp_ps_mask(j_idx_0, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_1 = _mm512_cmp_ps_mask(j_idx_1, v_np, _CMP_LT_OQ); - - __mmask16 active_0 = m_neq_i_0 & m_in_range_0; - __mmask16 active_1 = m_neq_i_1 & m_in_range_1; - - __m512 pjx_0 = _mm512_loadu_ps(&pos_x[j]); - __m512 pjx_1 = _mm512_loadu_ps(&pos_x[j + 16]); - - __m512 pjy_0 = _mm512_loadu_ps(&pos_y[j]); - __m512 pjy_1 = _mm512_loadu_ps(&pos_y[j + 16]); - - __m512 sbe_jx_0 = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jx_1 = _mm512_loadu_ps(&sb_e_x[j + 16]); - - __m512 sbe_jy_0 = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sbe_jy_1 = _mm512_loadu_ps(&sb_e_y[j + 16]); - - __m512 sb_jsq_0 = _mm512_loadu_ps(&sb_sq[j]); - __m512 sb_jsq_1 = _mm512_loadu_ps(&sb_sq[j + 16]); - - // # 32 ADDs - __m512 r_ab_x_0 = _mm512_sub_ps(pix, pjx_0); - __m512 r_ab_x_1 = _mm512_sub_ps(pix, pjx_1); - - // # 32 ADDs - __m512 r_ab_y_0 = _mm512_sub_ps(piy, pjy_0); - __m512 r_ab_y_1 = _mm512_sub_ps(piy, pjy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab_n2_0 = _mm512_fmadd_ps(r_ab_x_0, r_ab_x_0, _mm512_mul_ps(r_ab_y_0, r_ab_y_0)); - __m512 r_ab_n2_1 = _mm512_fmadd_ps(r_ab_x_1, r_ab_x_1, _mm512_mul_ps(r_ab_y_1, r_ab_y_1)); - - // # 32 SQRTs - __m512 r_ab_n_0 = _mm512_sqrt_ps(r_ab_n2_0); - __m512 r_ab_n_1 = _mm512_sqrt_ps(r_ab_n2_1); - - // # 32 ADDs - __m512 r_ab2_x_0 = _mm512_sub_ps(r_ab_x_0, sbe_jx_0); - __m512 r_ab2_x_1 = _mm512_sub_ps(r_ab_x_1, sbe_jx_1); - - // # 32 ADDs - __m512 r_ab2_y_0 = _mm512_sub_ps(r_ab_y_0, sbe_jy_0); - __m512 r_ab2_y_1 = _mm512_sub_ps(r_ab_y_1, sbe_jy_1); - - // # 64 MULTs, 32 ADDs - __m512 r_ab2_n2_0 = _mm512_fmadd_ps(r_ab2_x_0, r_ab2_x_0, _mm512_mul_ps(r_ab2_y_0, r_ab2_y_0)); - __m512 r_ab2_n2_1 = _mm512_fmadd_ps(r_ab2_x_1, r_ab2_x_1, _mm512_mul_ps(r_ab2_y_1, r_ab2_y_1)); - - // # 32 SQRTs - __m512 r_ab2_n_0 = _mm512_sqrt_ps(r_ab2_n2_0); - __m512 r_ab2_n_1 = _mm512_sqrt_ps(r_ab2_n2_1); - - // # 32 ADDs - __m512 r_sum_0 = _mm512_add_ps(r_ab_n_0, r_ab2_n_0); - __m512 r_sum_1 = _mm512_add_ps(r_ab_n_1, r_ab2_n_1); - - // # 32 MULTs, 32 ADDs - __m512 two_b_sq_0 = _mm512_fmsub_ps(r_sum_0, r_sum_0, sb_jsq_0); - __m512 two_b_sq_1 = _mm512_fmsub_ps(r_sum_1, r_sum_1, sb_jsq_1); - - // # 32 SQRTs - __m512 two_b_0 = _mm512_sqrt_ps(two_b_sq_0); - __m512 two_b_1 = _mm512_sqrt_ps(two_b_sq_1); - - // # 32 MULTs - __m512 e_arg_0 = _mm512_mul_ps(two_b_0, v_neg_2s_inv); - __m512 e_arg_1 = _mm512_mul_ps(two_b_1, v_neg_2s_inv); - - e_arg_0 = _mm512_max_ps(e_arg_0, v_exp_min); - e_arg_1 = _mm512_max_ps(e_arg_1, v_exp_min); - - // # 512 MULTs, 448 ADDs - __m512 e_val_0 = _avx512_exp_ps(e_arg_0); - __m512 e_val_1 = _avx512_exp_ps(e_arg_1); - - // # 64 MULTs - __m512 numer_0 = _mm512_mul_ps(_mm512_mul_ps(r_sum_0, v_neg_v0_div_2s), e_val_0); - __m512 numer_1 = _mm512_mul_ps(_mm512_mul_ps(r_sum_1, v_neg_v0_div_2s), e_val_1); - - // # 64 MULTs - __m512 denom_0 = _mm512_mul_ps(_mm512_mul_ps(two_b_0, r_ab_n_0), r_ab2_n_0); - __m512 denom_1 = _mm512_mul_ps(_mm512_mul_ps(two_b_1, r_ab_n_1), r_ab2_n_1); - - __m512 denom_safe_0 = _mm512_mask_blend_ps(active_0, v_one, denom_0); - __m512 denom_safe_1 = _mm512_mask_blend_ps(active_1, v_one, denom_1); - - // # 32 DIVs - __m512 smc_0 = _mm512_div_ps(numer_0, denom_safe_0); - __m512 smc_1 = _mm512_div_ps(numer_1, denom_safe_1); - - // # 32 MULTs - __m512 sm_r_ab_0 = _mm512_mul_ps(smc_0, r_ab2_n_0); - __m512 sm_r_ab_1 = _mm512_mul_ps(smc_1, r_ab2_n_1); - - // # 32 MULTs - __m512 sm_r_ab2_0 = _mm512_mul_ps(smc_0, r_ab_n_0); - __m512 sm_r_ab2_1 = _mm512_mul_ps(smc_1, r_ab_n_1); - - // # 64 MULTs, 32 ADDs - __m512 f_x_0 = _mm512_fmadd_ps(r_ab2_x_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_x_0, sm_r_ab_0)); - __m512 f_x_1 = _mm512_fmadd_ps(r_ab2_x_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_x_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_y_0 = _mm512_fmadd_ps(r_ab2_y_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_y_0, sm_r_ab_0)); - __m512 f_y_1 = _mm512_fmadd_ps(r_ab2_y_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_y_1, sm_r_ab_1)); - - // # 64 MULTs, 32 ADDs - __m512 f_norm_sq_0 = _mm512_fmadd_ps(f_x_0, f_x_0, _mm512_mul_ps(f_y_0, f_y_0)); - __m512 f_norm_sq_1 = _mm512_fmadd_ps(f_x_1, f_x_1, _mm512_mul_ps(f_y_1, f_y_1)); - - // # 32 MULTs - __m512 rhs_0 = _mm512_mul_ps(f_norm_sq_0, v_cos_phi_sq); - __m512 rhs_1 = _mm512_mul_ps(f_norm_sq_1, v_cos_phi_sq); - - // # 64 MULTs, 32 ADDs - __m512 e_dot_f_0 = _mm512_fmadd_ps(eix, f_x_0, _mm512_mul_ps(eiy, f_y_0)); - __m512 e_dot_f_1 = _mm512_fmadd_ps(eix, f_x_1, _mm512_mul_ps(eiy, f_y_1)); - - // # 32 MULTs - __m512 e_dot_f_sq_0 = _mm512_mul_ps(e_dot_f_0, e_dot_f_0); - __m512 e_dot_f_sq_1 = _mm512_mul_ps(e_dot_f_1, e_dot_f_1); - - __mmask16 c1_0 = _mm512_cmp_ps_mask(e_dot_f_0, v_zero, _CMP_LT_OQ); - __mmask16 c1_1 = _mm512_cmp_ps_mask(e_dot_f_1, v_zero, _CMP_LT_OQ); - - __mmask16 c2_0 = _mm512_cmp_ps_mask(e_dot_f_sq_0, rhs_0, _CMP_GT_OQ); - __mmask16 c2_1 = _mm512_cmp_ps_mask(e_dot_f_sq_1, rhs_1, _CMP_GT_OQ); - - __mmask16 cond_0 = c1_0 & c2_0; - __mmask16 cond_1 = c1_1 & c2_1; - - __m512 w_val_0 = _mm512_mask_blend_ps(cond_0, v_dt_neg, v_c_neg_dt); - __m512 w_val_1 = _mm512_mask_blend_ps(cond_1, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe_0 = _mm512_maskz_mov_ps(active_0, f_x_0); - __m512 f_x_safe_1 = _mm512_maskz_mov_ps(active_1, f_x_1); - - __m512 f_y_safe_0 = _mm512_maskz_mov_ps(active_0, f_y_0); - __m512 f_y_safe_1 = _mm512_maskz_mov_ps(active_1, f_y_1); - - // # 32 MULTs, 32 ADDs - acc_x_0 = _mm512_fmadd_ps(f_x_safe_0, w_val_0, acc_x_0); - acc_x_1 = _mm512_fmadd_ps(f_x_safe_1, w_val_1, acc_x_1); - - // # 32 MULTs, 32 ADDs - acc_y_0 = _mm512_fmadd_ps(f_y_safe_0, w_val_0, acc_y_0); - acc_y_1 = _mm512_fmadd_ps(f_y_safe_1, w_val_1, acc_y_1); - } - - // # 64 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(_mm512_add_ps(acc_x_0, acc_x_1)); - f_alpha_dt_y += _mm512_reduce_add_ps(_mm512_add_ps(acc_y_0, acc_y_1)); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 4 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTS - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 16) { - - __m512 w_x_i_vec = _mm512_loadu_ps(&w_x[i]); - __m512 w_y_i_vec = _mm512_loadu_ps(&w_y[i]); - __m512 v_max_i_vec = _mm512_loadu_ps(&v_max[i]); - __m512 pos_x_i_vec = _mm512_loadu_ps(&pos_x[i]); - __m512 pos_y_i_vec = _mm512_loadu_ps(&pos_y[i]); - __m512 destination_y_i_vec = _mm512_loadu_ps(&destination_y[i]); - __m512 destination_x_i_vec = _mm512_loadu_ps(&destination_x[i]); - __m512 desired_v0_i_vec = _mm512_loadu_ps(&desired_v0[i]); - - __m512i color_i_vec = _mm512_loadu_si512((__m512i *)&color[i]); - - // # 32 MULTs, 16 ADDs - __m512 w_norm_sq = _mm512_fmadd_ps(w_x_i_vec, w_x_i_vec, _mm512_mul_ps(w_y_i_vec, w_y_i_vec)); - - // # 16 SQRTs, 16 DIVs - __m512 w_norm_inv = _mm512_rsqrt14_ps(w_norm_sq); - - // # 16 MULTs - __m512 correction_factor = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_mul_ps(v_max_i_vec, w_norm_inv)); - - // # 32 MULTs - __m512 curr_vel_x_i_vec = _mm512_mul_ps(w_x_i_vec, correction_factor); - __m512 curr_vel_y_i_vec = _mm512_mul_ps(w_y_i_vec, correction_factor); - - __m512 dt_vec = _mm512_set1_ps(dt); - - // # 32 MULTs, 32 ADDs - pos_x_i_vec = _mm512_fmadd_ps(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_ps(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask16 cond_1_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_setzero_si512()); - __mmask16 cond_1_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask16 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_1, pos_x_i_vec, _mm512_set1_ps(1.0f)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_ps(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_ps(cond_1, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask16 cond_2_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_set1_epi32(1)); - __mmask16 cond_2_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - __mmask16 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_2, pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512 neg_desired_v0 = _mm512_xor_ps(desired_v0_i_vec, _mm512_set1_ps(-0.0f)); - w_x_i_vec = _mm512_mask_blend_ps(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_ps(cond_2, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_ps(pos_y_i_vec, _mm512_set1_ps(WALL_EPS)); - pos_y_i_vec = _mm512_min_ps(pos_y_i_vec, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 32 ADDs - __m512 ex_vec = _mm512_sub_ps(destination_x_i_vec, pos_x_i_vec); - __m512 ey_vec = _mm512_sub_ps(destination_y_i_vec, pos_y_i_vec); - - // # 32 MULTs, 16 ADDs - __m512 e_norm_sq = _mm512_fmadd_ps(ex_vec, ex_vec, _mm512_mul_ps(ey_vec, ey_vec)); - - // # 16 DIVs, 16 SQRTs - __m512 e_norm_inv = _mm512_rsqrt14_ps(e_norm_sq); - - // # 32 MULTs - __m512 e_x_i_vec = _mm512_mul_ps(ex_vec, e_norm_inv); - __m512 e_y_i_vec = _mm512_mul_ps(ey_vec, e_norm_inv); - - // # 32 MULTs, 16 ADDs - __m512 vel_norm_sq = _mm512_fmadd_ps(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_ps(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 16 MULTs - __m512 sb_sq_i_vec = _mm512_mul_ps(vel_norm_sq, _mm512_set1_ps(delta_t_sq)); - - // # 16 SQRTs - __m512 vel_norm_dt = _mm512_sqrt_ps(sb_sq_i_vec); - - _mm512_storeu_ps(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_ps(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_ps(&w_x[i], w_x_i_vec); - _mm512_storeu_ps(&w_y[i], w_y_i_vec); - _mm512_storeu_ps(&pos_x[i], pos_x_i_vec); - _mm512_storeu_ps(&pos_y[i], pos_y_i_vec); - _mm512_storeu_ps(&e_x[i], e_x_i_vec); - _mm512_storeu_ps(&e_y[i], e_y_i_vec); - _mm512_storeu_ps(&destination_y[i], destination_y_i_vec); - _mm512_storeu_ps(&sb_sq[i], sb_sq_i_vec); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_x[i], _mm512_mul_ps(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_ps(&sb_e_y[i], _mm512_mul_ps(e_y_i_vec, vel_norm_dt)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp b/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp deleted file mode 100644 index 1548d65..0000000 --- a/variants/variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_4_expfix.cpp +++ /dev/null @@ -1,727 +0,0 @@ -// # Changes: Added ILP with k = 4 to j-loop -// # Predecessor: variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2.cpp - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0f -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 63) & ~63; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 256 MULTs, 224 ADDs -static inline __m512 _avx512_exp_ps(__m512 x) { - - const __m512 log2e = _mm512_set1_ps(1.4426950408889634f); - - // # 16 MULTs - __m512 nf = _mm512_roundscale_ps(_mm512_mul_ps(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - - const __m512 ln2 = _mm512_set1_ps(0.6931471805599453f); - - // # 16 MULTs, 16 ADDs - __m512 r = _mm512_fnmadd_ps(nf, ln2, x); - - const __m512 c13 = _mm512_set1_ps(c13_scalar); - const __m512 c12 = _mm512_set1_ps(c12_scalar); - const __m512 c11 = _mm512_set1_ps(c11_scalar); - const __m512 c10 = _mm512_set1_ps(c10_scalar); - const __m512 c9 = _mm512_set1_ps(c9_scalar); - const __m512 c8 = _mm512_set1_ps(c8_scalar); - const __m512 c7 = _mm512_set1_ps(c7_scalar); - const __m512 c6 = _mm512_set1_ps(c6_scalar); - const __m512 c5 = _mm512_set1_ps(c5_scalar); - const __m512 c4 = _mm512_set1_ps(c4_scalar); - const __m512 c3 = _mm512_set1_ps(c3_scalar); - const __m512 c2 = _mm512_set1_ps(c2_scalar); - const __m512 c1 = _mm512_set1_ps(c1_scalar); - const __m512 c0 = _mm512_set1_ps(c0_scalar); - - __m512 p = c13; - - // # 13 * (16 MULTs, 16 ADDs) - // # = 208 MULTs, 208 ADDs - p = _mm512_fmadd_ps(p, r, c12); - p = _mm512_fmadd_ps(p, r, c11); - p = _mm512_fmadd_ps(p, r, c10); - p = _mm512_fmadd_ps(p, r, c9); - p = _mm512_fmadd_ps(p, r, c8); - p = _mm512_fmadd_ps(p, r, c7); - p = _mm512_fmadd_ps(p, r, c6); - p = _mm512_fmadd_ps(p, r, c5); - p = _mm512_fmadd_ps(p, r, c4); - p = _mm512_fmadd_ps(p, r, c3); - p = _mm512_fmadd_ps(p, r, c2); - p = _mm512_fmadd_ps(p, r, c1); - p = _mm512_fmadd_ps(p, r, c0); - - __m512i ni = _mm512_cvtps_epi32(nf); - __m512i biased = _mm512_add_epi32(ni, _mm512_set1_epi32(127)); - __m512i scaled = _mm512_slli_epi32(biased, 23); - __m512 pow2n = _mm512_castsi512_ps(scaled); - - // # 16 MULTs - return _mm512_mul_ps(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 63) & ~63; - - alignas(64) const float lane_offset_arr[16] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f}; - const __m512 lane_off = _mm512_load_ps(lane_offset_arr); - - const __m512 v_neg_v0_div_2s = _mm512_set1_ps(NEG_V0_AB_div_TWO_SIGMA); - const __m512 v_neg_2s_inv = _mm512_set1_ps(NEG_TWO_SIGMA_INV); - const __m512 v_cos_phi_sq = _mm512_set1_ps(cos_phi_sq); - const __m512 v_dt_neg = _mm512_set1_ps(dt_neg); - const __m512 v_c_neg_dt = _mm512_set1_ps(c_neg_times_dt); - const __m512 v_zero = _mm512_setzero_ps(); - const __m512 v_one = _mm512_set1_ps(1.0f); - const __m512 v_eps = _mm512_set1_ps(EPS); - const __m512 v_eps_sq = _mm512_set1_ps(EPS_SQ); - const __m512 v_np = _mm512_set1_ps((float)n_p); - const __m512 v_exp_min = _mm512_set1_ps(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 132 + - // # n_p * n_p_pad * 29 + - // # n_p * board.n_obstacles * 10 + - // # n_p_pad * 7 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 40 + - // # n_p * board.n_obstacles * 13 + - // # n_p_pad * 15 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad + - // # n_p * board.n_obstacles + - // # n_p_pad * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTs - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDs, 2 MULTs - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const __m512 pix = _mm512_set1_ps(pos_x[i]); - const __m512 piy = _mm512_set1_ps(pos_y[i]); - const __m512 eix = _mm512_set1_ps(e_x[i]); - const __m512 eiy = _mm512_set1_ps(e_y[i]); - const __m512 v_i = _mm512_set1_ps((float)i); - - __m512 acc_x_0 = _mm512_setzero_ps(); - __m512 acc_x_1 = _mm512_setzero_ps(); - __m512 acc_x_2 = _mm512_setzero_ps(); - __m512 acc_x_3 = _mm512_setzero_ps(); - - __m512 acc_y_0 = _mm512_setzero_ps(); - __m512 acc_y_1 = _mm512_setzero_ps(); - __m512 acc_y_2 = _mm512_setzero_ps(); - __m512 acc_y_3 = _mm512_setzero_ps(); - - for (int j = 0; j < n_p_pad; j += 64) { - - // # 64 ADDs - __m512 j_idx_0 = _mm512_add_ps(_mm512_set1_ps((float)j), lane_off); - __m512 j_idx_1 = _mm512_add_ps(_mm512_set1_ps((float)j + 16), lane_off); - __m512 j_idx_2 = _mm512_add_ps(_mm512_set1_ps((float)j + 32), lane_off); - __m512 j_idx_3 = _mm512_add_ps(_mm512_set1_ps((float)j + 48), lane_off); - - __mmask16 m_neq_i_0 = _mm512_cmp_ps_mask(j_idx_0, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_1 = _mm512_cmp_ps_mask(j_idx_1, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_2 = _mm512_cmp_ps_mask(j_idx_2, v_i, _CMP_NEQ_OQ); - __mmask16 m_neq_i_3 = _mm512_cmp_ps_mask(j_idx_3, v_i, _CMP_NEQ_OQ); - - __mmask16 m_in_range_0 = _mm512_cmp_ps_mask(j_idx_0, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_1 = _mm512_cmp_ps_mask(j_idx_1, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_2 = _mm512_cmp_ps_mask(j_idx_2, v_np, _CMP_LT_OQ); - __mmask16 m_in_range_3 = _mm512_cmp_ps_mask(j_idx_3, v_np, _CMP_LT_OQ); - - __mmask16 active_0 = m_neq_i_0 & m_in_range_0; - __mmask16 active_1 = m_neq_i_1 & m_in_range_1; - __mmask16 active_2 = m_neq_i_2 & m_in_range_2; - __mmask16 active_3 = m_neq_i_3 & m_in_range_3; - - __m512 pjx_0 = _mm512_loadu_ps(&pos_x[j]); - __m512 pjx_1 = _mm512_loadu_ps(&pos_x[j + 16]); - __m512 pjx_2 = _mm512_loadu_ps(&pos_x[j + 32]); - __m512 pjx_3 = _mm512_loadu_ps(&pos_x[j + 48]); - - __m512 pjy_0 = _mm512_loadu_ps(&pos_y[j]); - __m512 pjy_1 = _mm512_loadu_ps(&pos_y[j + 16]); - __m512 pjy_2 = _mm512_loadu_ps(&pos_y[j + 32]); - __m512 pjy_3 = _mm512_loadu_ps(&pos_y[j + 48]); - - __m512 sbe_jx_0 = _mm512_loadu_ps(&sb_e_x[j]); - __m512 sbe_jx_1 = _mm512_loadu_ps(&sb_e_x[j + 16]); - __m512 sbe_jx_2 = _mm512_loadu_ps(&sb_e_x[j + 32]); - __m512 sbe_jx_3 = _mm512_loadu_ps(&sb_e_x[j + 48]); - - __m512 sbe_jy_0 = _mm512_loadu_ps(&sb_e_y[j]); - __m512 sbe_jy_1 = _mm512_loadu_ps(&sb_e_y[j + 16]); - __m512 sbe_jy_2 = _mm512_loadu_ps(&sb_e_y[j + 32]); - __m512 sbe_jy_3 = _mm512_loadu_ps(&sb_e_y[j + 48]); - - __m512 sb_jsq_0 = _mm512_loadu_ps(&sb_sq[j]); - __m512 sb_jsq_1 = _mm512_loadu_ps(&sb_sq[j + 16]); - __m512 sb_jsq_2 = _mm512_loadu_ps(&sb_sq[j + 32]); - __m512 sb_jsq_3 = _mm512_loadu_ps(&sb_sq[j + 48]); - - // # 64 ADDs - __m512 r_ab_x_0 = _mm512_sub_ps(pix, pjx_0); - __m512 r_ab_x_1 = _mm512_sub_ps(pix, pjx_1); - __m512 r_ab_x_2 = _mm512_sub_ps(pix, pjx_2); - __m512 r_ab_x_3 = _mm512_sub_ps(pix, pjx_3); - - // # 64 ADDs - __m512 r_ab_y_0 = _mm512_sub_ps(piy, pjy_0); - __m512 r_ab_y_1 = _mm512_sub_ps(piy, pjy_1); - __m512 r_ab_y_2 = _mm512_sub_ps(piy, pjy_2); - __m512 r_ab_y_3 = _mm512_sub_ps(piy, pjy_3); - - // # 128 MULTs, 64 ADDs - __m512 r_ab_n2_0 = _mm512_fmadd_ps(r_ab_x_0, r_ab_x_0, _mm512_mul_ps(r_ab_y_0, r_ab_y_0)); - __m512 r_ab_n2_1 = _mm512_fmadd_ps(r_ab_x_1, r_ab_x_1, _mm512_mul_ps(r_ab_y_1, r_ab_y_1)); - __m512 r_ab_n2_2 = _mm512_fmadd_ps(r_ab_x_2, r_ab_x_2, _mm512_mul_ps(r_ab_y_2, r_ab_y_2)); - __m512 r_ab_n2_3 = _mm512_fmadd_ps(r_ab_x_3, r_ab_x_3, _mm512_mul_ps(r_ab_y_3, r_ab_y_3)); - - // # 64 SQRTs - __m512 r_ab_n_0 = _mm512_sqrt_ps(r_ab_n2_0); - __m512 r_ab_n_1 = _mm512_sqrt_ps(r_ab_n2_1); - __m512 r_ab_n_2 = _mm512_sqrt_ps(r_ab_n2_2); - __m512 r_ab_n_3 = _mm512_sqrt_ps(r_ab_n2_3); - - // # 64 ADDs - __m512 r_ab2_x_0 = _mm512_sub_ps(r_ab_x_0, sbe_jx_0); - __m512 r_ab2_x_1 = _mm512_sub_ps(r_ab_x_1, sbe_jx_1); - __m512 r_ab2_x_2 = _mm512_sub_ps(r_ab_x_2, sbe_jx_2); - __m512 r_ab2_x_3 = _mm512_sub_ps(r_ab_x_3, sbe_jx_3); - - // # 64 ADDs - __m512 r_ab2_y_0 = _mm512_sub_ps(r_ab_y_0, sbe_jy_0); - __m512 r_ab2_y_1 = _mm512_sub_ps(r_ab_y_1, sbe_jy_1); - __m512 r_ab2_y_2 = _mm512_sub_ps(r_ab_y_2, sbe_jy_2); - __m512 r_ab2_y_3 = _mm512_sub_ps(r_ab_y_3, sbe_jy_3); - - // # 128 MULTs, 64 ADDs - __m512 r_ab2_n2_0 = _mm512_fmadd_ps(r_ab2_x_0, r_ab2_x_0, _mm512_mul_ps(r_ab2_y_0, r_ab2_y_0)); - __m512 r_ab2_n2_1 = _mm512_fmadd_ps(r_ab2_x_1, r_ab2_x_1, _mm512_mul_ps(r_ab2_y_1, r_ab2_y_1)); - __m512 r_ab2_n2_2 = _mm512_fmadd_ps(r_ab2_x_2, r_ab2_x_2, _mm512_mul_ps(r_ab2_y_2, r_ab2_y_2)); - __m512 r_ab2_n2_3 = _mm512_fmadd_ps(r_ab2_x_3, r_ab2_x_3, _mm512_mul_ps(r_ab2_y_3, r_ab2_y_3)); - - // # 64 SQRTs - __m512 r_ab2_n_0 = _mm512_sqrt_ps(r_ab2_n2_0); - __m512 r_ab2_n_1 = _mm512_sqrt_ps(r_ab2_n2_1); - __m512 r_ab2_n_2 = _mm512_sqrt_ps(r_ab2_n2_2); - __m512 r_ab2_n_3 = _mm512_sqrt_ps(r_ab2_n2_3); - - // # 64 ADDs - __m512 r_sum_0 = _mm512_add_ps(r_ab_n_0, r_ab2_n_0); - __m512 r_sum_1 = _mm512_add_ps(r_ab_n_1, r_ab2_n_1); - __m512 r_sum_2 = _mm512_add_ps(r_ab_n_2, r_ab2_n_2); - __m512 r_sum_3 = _mm512_add_ps(r_ab_n_3, r_ab2_n_3); - - // # 64 MULTs, 64 ADDs - __m512 two_b_sq_0 = _mm512_fmsub_ps(r_sum_0, r_sum_0, sb_jsq_0); - __m512 two_b_sq_1 = _mm512_fmsub_ps(r_sum_1, r_sum_1, sb_jsq_1); - __m512 two_b_sq_2 = _mm512_fmsub_ps(r_sum_2, r_sum_2, sb_jsq_2); - __m512 two_b_sq_3 = _mm512_fmsub_ps(r_sum_3, r_sum_3, sb_jsq_3); - - // # 64 SQRTs - __m512 two_b_0 = _mm512_sqrt_ps(two_b_sq_0); - __m512 two_b_1 = _mm512_sqrt_ps(two_b_sq_1); - __m512 two_b_2 = _mm512_sqrt_ps(two_b_sq_2); - __m512 two_b_3 = _mm512_sqrt_ps(two_b_sq_3); - - // # 64 MULTs - __m512 e_arg_0 = _mm512_mul_ps(two_b_0, v_neg_2s_inv); - __m512 e_arg_1 = _mm512_mul_ps(two_b_1, v_neg_2s_inv); - __m512 e_arg_2 = _mm512_mul_ps(two_b_2, v_neg_2s_inv); - __m512 e_arg_3 = _mm512_mul_ps(two_b_3, v_neg_2s_inv); - - e_arg_0 = _mm512_max_ps(e_arg_0, v_exp_min); - e_arg_1 = _mm512_max_ps(e_arg_1, v_exp_min); - e_arg_2 = _mm512_max_ps(e_arg_2, v_exp_min); - e_arg_3 = _mm512_max_ps(e_arg_3, v_exp_min); - - // # 1024 MULTs, 896 ADDs - __m512 e_val_0 = _avx512_exp_ps(e_arg_0); - __m512 e_val_1 = _avx512_exp_ps(e_arg_1); - __m512 e_val_2 = _avx512_exp_ps(e_arg_2); - __m512 e_val_3 = _avx512_exp_ps(e_arg_3); - - // # 128 MULTs - __m512 numer_0 = _mm512_mul_ps(_mm512_mul_ps(r_sum_0, v_neg_v0_div_2s), e_val_0); - __m512 numer_1 = _mm512_mul_ps(_mm512_mul_ps(r_sum_1, v_neg_v0_div_2s), e_val_1); - __m512 numer_2 = _mm512_mul_ps(_mm512_mul_ps(r_sum_2, v_neg_v0_div_2s), e_val_2); - __m512 numer_3 = _mm512_mul_ps(_mm512_mul_ps(r_sum_3, v_neg_v0_div_2s), e_val_3); - - // # 128 MULTs - __m512 denom_0 = _mm512_mul_ps(_mm512_mul_ps(two_b_0, r_ab_n_0), r_ab2_n_0); - __m512 denom_1 = _mm512_mul_ps(_mm512_mul_ps(two_b_1, r_ab_n_1), r_ab2_n_1); - __m512 denom_2 = _mm512_mul_ps(_mm512_mul_ps(two_b_2, r_ab_n_2), r_ab2_n_2); - __m512 denom_3 = _mm512_mul_ps(_mm512_mul_ps(two_b_3, r_ab_n_3), r_ab2_n_3); - - __m512 denom_safe_0 = _mm512_mask_blend_ps(active_0, v_one, denom_0); - __m512 denom_safe_1 = _mm512_mask_blend_ps(active_1, v_one, denom_1); - __m512 denom_safe_2 = _mm512_mask_blend_ps(active_2, v_one, denom_2); - __m512 denom_safe_3 = _mm512_mask_blend_ps(active_3, v_one, denom_3); - - // # 64 DIVs - __m512 smc_0 = _mm512_div_ps(numer_0, denom_safe_0); - __m512 smc_1 = _mm512_div_ps(numer_1, denom_safe_1); - __m512 smc_2 = _mm512_div_ps(numer_2, denom_safe_2); - __m512 smc_3 = _mm512_div_ps(numer_3, denom_safe_3); - - // # 64 MULTs - __m512 sm_r_ab_0 = _mm512_mul_ps(smc_0, r_ab2_n_0); - __m512 sm_r_ab_1 = _mm512_mul_ps(smc_1, r_ab2_n_1); - __m512 sm_r_ab_2 = _mm512_mul_ps(smc_2, r_ab2_n_2); - __m512 sm_r_ab_3 = _mm512_mul_ps(smc_3, r_ab2_n_3); - - // # 64 MULTs - __m512 sm_r_ab2_0 = _mm512_mul_ps(smc_0, r_ab_n_0); - __m512 sm_r_ab2_1 = _mm512_mul_ps(smc_1, r_ab_n_1); - __m512 sm_r_ab2_2 = _mm512_mul_ps(smc_2, r_ab_n_2); - __m512 sm_r_ab2_3 = _mm512_mul_ps(smc_3, r_ab_n_3); - - // # 128 MULTs, 64 ADDs - __m512 f_x_0 = _mm512_fmadd_ps(r_ab2_x_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_x_0, sm_r_ab_0)); - __m512 f_x_1 = _mm512_fmadd_ps(r_ab2_x_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_x_1, sm_r_ab_1)); - __m512 f_x_2 = _mm512_fmadd_ps(r_ab2_x_2, sm_r_ab2_2, _mm512_mul_ps(r_ab_x_2, sm_r_ab_2)); - __m512 f_x_3 = _mm512_fmadd_ps(r_ab2_x_3, sm_r_ab2_3, _mm512_mul_ps(r_ab_x_3, sm_r_ab_3)); - - // # 128 MULTs, 64 ADDs - __m512 f_y_0 = _mm512_fmadd_ps(r_ab2_y_0, sm_r_ab2_0, _mm512_mul_ps(r_ab_y_0, sm_r_ab_0)); - __m512 f_y_1 = _mm512_fmadd_ps(r_ab2_y_1, sm_r_ab2_1, _mm512_mul_ps(r_ab_y_1, sm_r_ab_1)); - __m512 f_y_2 = _mm512_fmadd_ps(r_ab2_y_2, sm_r_ab2_2, _mm512_mul_ps(r_ab_y_2, sm_r_ab_2)); - __m512 f_y_3 = _mm512_fmadd_ps(r_ab2_y_3, sm_r_ab2_3, _mm512_mul_ps(r_ab_y_3, sm_r_ab_3)); - - // # 128 MULTs, 64 ADDs - __m512 f_norm_sq_0 = _mm512_fmadd_ps(f_x_0, f_x_0, _mm512_mul_ps(f_y_0, f_y_0)); - __m512 f_norm_sq_1 = _mm512_fmadd_ps(f_x_1, f_x_1, _mm512_mul_ps(f_y_1, f_y_1)); - __m512 f_norm_sq_2 = _mm512_fmadd_ps(f_x_2, f_x_2, _mm512_mul_ps(f_y_2, f_y_2)); - __m512 f_norm_sq_3 = _mm512_fmadd_ps(f_x_3, f_x_3, _mm512_mul_ps(f_y_3, f_y_3)); - - // # 64 MULTs - __m512 rhs_0 = _mm512_mul_ps(f_norm_sq_0, v_cos_phi_sq); - __m512 rhs_1 = _mm512_mul_ps(f_norm_sq_1, v_cos_phi_sq); - __m512 rhs_2 = _mm512_mul_ps(f_norm_sq_2, v_cos_phi_sq); - __m512 rhs_3 = _mm512_mul_ps(f_norm_sq_3, v_cos_phi_sq); - - // # 128 MULTs, 64 ADDs - __m512 e_dot_f_0 = _mm512_fmadd_ps(eix, f_x_0, _mm512_mul_ps(eiy, f_y_0)); - __m512 e_dot_f_1 = _mm512_fmadd_ps(eix, f_x_1, _mm512_mul_ps(eiy, f_y_1)); - __m512 e_dot_f_2 = _mm512_fmadd_ps(eix, f_x_2, _mm512_mul_ps(eiy, f_y_2)); - __m512 e_dot_f_3 = _mm512_fmadd_ps(eix, f_x_3, _mm512_mul_ps(eiy, f_y_3)); - - // # 64 MULTs - __m512 e_dot_f_sq_0 = _mm512_mul_ps(e_dot_f_0, e_dot_f_0); - __m512 e_dot_f_sq_1 = _mm512_mul_ps(e_dot_f_1, e_dot_f_1); - __m512 e_dot_f_sq_2 = _mm512_mul_ps(e_dot_f_2, e_dot_f_2); - __m512 e_dot_f_sq_3 = _mm512_mul_ps(e_dot_f_3, e_dot_f_3); - - __mmask16 c1_0 = _mm512_cmp_ps_mask(e_dot_f_0, v_zero, _CMP_LT_OQ); - __mmask16 c1_1 = _mm512_cmp_ps_mask(e_dot_f_1, v_zero, _CMP_LT_OQ); - __mmask16 c1_2 = _mm512_cmp_ps_mask(e_dot_f_2, v_zero, _CMP_LT_OQ); - __mmask16 c1_3 = _mm512_cmp_ps_mask(e_dot_f_3, v_zero, _CMP_LT_OQ); - - __mmask16 c2_0 = _mm512_cmp_ps_mask(e_dot_f_sq_0, rhs_0, _CMP_GT_OQ); - __mmask16 c2_1 = _mm512_cmp_ps_mask(e_dot_f_sq_1, rhs_1, _CMP_GT_OQ); - __mmask16 c2_2 = _mm512_cmp_ps_mask(e_dot_f_sq_2, rhs_2, _CMP_GT_OQ); - __mmask16 c2_3 = _mm512_cmp_ps_mask(e_dot_f_sq_3, rhs_3, _CMP_GT_OQ); - - __mmask16 cond_0 = c1_0 & c2_0; - __mmask16 cond_1 = c1_1 & c2_1; - __mmask16 cond_2 = c1_2 & c2_2; - __mmask16 cond_3 = c1_3 & c2_3; - - __m512 w_val_0 = _mm512_mask_blend_ps(cond_0, v_dt_neg, v_c_neg_dt); - __m512 w_val_1 = _mm512_mask_blend_ps(cond_1, v_dt_neg, v_c_neg_dt); - __m512 w_val_2 = _mm512_mask_blend_ps(cond_2, v_dt_neg, v_c_neg_dt); - __m512 w_val_3 = _mm512_mask_blend_ps(cond_3, v_dt_neg, v_c_neg_dt); - - __m512 f_x_safe_0 = _mm512_maskz_mov_ps(active_0, f_x_0); - __m512 f_x_safe_1 = _mm512_maskz_mov_ps(active_1, f_x_1); - __m512 f_x_safe_2 = _mm512_maskz_mov_ps(active_2, f_x_2); - __m512 f_x_safe_3 = _mm512_maskz_mov_ps(active_3, f_x_3); - - __m512 f_y_safe_0 = _mm512_maskz_mov_ps(active_0, f_y_0); - __m512 f_y_safe_1 = _mm512_maskz_mov_ps(active_1, f_y_1); - __m512 f_y_safe_2 = _mm512_maskz_mov_ps(active_2, f_y_2); - __m512 f_y_safe_3 = _mm512_maskz_mov_ps(active_3, f_y_3); - - // # 64 MULTs, 64 ADDs - acc_x_0 = _mm512_fmadd_ps(f_x_safe_0, w_val_0, acc_x_0); - acc_x_1 = _mm512_fmadd_ps(f_x_safe_1, w_val_1, acc_x_1); - acc_x_2 = _mm512_fmadd_ps(f_x_safe_2, w_val_2, acc_x_2); - acc_x_3 = _mm512_fmadd_ps(f_x_safe_3, w_val_3, acc_x_3); - - // # 64 MULTs, 64 ADDs - acc_y_0 = _mm512_fmadd_ps(f_y_safe_0, w_val_0, acc_y_0); - acc_y_1 = _mm512_fmadd_ps(f_y_safe_1, w_val_1, acc_y_1); - acc_y_2 = _mm512_fmadd_ps(f_y_safe_2, w_val_2, acc_y_2); - acc_y_3 = _mm512_fmadd_ps(f_y_safe_3, w_val_3, acc_y_3); - } - // # 128 ADDs - f_alpha_dt_x += _mm512_reduce_add_ps(_mm512_add_ps(_mm512_add_ps(acc_x_0, acc_x_1), _mm512_add_ps(acc_x_2, acc_x_3))); - f_alpha_dt_y += _mm512_reduce_add_ps(_mm512_add_ps(_mm512_add_ps(acc_y_0, acc_y_1), _mm512_add_ps(acc_y_2, acc_y_3))); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 1 EXP, 4 MULTs, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 16) { - - __m512 w_x_i_vec = _mm512_loadu_ps(&w_x[i]); - __m512 w_y_i_vec = _mm512_loadu_ps(&w_y[i]); - __m512 v_max_i_vec = _mm512_loadu_ps(&v_max[i]); - __m512 pos_x_i_vec = _mm512_loadu_ps(&pos_x[i]); - __m512 pos_y_i_vec = _mm512_loadu_ps(&pos_y[i]); - __m512 destination_y_i_vec = _mm512_loadu_ps(&destination_y[i]); - __m512 destination_x_i_vec = _mm512_loadu_ps(&destination_x[i]); - __m512 desired_v0_i_vec = _mm512_loadu_ps(&desired_v0[i]); - - __m512i color_i_vec = _mm512_loadu_si512((__m512i *)&color[i]); - - // # 32 MULTs, 16 ADDs - __m512 w_norm_sq = _mm512_fmadd_ps(w_x_i_vec, w_x_i_vec, _mm512_mul_ps(w_y_i_vec, w_y_i_vec)); - - // # 16 SQRTs - __m512 w_norm = _mm512_sqrt_ps(w_norm_sq); - - // # 16 DIVs - __m512 correction_factor = _mm512_min_ps(_mm512_set1_ps(1.0f), _mm512_div_ps(v_max_i_vec, w_norm)); - - // # 32 MULTs - __m512 curr_vel_x_i_vec = _mm512_mul_ps(w_x_i_vec, correction_factor); - __m512 curr_vel_y_i_vec = _mm512_mul_ps(w_y_i_vec, correction_factor); - - __m512 dt_vec = _mm512_set1_ps(dt); - - // # 32 MULTs, 32 ADDs - pos_x_i_vec = _mm512_fmadd_ps(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_ps(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask16 cond_1_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_setzero_si512()); - __mmask16 cond_1_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask16 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_1, pos_x_i_vec, _mm512_set1_ps(1.0f)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_ps(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_ps(cond_1, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask16 cond_2_left = _mm512_cmpeq_epi32_mask(color_i_vec, _mm512_set1_epi32(1)); - __mmask16 cond_2_right = _mm512_cmp_ps_mask(pos_x_i_vec, _mm512_set1_ps(1.5f), _CMP_LT_OQ); - __mmask16 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_ps(cond_2, pos_x_i_vec, _mm512_set1_ps(BOARD_LENGTH_MINUS_ONE)); - destination_y_i_vec = _mm512_mask_blend_ps(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512 neg_desired_v0 = _mm512_xor_ps(desired_v0_i_vec, _mm512_set1_ps(-0.0f)); - w_x_i_vec = _mm512_mask_blend_ps(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_ps(cond_2, w_y_i_vec, _mm512_setzero_ps()); - curr_vel_x_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_ps(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_ps(pos_y_i_vec, _mm512_set1_ps(WALL_EPS)); - pos_y_i_vec = _mm512_min_ps(pos_y_i_vec, _mm512_set1_ps(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 32 ADDs - __m512 ex_vec = _mm512_sub_ps(destination_x_i_vec, pos_x_i_vec); - __m512 ey_vec = _mm512_sub_ps(destination_y_i_vec, pos_y_i_vec); - - // # 32 MULTs, 16 ADDs - __m512 e_norm_sq = _mm512_fmadd_ps(ex_vec, ex_vec, _mm512_mul_ps(ey_vec, ey_vec)); - - // # 16 SQRTs - __m512 e_norm = _mm512_sqrt_ps(e_norm_sq); - - // # 16 DIVs - __m512 e_norm_inv = _mm512_div_ps(_mm512_set1_ps(1.0f), e_norm); - - // # 32 MULTs - __m512 e_x_i_vec = _mm512_mul_ps(ex_vec, e_norm_inv); - __m512 e_y_i_vec = _mm512_mul_ps(ey_vec, e_norm_inv); - - // # 32 MULTs, 16 ADDs - __m512 vel_norm_sq = _mm512_fmadd_ps(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_ps(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 16 MULTs - __m512 sb_sq_i_vec = _mm512_mul_ps(vel_norm_sq, _mm512_set1_ps(delta_t_sq)); - - // # 16 SQRTs - __m512 vel_norm_dt = _mm512_sqrt_ps(sb_sq_i_vec); - - _mm512_storeu_ps(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_ps(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_ps(&w_x[i], w_x_i_vec); - _mm512_storeu_ps(&w_y[i], w_y_i_vec); - _mm512_storeu_ps(&pos_x[i], pos_x_i_vec); - _mm512_storeu_ps(&pos_y[i], pos_y_i_vec); - _mm512_storeu_ps(&e_x[i], e_x_i_vec); - _mm512_storeu_ps(&e_y[i], e_y_i_vec); - _mm512_storeu_ps(&destination_y[i], destination_y_i_vec); - _mm512_storeu_ps(&sb_sq[i], sb_sq_i_vec); - - // # 32 MULTs - _mm512_storeu_ps(&sb_e_x[i], _mm512_mul_ps(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_ps(&sb_e_y[i], _mm512_mul_ps(e_y_i_vec, vel_norm_dt)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt.cpp b/variants/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt.cpp deleted file mode 100644 index 9998d72..0000000 --- a/variants/variant_float_inlining_SoA_NEON_polyexp_moreavx_ilp_2_rsqrt_morersqrt.cpp +++ /dev/null @@ -1,646 +0,0 @@ -// # Changes: NEON port of variant_float_inlining_SoA_AVX512_polyexp_moreavx_ilp_2_rsqrt.cpp -// - 16-wide AVX-512 → 4-wide NEON; ILP unroll by 2 preserved (inner loop processes 8 j's per iter) -// - rsqrt14_ps → vrsqrteq_f32 + 1 Newton iteration (single-precision accuracy) -// - reduce_add_ps → vaddvq_f32 -// - Padding multiple changed from 32 to 8 -// - Scalar obstacle loop unchanged - -#include "../headers/board_reduced_float.hpp" -#include "../headers/constants_float.hpp" -#include "../headers/pedestrian_reduced_float.hpp" - -#ifdef __aarch64__ -#include -#endif - -#ifdef __x86_64__ -#define SIMDE_ENABLE_NATIVE_ALIASES -#include -#endif - -#include -#include -#include -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0f -#define BOARD_LENGTH 50.0f -#define WALL_EPS 1e-3f -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999f - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 7) & ~7; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - float x = x_gen_left(gen); - float y = y_gen(gen); - - float dest_x = BOARD_LENGTH + 30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int i = n_p_half; i < n_p; i++) { - float x = x_gen_right(gen); - float y = y_gen(gen); - - float dest_x = -30.0f; - float dest_y = y; - - float init_e_x = dest_x - x; - float init_e_y = dest_y - y; - float init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - float init_e_unit_x = init_e_x / init_e_norm; - float init_e_unit_y = init_e_y / init_e_norm; - - float d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1f); - - float v_m = 1.3f * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0f; - w_y[i] = 0.0f; - curr_vel_x[i] = 0.0f; - curr_vel_y[i] = 0.0f; - sb_sq[i] = 0.0f; - sb_e_x[i] = 0.0f; - sb_e_y[i] = 0.0f; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9f; - pos_y[j] = 1e9f; - sb_sq[j] = 0.0f; - sb_e_x[j] = 0.0f; - sb_e_y[j] = 0.0f; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 64 MULTs, 56 ADDs -static inline float32x4_t _neon_exp_ps(float32x4_t x) { - const float32x4_t log2e = vdupq_n_f32(1.4426950408889634f); - - // # 4 MULTS - float32x4_t nf = vrndnq_f32(vmulq_f32(x, log2e)); - - const float32x4_t ln2 = vdupq_n_f32(0.6931471805599453f); - - // # 4 MULTs, 4 ADDs - float32x4_t r = vfmsq_f32(x, nf, ln2); // r = x - nf*ln2 - - const float32x4_t c12 = vdupq_n_f32(c12_scalar); - const float32x4_t c11 = vdupq_n_f32(c11_scalar); - const float32x4_t c10 = vdupq_n_f32(c10_scalar); - const float32x4_t c9 = vdupq_n_f32(c9_scalar); - const float32x4_t c8 = vdupq_n_f32(c8_scalar); - const float32x4_t c7 = vdupq_n_f32(c7_scalar); - const float32x4_t c6 = vdupq_n_f32(c6_scalar); - const float32x4_t c5 = vdupq_n_f32(c5_scalar); - const float32x4_t c4 = vdupq_n_f32(c4_scalar); - const float32x4_t c3 = vdupq_n_f32(c3_scalar); - const float32x4_t c2 = vdupq_n_f32(c2_scalar); - const float32x4_t c1 = vdupq_n_f32(c1_scalar); - const float32x4_t c0 = vdupq_n_f32(c0_scalar); - - float32x4_t p = c12; - - // # 13 * (4 MULTs, 4 ADDs) - // # = 52 MULTs, 52 ADDs - p = vfmaq_f32(c12, p, r); - p = vfmaq_f32(c11, p, r); - p = vfmaq_f32(c10, p, r); - p = vfmaq_f32(c9, p, r); - p = vfmaq_f32(c8, p, r); - p = vfmaq_f32(c7, p, r); - p = vfmaq_f32(c6, p, r); - p = vfmaq_f32(c5, p, r); - p = vfmaq_f32(c4, p, r); - p = vfmaq_f32(c3, p, r); - p = vfmaq_f32(c2, p, r); - p = vfmaq_f32(c1, p, r); - p = vfmaq_f32(c0, p, r); - - int32x4_t ni = vcvtq_s32_f32(nf); - int32x4_t biased = vaddq_s32(ni, vdupq_n_s32(127)); - int32x4_t scaled = vshlq_n_s32(biased, 23); - float32x4_t pow2n = vreinterpretq_f32_s32(scaled); - - // # 4 MULTs - return vmulq_f32(p, pow2n); -} - -// # 4 ADD, 16 MULTS, 4 SQRT, 4 DIV -// Newton-Raphson refinement formula. -static inline float32x4_t _neon_rsqrt_ps(float32x4_t x) { - // # 4 SQRT, 4 DIV - float32x4_t y = vrsqrteq_f32(x); - - // # 16 MULTS, 4 ADD - y = vmulq_f32(y, vrsqrtsq_f32(vmulq_f32(x, y), y)); - return y; -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - (void)pedestrians; -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 7) & ~7; - - const float32x4_t lane_off = {0.0f, 1.0f, 2.0f, 3.0f}; - - const float32x4_t v_neg_v0_div_2s = vdupq_n_f32(NEG_V0_AB_div_TWO_SIGMA); - const float32x4_t v_neg_2s_inv = vdupq_n_f32(NEG_TWO_SIGMA_INV); - const float32x4_t v_cos_phi_sq = vdupq_n_f32(cos_phi_sq); - const float32x4_t v_dt_neg = vdupq_n_f32(dt_neg); - const float32x4_t v_c_neg_dt = vdupq_n_f32(c_neg_times_dt); - const float32x4_t v_zero = vdupq_n_f32(0.0f); - const float32x4_t v_one = vdupq_n_f32(1.0f); - const float32x4_t v_eps_sq = vdupq_n_f32(EPS_SQ); - const float32x4_t v_np = vdupq_n_f32((float)n_p); - const float32x4_t v_exp_min = vdupq_n_f32(-87.0f); - - // # ADDs: n_iter * ( - // # n_p * 20 + - // # n_p * n_p_pad * 32 + - // # n_p * board.n_obstacles * 10 + - // # n_p_pad * 9 - // # ) - - // # MULTs: n_iter * ( - // # n_p * 4 + - // # n_p * n_p_pad * 54 + - // # n_p * board.n_obstacles * 13 + - // # n_p_pad * 24 - // # ) - - // # DIVs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 2 - // # ) - - // # SQRTs: n_iter * ( - // # n_p * n_p_pad * 3 + - // # n_p * board.n_obstacles + - // # n_p_pad * 3 - // # ) - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - // # 2 MULTS - float desired_velocity_x = e_x[i] * desired_v0[i]; - float desired_velocity_y = e_y[i] * desired_v0[i]; - - // # 2 ADDS, 2 MULTS - float f_alpha_dt_x = (desired_velocity_x - curr_vel_x[i]) * dt_times_tau_alpha_inv; - float f_alpha_dt_y = (desired_velocity_y - curr_vel_y[i]) * dt_times_tau_alpha_inv; - - const float32x4_t pix = vdupq_n_f32(pos_x[i]); - const float32x4_t piy = vdupq_n_f32(pos_y[i]); - const float32x4_t eix = vdupq_n_f32(e_x[i]); - const float32x4_t eiy = vdupq_n_f32(e_y[i]); - const float32x4_t v_i = vdupq_n_f32((float)i); - - float32x4_t acc_x_0 = vdupq_n_f32(0.0f); - float32x4_t acc_y_0 = vdupq_n_f32(0.0f); - float32x4_t acc_x_1 = vdupq_n_f32(0.0f); - float32x4_t acc_y_1 = vdupq_n_f32(0.0f); - - for (int j = 0; j < n_p_pad; j += 8) { - - // # 8 ADDS - float32x4_t j_idx_0 = vaddq_f32(vdupq_n_f32((float)j), lane_off); - float32x4_t j_idx_1 = vaddq_f32(vdupq_n_f32((float)(j + 4)), lane_off); - - uint32x4_t m_neq_i_0 = vmvnq_u32(vceqq_f32(j_idx_0, v_i)); - uint32x4_t m_neq_i_1 = vmvnq_u32(vceqq_f32(j_idx_1, v_i)); - uint32x4_t m_in_range_0 = vcltq_f32(j_idx_0, v_np); - uint32x4_t m_in_range_1 = vcltq_f32(j_idx_1, v_np); - uint32x4_t active_0 = vandq_u32(m_neq_i_0, m_in_range_0); - uint32x4_t active_1 = vandq_u32(m_neq_i_1, m_in_range_1); - - float32x4_t pjx_0 = vld1q_f32(&pos_x[j]); - float32x4_t pjx_1 = vld1q_f32(&pos_x[j + 4]); - float32x4_t pjy_0 = vld1q_f32(&pos_y[j]); - float32x4_t pjy_1 = vld1q_f32(&pos_y[j + 4]); - float32x4_t sbe_jx_0 = vld1q_f32(&sb_e_x[j]); - float32x4_t sbe_jx_1 = vld1q_f32(&sb_e_x[j + 4]); - float32x4_t sbe_jy_0 = vld1q_f32(&sb_e_y[j]); - float32x4_t sbe_jy_1 = vld1q_f32(&sb_e_y[j + 4]); - float32x4_t sb_jsq_0 = vld1q_f32(&sb_sq[j]); - float32x4_t sb_jsq_1 = vld1q_f32(&sb_sq[j + 4]); - - // # 16 ADDS - float32x4_t r_ab_x_0 = vsubq_f32(pix, pjx_0); - float32x4_t r_ab_x_1 = vsubq_f32(pix, pjx_1); - float32x4_t r_ab_y_0 = vsubq_f32(piy, pjy_0); - float32x4_t r_ab_y_1 = vsubq_f32(piy, pjy_1); - - // # 8 ADDS, 16 MULTS - float32x4_t r_ab_n2_0 = vfmaq_f32(vmulq_f32(r_ab_y_0, r_ab_y_0), r_ab_x_0, r_ab_x_0); - float32x4_t r_ab_n2_1 = vfmaq_f32(vmulq_f32(r_ab_y_1, r_ab_y_1), r_ab_x_1, r_ab_x_1); - - r_ab_n2_0 = vmaxq_f32(r_ab_n2_0, v_eps_sq); - r_ab_n2_1 = vmaxq_f32(r_ab_n2_1, v_eps_sq); - - // # 8 ADD, 32 MULTS, 8 SQRT, 8 DIV - float32x4_t inv_r_ab_n_0 = _neon_rsqrt_ps(r_ab_n2_0); - float32x4_t inv_r_ab_n_1 = _neon_rsqrt_ps(r_ab_n2_1); - - // # 8 MULTS - float32x4_t r_ab_n_0 = vmulq_f32(r_ab_n2_0, inv_r_ab_n_0); - float32x4_t r_ab_n_1 = vmulq_f32(r_ab_n2_1, inv_r_ab_n_1); - - // # 16 ADDS - float32x4_t r_ab2_x_0 = vsubq_f32(r_ab_x_0, sbe_jx_0); - float32x4_t r_ab2_x_1 = vsubq_f32(r_ab_x_1, sbe_jx_1); - float32x4_t r_ab2_y_0 = vsubq_f32(r_ab_y_0, sbe_jy_0); - float32x4_t r_ab2_y_1 = vsubq_f32(r_ab_y_1, sbe_jy_1); - - // # 8 ADDS, 16 MULTS - float32x4_t r_ab2_n2_0 = vfmaq_f32(vmulq_f32(r_ab2_y_0, r_ab2_y_0), r_ab2_x_0, r_ab2_x_0); - float32x4_t r_ab2_n2_1 = vfmaq_f32(vmulq_f32(r_ab2_y_1, r_ab2_y_1), r_ab2_x_1, r_ab2_x_1); - - r_ab2_n2_0 = vmaxq_f32(r_ab2_n2_0, v_eps_sq); - r_ab2_n2_1 = vmaxq_f32(r_ab2_n2_1, v_eps_sq); - - // # 8 ADD, 32 MULTS, 8 SQRT, 8 DIV - float32x4_t inv_r_ab2_n_0 = _neon_rsqrt_ps(r_ab2_n2_0); - float32x4_t inv_r_ab2_n_1 = _neon_rsqrt_ps(r_ab2_n2_1); - - // # 8 MULTS - float32x4_t r_ab2_n_0 = vmulq_f32(r_ab2_n2_0, inv_r_ab2_n_0); - float32x4_t r_ab2_n_1 = vmulq_f32(r_ab2_n2_1, inv_r_ab2_n_1); - - // # 8 ADDS - float32x4_t r_sum_0 = vaddq_f32(r_ab_n_0, r_ab2_n_0); - float32x4_t r_sum_1 = vaddq_f32(r_ab_n_1, r_ab2_n_1); - - // # 8 ADDS, 8 MULTS - float32x4_t two_b_sq_0 = vsubq_f32(vmulq_f32(r_sum_0, r_sum_0), sb_jsq_0); - float32x4_t two_b_sq_1 = vsubq_f32(vmulq_f32(r_sum_1, r_sum_1), sb_jsq_1); - - two_b_sq_0 = vmaxq_f32(two_b_sq_0, v_eps_sq); - two_b_sq_1 = vmaxq_f32(two_b_sq_1, v_eps_sq); - - // # 8 ADD, 32 MULTS, 8 SQRT, 8 DIV - float32x4_t inv_two_b_0 = _neon_rsqrt_ps(two_b_sq_0); - float32x4_t inv_two_b_1 = _neon_rsqrt_ps(two_b_sq_1); - - // # 8 MULTS - float32x4_t two_b_0 = vmulq_f32(two_b_sq_0, inv_two_b_0); - float32x4_t two_b_1 = vmulq_f32(two_b_sq_1, inv_two_b_1); - - // # 8 MULTS - float32x4_t e_arg_0 = vmulq_f32(two_b_0, v_neg_2s_inv); - float32x4_t e_arg_1 = vmulq_f32(two_b_1, v_neg_2s_inv); - - e_arg_0 = vmaxq_f32(e_arg_0, v_exp_min); - e_arg_1 = vmaxq_f32(e_arg_1, v_exp_min); - - // # 128 MULTs, 112 ADDs - float32x4_t e_val_0 = _neon_exp_ps(e_arg_0); - float32x4_t e_val_1 = _neon_exp_ps(e_arg_1); - - // # 24 MULTS - float32x4_t numer_inv_two_b_0 = vmulq_f32(vmulq_f32(r_sum_0, v_neg_v0_div_2s), vmulq_f32(e_val_0, inv_two_b_0)); - float32x4_t numer_inv_two_b_1 = vmulq_f32(vmulq_f32(r_sum_1, v_neg_v0_div_2s), vmulq_f32(e_val_1, inv_two_b_1)); - - // # 16 MULTS - float32x4_t sm_r_ab_0 = vmulq_f32(numer_inv_two_b_0, inv_r_ab_n_0); - float32x4_t sm_r_ab_1 = vmulq_f32(numer_inv_two_b_1, inv_r_ab_n_1); - float32x4_t sm_r_ab2_0 = vmulq_f32(numer_inv_two_b_0, inv_r_ab2_n_0); - float32x4_t sm_r_ab2_1 = vmulq_f32(numer_inv_two_b_1, inv_r_ab2_n_1); - - // # 16 ADDS, 32 MULTS - float32x4_t f_x_0 = vfmaq_f32(vmulq_f32(r_ab_x_0, sm_r_ab_0), r_ab2_x_0, sm_r_ab2_0); - float32x4_t f_x_1 = vfmaq_f32(vmulq_f32(r_ab_x_1, sm_r_ab_1), r_ab2_x_1, sm_r_ab2_1); - float32x4_t f_y_0 = vfmaq_f32(vmulq_f32(r_ab_y_0, sm_r_ab_0), r_ab2_y_0, sm_r_ab2_0); - float32x4_t f_y_1 = vfmaq_f32(vmulq_f32(r_ab_y_1, sm_r_ab_1), r_ab2_y_1, sm_r_ab2_1); - - // # 8 ADDS, 16 MULTS - float32x4_t f_norm_sq_0 = vfmaq_f32(vmulq_f32(f_y_0, f_y_0), f_x_0, f_x_0); - float32x4_t f_norm_sq_1 = vfmaq_f32(vmulq_f32(f_y_1, f_y_1), f_x_1, f_x_1); - - // # 8 MULTS - float32x4_t rhs_0 = vmulq_f32(f_norm_sq_0, v_cos_phi_sq); - float32x4_t rhs_1 = vmulq_f32(f_norm_sq_1, v_cos_phi_sq); - - // # 8 ADDS, 16 MULTS - float32x4_t e_dot_f_0 = vfmaq_f32(vmulq_f32(eiy, f_y_0), eix, f_x_0); - float32x4_t e_dot_f_1 = vfmaq_f32(vmulq_f32(eiy, f_y_1), eix, f_x_1); - - // # 8 MULTS - float32x4_t e_dot_f_sq_0 = vmulq_f32(e_dot_f_0, e_dot_f_0); - float32x4_t e_dot_f_sq_1 = vmulq_f32(e_dot_f_1, e_dot_f_1); - - uint32x4_t c1_0 = vcltq_f32(e_dot_f_0, v_zero); - uint32x4_t c1_1 = vcltq_f32(e_dot_f_1, v_zero); - uint32x4_t c2_0 = vcgtq_f32(e_dot_f_sq_0, rhs_0); - uint32x4_t c2_1 = vcgtq_f32(e_dot_f_sq_1, rhs_1); - - uint32x4_t cond_0 = vandq_u32(c1_0, c2_0); - uint32x4_t cond_1 = vandq_u32(c1_1, c2_1); - - float32x4_t w_val_0 = vbslq_f32(cond_0, v_c_neg_dt, v_dt_neg); - float32x4_t w_val_1 = vbslq_f32(cond_1, v_c_neg_dt, v_dt_neg); - - float32x4_t f_x_safe_0 = vbslq_f32(active_0, f_x_0, v_zero); - float32x4_t f_x_safe_1 = vbslq_f32(active_1, f_x_1, v_zero); - float32x4_t f_y_safe_0 = vbslq_f32(active_0, f_y_0, v_zero); - float32x4_t f_y_safe_1 = vbslq_f32(active_1, f_y_1, v_zero); - - // # 16 ADDS, 16 MULTS - acc_x_0 = vfmaq_f32(acc_x_0, f_x_safe_0, w_val_0); - acc_x_1 = vfmaq_f32(acc_x_1, f_x_safe_1, w_val_1); - acc_y_0 = vfmaq_f32(acc_y_0, f_y_safe_0, w_val_0); - acc_y_1 = vfmaq_f32(acc_y_1, f_y_safe_1, w_val_1); - } - - // # 16 ADDS - f_alpha_dt_x += vaddvq_f32(vaddq_f32(acc_x_0, acc_x_1)); - f_alpha_dt_y += vaddvq_f32(vaddq_f32(acc_y_0, acc_y_1)); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - float v1_x = pos_x[i] - board.obstacles[k].start_x; - float v1_y = pos_y[i] - board.obstacles[k].start_y; - float v2_x = board.obstacles[k].obstacle_v_x; - float v2_y = board.obstacles[k].obstacle_v_y; - - // # 3 MULTs, 1 ADD - float projection = (v1_x * v2_x + v1_y * v2_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0f) - projection = 0.0f; - else if (projection > 1.0f) - projection = 1.0f; - - // # 4 ADDs, 2 MULTs - float r_aB_x = pos_x[i] - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - float r_aB_y = pos_y[i] - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - float r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - r_aB_norm = r_aB_norm > EPS ? r_aB_norm : EPS; - - // # 4 MULTs, 1 EXP, 1 DIV - float scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - float f_alpha_B_neg_x = r_aB_x * scalar_mult; - float f_alpha_B_neg_y = r_aB_y * scalar_mult; - - float w_val = dt_neg; - float e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y[i] : e_y[i]); - - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTS - float f_alpha_B_dt_x = f_alpha_B_neg_x * w_val; - float f_alpha_B_dt_y = f_alpha_B_neg_y * w_val; - - // # 2 ADDs - f_alpha_dt_x += f_alpha_B_dt_x; - f_alpha_dt_y += f_alpha_B_dt_y; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 4) { - - float32x4_t w_x_i_vec = vld1q_f32(&w_x[i]); - float32x4_t w_y_i_vec = vld1q_f32(&w_y[i]); - float32x4_t v_max_i_vec = vld1q_f32(&v_max[i]); - float32x4_t pos_x_i_vec = vld1q_f32(&pos_x[i]); - float32x4_t pos_y_i_vec = vld1q_f32(&pos_y[i]); - float32x4_t destination_y_i_vec = vld1q_f32(&destination_y[i]); - float32x4_t destination_x_i_vec = vld1q_f32(&destination_x[i]); - float32x4_t desired_v0_i_vec = vld1q_f32(&desired_v0[i]); - int32x4_t color_i_vec = vld1q_s32(&color[i]); - - // # 4 ADDS, 8 MULTS - float32x4_t w_norm_sq = vfmaq_f32(vmulq_f32(w_y_i_vec, w_y_i_vec), w_x_i_vec, w_x_i_vec); - - // # 4 ADD, 16 MULTS, 4 SQRT, 4 DIV - float32x4_t w_norm_inv = _neon_rsqrt_ps(w_norm_sq); - - // # 4 MULTS - float32x4_t correction_factor = vminq_f32(v_one, vmulq_f32(v_max_i_vec, w_norm_inv)); - - // # 8 MULTS - float32x4_t curr_vel_x_i_vec = vmulq_f32(w_x_i_vec, correction_factor); - float32x4_t curr_vel_y_i_vec = vmulq_f32(w_y_i_vec, correction_factor); - - const float32x4_t dt_vec = vdupq_n_f32(dt); - - // # 8 ADDS, 8 MULTS - pos_x_i_vec = vfmaq_f32(pos_x_i_vec, curr_vel_x_i_vec, dt_vec); - pos_y_i_vec = vfmaq_f32(pos_y_i_vec, curr_vel_y_i_vec, dt_vec); - - uint32x4_t cond_1_left = vceqq_s32(color_i_vec, vdupq_n_s32(0)); - uint32x4_t cond_1_right = vcgtq_f32(pos_x_i_vec, vdupq_n_f32(BOARD_LENGTH - 1.5f)); - uint32x4_t cond_1 = vandq_u32(cond_1_left, cond_1_right); - - pos_x_i_vec = vbslq_f32(cond_1, v_one, pos_x_i_vec); - destination_y_i_vec = vbslq_f32(cond_1, pos_y_i_vec, destination_y_i_vec); - w_x_i_vec = vbslq_f32(cond_1, desired_v0_i_vec, w_x_i_vec); - w_y_i_vec = vbslq_f32(cond_1, v_zero, w_y_i_vec); - curr_vel_x_i_vec = vbslq_f32(cond_1, w_x_i_vec, curr_vel_x_i_vec); - curr_vel_y_i_vec = vbslq_f32(cond_1, w_y_i_vec, curr_vel_y_i_vec); - - uint32x4_t cond_2_left = vceqq_s32(color_i_vec, vdupq_n_s32(1)); - uint32x4_t cond_2_right = vcltq_f32(pos_x_i_vec, vdupq_n_f32(1.5f)); - uint32x4_t cond_2 = vandq_u32(cond_2_left, cond_2_right); - - pos_x_i_vec = vbslq_f32(cond_2, vdupq_n_f32(BOARD_LENGTH - 1.0f), pos_x_i_vec); - destination_y_i_vec = vbslq_f32(cond_2, pos_y_i_vec, destination_y_i_vec); - - float32x4_t neg_desired_v0 = vnegq_f32(desired_v0_i_vec); - w_x_i_vec = vbslq_f32(cond_2, neg_desired_v0, w_x_i_vec); - w_y_i_vec = vbslq_f32(cond_2, v_zero, w_y_i_vec); - curr_vel_x_i_vec = vbslq_f32(cond_2, w_x_i_vec, curr_vel_x_i_vec); - curr_vel_y_i_vec = vbslq_f32(cond_2, w_y_i_vec, curr_vel_y_i_vec); - - pos_y_i_vec = vmaxq_f32(pos_y_i_vec, vdupq_n_f32(WALL_EPS)); - pos_y_i_vec = vminq_f32(pos_y_i_vec, vdupq_n_f32(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 8 ADDS - float32x4_t ex_vec = vsubq_f32(destination_x_i_vec, pos_x_i_vec); - float32x4_t ey_vec = vsubq_f32(destination_y_i_vec, pos_y_i_vec); - - // # 4 ADDS, 8 MULTS - float32x4_t e_norm_sq = vfmaq_f32(vmulq_f32(ey_vec, ey_vec), ex_vec, ex_vec); - - // # 4 ADD, 16 MULTS, 4 SQRT, 4 DIV - float32x4_t e_norm_inv = _neon_rsqrt_ps(e_norm_sq); - - // # 8 MULTS - float32x4_t e_x_i_vec = vmulq_f32(ex_vec, e_norm_inv); - float32x4_t e_y_i_vec = vmulq_f32(ey_vec, e_norm_inv); - - // # 4 ADDS, 8 MULTS - float32x4_t vel_norm_sq = vfmaq_f32(vmulq_f32(curr_vel_y_i_vec, curr_vel_y_i_vec), curr_vel_x_i_vec, curr_vel_x_i_vec); - - // # 4 MULTS - float32x4_t sb_sq_i_vec = vmulq_f32(vel_norm_sq, vdupq_n_f32(delta_t_sq)); - - // # 4 SQRT - float32x4_t vel_norm_dt = vsqrtq_f32(sb_sq_i_vec); // full-precision sqrt, matches AVX-512 - - vst1q_f32(&curr_vel_x[i], curr_vel_x_i_vec); - vst1q_f32(&curr_vel_y[i], curr_vel_y_i_vec); - vst1q_f32(&w_x[i], w_x_i_vec); - vst1q_f32(&w_y[i], w_y_i_vec); - vst1q_f32(&pos_x[i], pos_x_i_vec); - vst1q_f32(&pos_y[i], pos_y_i_vec); - vst1q_f32(&e_x[i], e_x_i_vec); - vst1q_f32(&e_y[i], e_y_i_vec); - vst1q_f32(&destination_y[i], destination_y_i_vec); - vst1q_f32(&sb_sq[i], sb_sq_i_vec); - - // # 8 MULTS - vst1q_f32(&sb_e_x[i], vmulq_f32(e_x_i_vec, vel_norm_dt)); - vst1q_f32(&sb_e_y[i], vmulq_f32(e_y_i_vec, vel_norm_dt)); - } - -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix.cpp b/variants/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt.cpp similarity index 100% rename from variants/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt_expfix.cpp rename to variants/variant_float_inlining_SoA_NEON_polyexp_morevect_ilp_2_rsqrt_morersqrt.cpp diff --git a/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp b/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp deleted file mode 100644 index cb3d8e3..0000000 --- a/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_expfix.cpp +++ /dev/null @@ -1,483 +0,0 @@ -// # Changes: -// # - Ported AVX2 to AVX-512 -// # - Replaced Obstacle with the version that contains no Vector2d -// # - Implemented Fast Inverse Square Root -// # Predecessor: variant_inlining_7_SoA_AVX2_polyexp.cpp - -#include "../headers/board_reduced.hpp" -#include "../headers/constants.hpp" -#include "../headers/pedestrian_reduced.hpp" - -#include - -#include -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0 -#define BOARD_LENGTH 50.0 -#define WALL_EPS 1e-3 -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999 - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { - -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 7) & ~7; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - double x = x_gen_left(gen); - double y = y_gen(gen); - - double dest_x = BOARD_LENGTH + 30.0; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int i = n_p_half; i < n_p; i++) { - double x = x_gen_right(gen); - double y = y_gen(gen); - - double dest_x = -30; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9; - pos_y[j] = 1e9; - sb_sq[j] = 0.0; - sb_e_x[j] = 0.0; - sb_e_y[j] = 0.0; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 128 MULTs, 112 ADDs -static inline __m512d _avx512_exp_pd(__m512d x) { - - const __m512d log2e = _mm512_set1_pd(1.4426950408889634); - - // # 8 MULTs - __m512d nf = _mm512_roundscale_pd(_mm512_mul_pd(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - const __m512d ln2 = _mm512_set1_pd(0.6931471805599453); - - // # 8 MULTs, 8 ADDs - __m512d r = _mm512_fnmadd_pd(nf, ln2, x); - - const __m512d c13 = _mm512_set1_pd(c13_scalar); - const __m512d c12 = _mm512_set1_pd(c12_scalar); - const __m512d c11 = _mm512_set1_pd(c11_scalar); - const __m512d c10 = _mm512_set1_pd(c10_scalar); - const __m512d c9 = _mm512_set1_pd(c9_scalar); - const __m512d c8 = _mm512_set1_pd(c8_scalar); - const __m512d c7 = _mm512_set1_pd(c7_scalar); - const __m512d c6 = _mm512_set1_pd(c6_scalar); - const __m512d c5 = _mm512_set1_pd(c5_scalar); - const __m512d c4 = _mm512_set1_pd(c4_scalar); - const __m512d c3 = _mm512_set1_pd(c3_scalar); - const __m512d c2 = _mm512_set1_pd(c2_scalar); - const __m512d c1 = _mm512_set1_pd(c1_scalar); - const __m512d c0 = _mm512_set1_pd(c0_scalar); - - __m512d p = c13; - - // # 104 MULTs, 104 ADDs - p = _mm512_fmadd_pd(p, r, c12); - p = _mm512_fmadd_pd(p, r, c11); - p = _mm512_fmadd_pd(p, r, c10); - p = _mm512_fmadd_pd(p, r, c9); - p = _mm512_fmadd_pd(p, r, c8); - p = _mm512_fmadd_pd(p, r, c7); - p = _mm512_fmadd_pd(p, r, c6); - p = _mm512_fmadd_pd(p, r, c5); - p = _mm512_fmadd_pd(p, r, c4); - p = _mm512_fmadd_pd(p, r, c3); - p = _mm512_fmadd_pd(p, r, c2); - p = _mm512_fmadd_pd(p, r, c1); - p = _mm512_fmadd_pd(p, r, c0); - - __m256d nf_lo = _mm512_castpd512_pd256(nf); - __m256d nf_hi = _mm512_extractf64x4_pd(nf, 1); - - __m128i ni32_lo = _mm256_cvtpd_epi32(nf_lo); - __m128i ni32_hi = _mm256_cvtpd_epi32(nf_hi); - - __m256i ni64_lo = _mm256_cvtepi32_epi64(ni32_lo); - __m256i ni64_hi = _mm256_cvtepi32_epi64(ni32_hi); - - __m512i ni64 = _mm512_inserti64x4(_mm512_castsi256_si512(ni64_lo), ni64_hi, 1); - - __m512i biased = _mm512_add_epi64(ni64, _mm512_set1_epi64(1023)); - - __m512i scaled = _mm512_slli_epi64(biased, 52); - - __m512d pow2n = _mm512_castsi512_pd(scaled); - - // # 8 MULTs - return _mm512_mul_pd(p, pow2n); -} - -static inline double fast_inv_sqrt(double number) { - double y = number; - - uint64_t i = bit_cast(y); - - i = 0x5fe6eb50c7b537a9ULL - (i >> 1); - - y = bit_cast(i); - - double x2 = number * 0.5; - y = y * (1.5 - (x2 * y * y)); - y = y * (1.5 - (x2 * y * y)); - y = y * (1.5 - (x2 * y * y)); - - return y; -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 7) & ~7; - - alignas(64) constexpr double lane_offset_arr[8] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; - const __m512d lane_off = _mm512_load_pd(lane_offset_arr); - const __m512d v_neg_v0_div_2s = _mm512_set1_pd(NEG_V0_AB_div_TWO_SIGMA); - const __m512d v_neg_2s_inv = _mm512_set1_pd(NEG_TWO_SIGMA_INV); - const __m512d v_cos_phi_inv = _mm512_set1_pd(cos_phi_inv); - const __m512d v_dt_neg = _mm512_set1_pd(dt_neg); - const __m512d v_c_neg_dt = _mm512_set1_pd(c_neg_times_dt); - const __m512d v_zero = _mm512_setzero_pd(); - - const __m512d v_np = _mm512_set1_pd(n_p); - - // # ADDs: n_iter * n_p * 33 + - // # n_iter * n_p * (n_p_pad / 8) * 232 + - // # n_iter * n_p * board.n_obstacles * 10 - - // # MULTs: n_iter * n_p * 40 + - // # n_iter * n_p * (n_p_pad / 8) * 320 + - // # n_iter * n_p * board.n_obstacles * 13 - - // # DIVs: n_iter * n_p * (n_p_pad / 8) * 8 + - // # n_iter * n_p * board.n_obstacles - - // # SQRTs: n_iter * n_p + - // # n_iter * n_p * (n_p_pad / 8) * 24 + - // # n_iter * n_p * board.n_obstacles - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - - for (int i = 0; i < n_p; i++) { - double pos_x_i = pos_x[i]; - double pos_y_i = pos_y[i]; - double e_x_i = e_x[i]; - double e_y_i = e_y[i]; - double desired_v0_i = desired_v0[i]; - double curr_vel_x_i = curr_vel_x[i]; - double curr_vel_y_i = curr_vel_y[i]; - - double f_alpha_dt_x = (e_x_i * desired_v0_i - curr_vel_x_i) * dt_times_tau_alpha_inv; - double f_alpha_dt_y = (e_y_i * desired_v0_i - curr_vel_y_i) * dt_times_tau_alpha_inv; - - const __m512d pix = _mm512_set1_pd(pos_x_i); - const __m512d piy = _mm512_set1_pd(pos_y_i); - const __m512d eix = _mm512_set1_pd(e_x_i); - const __m512d eiy = _mm512_set1_pd(e_y_i); - const __m512d v_i = _mm512_set1_pd((double)i); - - __m512d acc_x = _mm512_setzero_pd(); - __m512d acc_y = _mm512_setzero_pd(); - - for (int j = 0; j < n_p_pad; j += 8) { - __m512d j_idx = _mm512_add_pd(_mm512_set1_pd((double)j), lane_off); - - __mmask8 m_neq_i = _mm512_cmp_pd_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask8 m_in_range = _mm512_cmp_pd_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask8 active = m_neq_i & m_in_range; - - __m512d pjx = _mm512_loadu_pd(&pos_x[j]); - __m512d pjy = _mm512_loadu_pd(&pos_y[j]); - __m512d sbe_jx = _mm512_loadu_pd(&sb_e_x[j]); - __m512d sbe_jy = _mm512_loadu_pd(&sb_e_y[j]); - __m512d sb_jsq = _mm512_loadu_pd(&sb_sq[j]); - - __m512d r_ab_x = _mm512_sub_pd(pix, pjx); - __m512d r_ab_y = _mm512_sub_pd(piy, pjy); - __m512d r_ab_n2 = _mm512_fmadd_pd(r_ab_x, r_ab_x, _mm512_mul_pd(r_ab_y, r_ab_y)); - __m512d r_ab_n = _mm512_sqrt_pd(r_ab_n2); - - __m512d r_ab2_x = _mm512_sub_pd(r_ab_x, sbe_jx); - __m512d r_ab2_y = _mm512_sub_pd(r_ab_y, sbe_jy); - __m512d r_ab2_n2 = _mm512_fmadd_pd(r_ab2_x, r_ab2_x, _mm512_mul_pd(r_ab2_y, r_ab2_y)); - __m512d r_ab2_n = _mm512_sqrt_pd(r_ab2_n2); - - __m512d r_sum = _mm512_add_pd(r_ab_n, r_ab2_n); - __m512d two_b_sq = _mm512_fmsub_pd(r_sum, r_sum, sb_jsq); - __m512d two_b = _mm512_sqrt_pd(two_b_sq); - - __m512d e_arg = _mm512_mul_pd(two_b, v_neg_2s_inv); - __m512d e_val = _avx512_exp_pd(e_arg); - - __m512d numer = _mm512_mul_pd(_mm512_mul_pd(r_sum, v_neg_v0_div_2s), e_val); - __m512d denom = _mm512_mul_pd(_mm512_mul_pd(two_b, r_ab_n), r_ab2_n); - __m512d denom_safe = _mm512_mask_blend_pd(active, _mm512_set1_pd(1.0), denom); - __m512d smc = _mm512_div_pd(numer, denom_safe); - - __m512d sm_r_ab = _mm512_mul_pd(smc, r_ab2_n); - __m512d sm_r_ab2 = _mm512_mul_pd(smc, r_ab_n); - - __m512d f_x = _mm512_fmadd_pd(r_ab2_x, sm_r_ab2, _mm512_mul_pd(r_ab_x, sm_r_ab)); - __m512d f_y = _mm512_fmadd_pd(r_ab2_y, sm_r_ab2, _mm512_mul_pd(r_ab_y, sm_r_ab)); - - __m512d a = _mm512_mul_pd(_mm512_fmadd_pd(eix, f_x, _mm512_mul_pd(eiy, f_y)), v_cos_phi_inv); - __m512d a_sq = _mm512_mul_pd(a, a); - __m512d b_sq = _mm512_fmadd_pd(f_x, f_x, _mm512_mul_pd(f_y, f_y)); - - __mmask8 k_ge = _mm512_cmp_pd_mask(a, v_zero, _CMP_GE_OQ); - __mmask8 k_gt = _mm512_cmp_pd_mask(a_sq, b_sq, _CMP_GT_OQ); - __mmask8 k_cond = _mm512_kand(k_ge, k_gt); - __m512d w_val = _mm512_mask_blend_pd(k_cond, v_dt_neg, v_c_neg_dt); - - __m512d f_x_safe = _mm512_maskz_mov_pd(active, f_x); - __m512d f_y_safe = _mm512_maskz_mov_pd(active, f_y); - acc_x = _mm512_fmadd_pd(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_pd(f_y_safe, w_val, acc_y); - } - - f_alpha_dt_x += _mm512_reduce_add_pd(acc_x); - f_alpha_dt_y += _mm512_reduce_add_pd(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - double v1_x = pos_x_i - board.obstacles[k].start_x; - double v1_y = pos_y_i - board.obstacles[k].start_y; - - double projection = (v1_x * board.obstacles[k].obstacle_v_x + v1_y * board.obstacles[k].obstacle_v_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0) - projection = 0.0; - else if (projection > 1.0) - projection = 1.0; - - double r_aB_x = pos_x_i - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - double r_aB_y = pos_y_i - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - double r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - double scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - double f_alpha_B_neg_x = r_aB_x * scalar_mult; - double f_alpha_B_neg_y = r_aB_y * scalar_mult; - - double w_val = dt_neg; - double e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y_i : e_y_i); - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - f_alpha_dt_x += f_alpha_B_neg_x * w_val; - f_alpha_dt_y += f_alpha_B_neg_y * w_val; - } - - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p; i++) { - double w_norm_inv = fast_inv_sqrt(w_x[i] * w_x[i] + w_y[i] * w_y[i]); - - double correction_factor = min(1.0, v_max[i] * w_norm_inv); - - curr_vel_x[i] = w_x[i] * correction_factor; - curr_vel_y[i] = w_y[i] * correction_factor; - - pos_x[i] = pos_x[i] + curr_vel_x[i] * dt; - pos_y[i] = pos_y[i] + curr_vel_y[i] * dt; - - if (!color[i] && pos_x[i] > (BOARD_LENGTH - 1.5)) { - pos_x[i] = 1.0; - destination_y[i] = pos_y[i]; - w_x[i] = desired_v0[i]; - w_y[i] = 0.0; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - if (color[i] && pos_x[i] < 1.5) { - pos_x[i] = BOARD_LENGTH - 1.0; - destination_y[i] = pos_y[i]; - w_x[i] = -desired_v0[i]; - w_y[i] = 0.0; - curr_vel_x[i] = w_x[i]; - curr_vel_y[i] = w_y[i]; - } - - pos_y[i] = clamp(pos_y[i], WALL_EPS, BOARD_WIDTH_MINUS_WALL_EPS); - - double ex = destination_x[i] - pos_x[i]; - double ey = destination_y[i] - pos_y[i]; - - double e_norm_inv = fast_inv_sqrt(ex * ex + ey * ey); - - e_x[i] = ex * e_norm_inv; - e_y[i] = ey * e_norm_inv; - - double velocity_norm_sq = curr_vel_x[i] * curr_vel_x[i] + curr_vel_y[i] * curr_vel_y[i]; - double sb_sq_i = velocity_norm_sq * delta_t_sq; - double velocity_norm_mul_delta_t = sqrt(sb_sq_i); - - sb_sq[i] = sb_sq_i; - - sb_e_x[i] = e_x[i] * velocity_norm_mul_delta_t; - sb_e_y[i] = e_y[i] * velocity_norm_mul_delta_t; - -#if !BENCHMARK - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } -#endif - } - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp b/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp deleted file mode 100644 index c621275..0000000 --- a/variants/variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt_sr_expfix.cpp +++ /dev/null @@ -1,576 +0,0 @@ -// # Changes: Performed Scalar Replacements -// # Predecessor: variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt.cpp - -#include "../headers/board_reduced.hpp" -#include "../headers/constants.hpp" -#include "../headers/pedestrian_reduced.hpp" - -#include - -#include -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0 -#define BOARD_LENGTH 50.0 -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0 -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5 -#define WALL_EPS 1e-3 -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999 - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { - -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 7) & ~7; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - double x = x_gen_left(gen); - double y = y_gen(gen); - - double dest_x = BOARD_LENGTH + 30.0; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int i = n_p_half; i < n_p; i++) { - double x = x_gen_right(gen); - double y = y_gen(gen); - - double dest_x = -30; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9; - pos_y[j] = 1e9; - sb_sq[j] = 0.0; - sb_e_x[j] = 0.0; - sb_e_y[j] = 0.0; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 128 MULTs, 112 ADDs -static inline __m512d _avx512_exp_pd(__m512d x) { - - const __m512d log2e = _mm512_set1_pd(1.4426950408889634); - - // # 8 MULTs - __m512d nf = _mm512_roundscale_pd(_mm512_mul_pd(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - const __m512d ln2 = _mm512_set1_pd(0.6931471805599453); - - // # 8 MULTs, 8 ADDs - __m512d r = _mm512_fnmadd_pd(nf, ln2, x); - - const __m512d c13 = _mm512_set1_pd(c13_scalar); - const __m512d c12 = _mm512_set1_pd(c12_scalar); - const __m512d c11 = _mm512_set1_pd(c11_scalar); - const __m512d c10 = _mm512_set1_pd(c10_scalar); - const __m512d c9 = _mm512_set1_pd(c9_scalar); - const __m512d c8 = _mm512_set1_pd(c8_scalar); - const __m512d c7 = _mm512_set1_pd(c7_scalar); - const __m512d c6 = _mm512_set1_pd(c6_scalar); - const __m512d c5 = _mm512_set1_pd(c5_scalar); - const __m512d c4 = _mm512_set1_pd(c4_scalar); - const __m512d c3 = _mm512_set1_pd(c3_scalar); - const __m512d c2 = _mm512_set1_pd(c2_scalar); - const __m512d c1 = _mm512_set1_pd(c1_scalar); - const __m512d c0 = _mm512_set1_pd(c0_scalar); - - __m512d p = c13; - - // # 104 MULTs, 104 ADDs - p = _mm512_fmadd_pd(p, r, c12); - p = _mm512_fmadd_pd(p, r, c11); - p = _mm512_fmadd_pd(p, r, c10); - p = _mm512_fmadd_pd(p, r, c9); - p = _mm512_fmadd_pd(p, r, c8); - p = _mm512_fmadd_pd(p, r, c7); - p = _mm512_fmadd_pd(p, r, c6); - p = _mm512_fmadd_pd(p, r, c5); - p = _mm512_fmadd_pd(p, r, c4); - p = _mm512_fmadd_pd(p, r, c3); - p = _mm512_fmadd_pd(p, r, c2); - p = _mm512_fmadd_pd(p, r, c1); - p = _mm512_fmadd_pd(p, r, c0); - - __m256d nf_lo = _mm512_castpd512_pd256(nf); - __m256d nf_hi = _mm512_extractf64x4_pd(nf, 1); - - __m128i ni32_lo = _mm256_cvtpd_epi32(nf_lo); - __m128i ni32_hi = _mm256_cvtpd_epi32(nf_hi); - - __m256i ni64_lo = _mm256_cvtepi32_epi64(ni32_lo); - __m256i ni64_hi = _mm256_cvtepi32_epi64(ni32_hi); - - __m512i ni64 = _mm512_inserti64x4(_mm512_castsi256_si512(ni64_lo), ni64_hi, 1); - - __m512i biased = _mm512_add_epi64(ni64, _mm512_set1_epi64(1023)); - - __m512i scaled = _mm512_slli_epi64(biased, 52); - - __m512d pow2n = _mm512_castsi512_pd(scaled); - - // # 8 MULTs - return _mm512_mul_pd(p, pow2n); -} - -// # 10 MULTs, 3 ADDs -static inline double fast_inv_sqrt(double number) { - double y = number; - - uint64_t i = bit_cast(y); - - i = 0x5fe6eb50c7b537a9ULL - (i >> 1); - - y = bit_cast(i); - - double x2 = number * 0.5; - y = y * (1.5 - (x2 * y * y)); - y = y * (1.5 - (x2 * y * y)); - y = y * (1.5 - (x2 * y * y)); - - return y; -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 7) & ~7; - - alignas(64) constexpr double lane_offset_arr[8] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; - const __m512d lane_off = _mm512_load_pd(lane_offset_arr); - const __m512d v_neg_v0_div_2s = _mm512_set1_pd(NEG_V0_AB_div_TWO_SIGMA); - const __m512d v_neg_2s_inv = _mm512_set1_pd(NEG_TWO_SIGMA_INV); - const __m512d v_cos_phi_inv = _mm512_set1_pd(cos_phi_inv); - const __m512d v_dt_neg = _mm512_set1_pd(dt_neg); - const __m512d v_c_neg_dt = _mm512_set1_pd(c_neg_times_dt); - const __m512d v_zero = _mm512_setzero_pd(); - - const __m512d v_np = _mm512_set1_pd(n_p); - - // # ADDs: n_iter * n_p * 33 + - // # n_iter * n_p * (n_p_pad / 8) * 232 + - // # n_iter * n_p * board.n_obstacles * 10 - - // # MULTs: n_iter * n_p * 40 + - // # n_iter * n_p * (n_p_pad / 8) * 320 + - // # n_iter * n_p * board.n_obstacles * 13 - - // # DIVs: n_iter * n_p * (n_p_pad / 8) * 8 + - // # n_iter * n_p * board.n_obstacles - - // # SQRTs: n_iter * n_p + - // # n_iter * n_p * (n_p_pad / 8) * 24 + - // # n_iter * n_p * board.n_obstacles - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - for (int i = 0; i < n_p; i++) { - - double pos_x_i = pos_x[i]; - double pos_y_i = pos_y[i]; - double e_x_i = e_x[i]; - double e_y_i = e_y[i]; - double desired_v0_i = desired_v0[i]; - double curr_vel_x_i = curr_vel_x[i]; - double curr_vel_y_i = curr_vel_y[i]; - - // # 4 MULTs, 2 ADDs - double f_alpha_dt_x = (e_x_i * desired_v0_i - curr_vel_x_i) * dt_times_tau_alpha_inv; - double f_alpha_dt_y = (e_y_i * desired_v0_i - curr_vel_y_i) * dt_times_tau_alpha_inv; - - const __m512d pix = _mm512_set1_pd(pos_x_i); - const __m512d piy = _mm512_set1_pd(pos_y_i); - const __m512d eix = _mm512_set1_pd(e_x_i); - const __m512d eiy = _mm512_set1_pd(e_y_i); - const __m512d v_i = _mm512_set1_pd((double)i); - - __m512d acc_x = _mm512_setzero_pd(); - __m512d acc_y = _mm512_setzero_pd(); - - for (int j = 0; j < n_p_pad; j += 8) { - - // # 8 ADDs - __m512d j_idx = _mm512_add_pd(_mm512_set1_pd((double)j), lane_off); - - __mmask8 m_neq_i = _mm512_cmp_pd_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask8 m_in_range = _mm512_cmp_pd_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask8 active = m_neq_i & m_in_range; - - __m512d pjx = _mm512_loadu_pd(&pos_x[j]); - __m512d pjy = _mm512_loadu_pd(&pos_y[j]); - __m512d sbe_jx = _mm512_loadu_pd(&sb_e_x[j]); - __m512d sbe_jy = _mm512_loadu_pd(&sb_e_y[j]); - __m512d sb_jsq = _mm512_loadu_pd(&sb_sq[j]); - - // # 16 ADDs - __m512d r_ab_x = _mm512_sub_pd(pix, pjx); - __m512d r_ab_y = _mm512_sub_pd(piy, pjy); - - // # 16 MULTs, 8 ADDs - __m512d r_ab_n2 = _mm512_fmadd_pd(r_ab_x, r_ab_x, _mm512_mul_pd(r_ab_y, r_ab_y)); - - // # 8 SQRTs - __m512d r_ab_n = _mm512_sqrt_pd(r_ab_n2); - - // # 16 ADDs - __m512d r_ab2_x = _mm512_sub_pd(r_ab_x, sbe_jx); - __m512d r_ab2_y = _mm512_sub_pd(r_ab_y, sbe_jy); - - // # 16 MULTs, 8 ADDs - __m512d r_ab2_n2 = _mm512_fmadd_pd(r_ab2_x, r_ab2_x, _mm512_mul_pd(r_ab2_y, r_ab2_y)); - - // # 8 SQRTs - __m512d r_ab2_n = _mm512_sqrt_pd(r_ab2_n2); - - // # 8 ADDs - __m512d r_sum = _mm512_add_pd(r_ab_n, r_ab2_n); - - // # 8 MULTs, 8 ADDs - __m512d two_b_sq = _mm512_fmsub_pd(r_sum, r_sum, sb_jsq); - - // # 8 SQRTs - __m512d two_b = _mm512_sqrt_pd(two_b_sq); - - // # 8 MULTs - __m512d e_arg = _mm512_mul_pd(two_b, v_neg_2s_inv); - - // # 128 MULTs, 112 ADDs - __m512d e_val = _avx512_exp_pd(e_arg); - - // # 32 MULTs - __m512d numer = _mm512_mul_pd(_mm512_mul_pd(r_sum, v_neg_v0_div_2s), e_val); - __m512d denom = _mm512_mul_pd(_mm512_mul_pd(two_b, r_ab_n), r_ab2_n); - - __m512d denom_safe = _mm512_mask_blend_pd(active, _mm512_set1_pd(1.0), denom); - - // # 8 DIVs - __m512d smc = _mm512_div_pd(numer, denom_safe); - - // # 16 MULTs - __m512d sm_r_ab = _mm512_mul_pd(smc, r_ab2_n); - __m512d sm_r_ab2 = _mm512_mul_pd(smc, r_ab_n); - - // # 32 MULTs, 16 ADDs - __m512d f_x = _mm512_fmadd_pd(r_ab2_x, sm_r_ab2, _mm512_mul_pd(r_ab_x, sm_r_ab)); - __m512d f_y = _mm512_fmadd_pd(r_ab2_y, sm_r_ab2, _mm512_mul_pd(r_ab_y, sm_r_ab)); - - // # 24 MULTs, 8 ADDs - __m512d a = _mm512_mul_pd(_mm512_fmadd_pd(eix, f_x, _mm512_mul_pd(eiy, f_y)), v_cos_phi_inv); - - // # 8 MULTs - __m512d a_sq = _mm512_mul_pd(a, a); - - // # 16 MULTs, 8 ADDs - __m512d b_sq = _mm512_fmadd_pd(f_x, f_x, _mm512_mul_pd(f_y, f_y)); - - __mmask8 k_ge = _mm512_cmp_pd_mask(a, v_zero, _CMP_GE_OQ); - __mmask8 k_gt = _mm512_cmp_pd_mask(a_sq, b_sq, _CMP_GT_OQ); - __mmask8 k_cond = _mm512_kand(k_ge, k_gt); - __m512d w_val = _mm512_mask_blend_pd(k_cond, v_dt_neg, v_c_neg_dt); - - __m512d f_x_safe = _mm512_maskz_mov_pd(active, f_x); - __m512d f_y_safe = _mm512_maskz_mov_pd(active, f_y); - - // # 16 MULTs, 16 ADDs - acc_x = _mm512_fmadd_pd(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_pd(f_y_safe, w_val, acc_y); - } - - // # 16 ADDs - f_alpha_dt_x += _mm512_reduce_add_pd(acc_x); - f_alpha_dt_y += _mm512_reduce_add_pd(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - double obs_start_x = board.obstacles[k].start_x; - double obs_start_y = board.obstacles[k].start_y; - double obs_v_x = board.obstacles[k].obstacle_v_x; - double obs_v_y = board.obstacles[k].obstacle_v_y; - double obs_length_sq_inv = board.obstacles[k].length_sq_inv; - - // # 2 ADDs - double v1_x = pos_x_i - obs_start_x; - double v1_y = pos_y_i - obs_start_y; - - // # 3 MULTs, 1 ADD - double projection = (v1_x * obs_v_x + v1_y * obs_v_y) * obs_length_sq_inv; - - if (projection < 0.0) - projection = 0.0; - else if (projection > 1.0) - projection = 1.0; - - // # 2 MULTs, 4 ADDs - double r_aB_x = pos_x_i - (obs_start_x + obs_v_x * projection); - double r_aB_y = pos_y_i - (obs_start_y + obs_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - double r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - - // # 2 MULTs, 1 EXP, 1 DIV - double scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - - // # 2 MULTs - double f_alpha_B_neg_x = r_aB_x * scalar_mult; - double f_alpha_B_neg_y = r_aB_y * scalar_mult; - - double w_val = dt_neg; - double e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y_i : e_y_i); - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs, 2 ADDs - f_alpha_dt_x += f_alpha_B_neg_x * w_val; - f_alpha_dt_y += f_alpha_B_neg_y * w_val; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p; i++) { - - double color_i = color[i]; - double curr_vel_x_i = curr_vel_x[i]; - double curr_vel_y_i = curr_vel_y[i]; - double w_x_i = w_x[i]; - double w_y_i = w_y[i]; - double pos_x_i = pos_x[i]; - double pos_y_i = pos_y[i]; - double e_x_i = e_x[i]; - double e_y_i = e_y[i]; - double v_max_i = v_max[i]; - double desired_v0_i = desired_v0[i]; - double destination_x_i = destination_x[i]; - double destination_y_i = destination_y[i]; - - // # 12 MULTs, 4 ADDs - double w_norm_inv = fast_inv_sqrt(w_x_i * w_x_i + w_y_i * w_y_i); - - // # 1 MULT - double correction_factor = min(1.0, v_max_i * w_norm_inv); - - // # 2 MULTs - curr_vel_x_i = w_x_i * correction_factor; - curr_vel_y_i = w_y_i * correction_factor; - - // # 2 MULTs, 2 ADDs - pos_x_i = pos_x_i + curr_vel_x_i * dt; - pos_y_i = pos_y_i + curr_vel_y_i * dt; - - if (!color_i && pos_x_i > (BOARD_LENGTH_MINUS_ONE_POINT_FIVE)) { - pos_x_i = 1.0; - destination_y_i = pos_y_i; - w_x_i = desired_v0_i; - w_y_i = 0.0; - curr_vel_x_i = w_x_i; - curr_vel_y_i = w_y_i; - } - if (color_i && pos_x_i < 1.5) { - pos_x_i = BOARD_LENGTH_MINUS_ONE; - destination_y_i = pos_y_i; - w_x_i = -desired_v0_i; - w_y_i = 0.0; - curr_vel_x_i = w_x_i; - curr_vel_y_i = w_y_i; - } - - pos_y_i = clamp(pos_y_i, WALL_EPS, BOARD_WIDTH_MINUS_WALL_EPS); - - // # 2 ADDs - double ex = destination_x_i - pos_x_i; - double ey = destination_y_i - pos_y_i; - - // # 12 MULTs, 4 ADDs - double e_norm_inv = fast_inv_sqrt(ex * ex + ey * ey); - - // # 2 MULTs - e_x_i = ex * e_norm_inv; - e_y_i = ey * e_norm_inv; - - // # 2 MULTs, 1 ADD - double velocity_norm_sq = curr_vel_x_i * curr_vel_x_i + curr_vel_y_i * curr_vel_y_i; - - // # 1 MULT - double sb_sq_i = velocity_norm_sq * delta_t_sq; - - // # 1 SQRT - double velocity_norm_mul_delta_t = sqrt(sb_sq_i); - - curr_vel_x[i] = curr_vel_x_i; - curr_vel_y[i] = curr_vel_y_i; - - w_x[i] = w_x_i; - w_y[i] = w_y_i; - - pos_x[i] = pos_x_i; - pos_y[i] = pos_y_i; - - e_x[i] = e_x_i; - e_y[i] = e_y_i; - - destination_y[i] = destination_y_i; - - sb_sq[i] = sb_sq_i; - - // # 2 MULTs - sb_e_x[i] = e_x_i * velocity_norm_mul_delta_t; - sb_e_y[i] = e_y_i * velocity_norm_mul_delta_t; - -#if !BENCHMARK - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } -#endif - } - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp b/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp deleted file mode 100644 index 7b51d9a..0000000 --- a/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_expfix.cpp +++ /dev/null @@ -1,563 +0,0 @@ -// # Changes: Vectorised second pass with AVX-512 -// # Predecessor: variant_inlining_8_SoA_AVX512_polyexp_fastinvsqrt.cpp - -#include "../headers/board_reduced.hpp" -#include "../headers/constants.hpp" -#include "../headers/pedestrian_reduced.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0 -#define BOARD_LENGTH 50.0 -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0 -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5 -#define WALL_EPS 1e-3 -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999 - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { - -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 7) & ~7; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - double x = x_gen_left(gen); - double y = y_gen(gen); - - double dest_x = BOARD_LENGTH + 30.0; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int i = n_p_half; i < n_p; i++) { - double x = x_gen_right(gen); - double y = y_gen(gen); - - double dest_x = -30; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9; - pos_y[j] = 1e9; - sb_sq[j] = 0.0; - sb_e_x[j] = 0.0; - sb_e_y[j] = 0.0; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 128 MULTs, 112 ADDs -static inline __m512d _avx512_exp_pd(__m512d x) { - - const __m512d log2e = _mm512_set1_pd(1.4426950408889634); - - // # 8 MULTs - __m512d nf = _mm512_roundscale_pd(_mm512_mul_pd(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - const __m512d ln2 = _mm512_set1_pd(0.6931471805599453); - - // # 8 MULTs, 8 ADDs - __m512d r = _mm512_fnmadd_pd(nf, ln2, x); - - const __m512d c13 = _mm512_set1_pd(c13_scalar); - const __m512d c12 = _mm512_set1_pd(c12_scalar); - const __m512d c11 = _mm512_set1_pd(c11_scalar); - const __m512d c10 = _mm512_set1_pd(c10_scalar); - const __m512d c9 = _mm512_set1_pd(c9_scalar); - const __m512d c8 = _mm512_set1_pd(c8_scalar); - const __m512d c7 = _mm512_set1_pd(c7_scalar); - const __m512d c6 = _mm512_set1_pd(c6_scalar); - const __m512d c5 = _mm512_set1_pd(c5_scalar); - const __m512d c4 = _mm512_set1_pd(c4_scalar); - const __m512d c3 = _mm512_set1_pd(c3_scalar); - const __m512d c2 = _mm512_set1_pd(c2_scalar); - const __m512d c1 = _mm512_set1_pd(c1_scalar); - const __m512d c0 = _mm512_set1_pd(c0_scalar); - - __m512d p = c13; - - // # 104 MULTs, 104 ADDs - p = _mm512_fmadd_pd(p, r, c12); - p = _mm512_fmadd_pd(p, r, c11); - p = _mm512_fmadd_pd(p, r, c10); - p = _mm512_fmadd_pd(p, r, c9); - p = _mm512_fmadd_pd(p, r, c8); - p = _mm512_fmadd_pd(p, r, c7); - p = _mm512_fmadd_pd(p, r, c6); - p = _mm512_fmadd_pd(p, r, c5); - p = _mm512_fmadd_pd(p, r, c4); - p = _mm512_fmadd_pd(p, r, c3); - p = _mm512_fmadd_pd(p, r, c2); - p = _mm512_fmadd_pd(p, r, c1); - p = _mm512_fmadd_pd(p, r, c0); - - __m256d nf_lo = _mm512_castpd512_pd256(nf); - __m256d nf_hi = _mm512_extractf64x4_pd(nf, 1); - - __m128i ni32_lo = _mm256_cvtpd_epi32(nf_lo); - __m128i ni32_hi = _mm256_cvtpd_epi32(nf_hi); - - __m256i ni64_lo = _mm256_cvtepi32_epi64(ni32_lo); - __m256i ni64_hi = _mm256_cvtepi32_epi64(ni32_hi); - - __m512i ni64 = _mm512_inserti64x4(_mm512_castsi256_si512(ni64_lo), ni64_hi, 1); - - __m512i biased = _mm512_add_epi64(ni64, _mm512_set1_epi64(1023)); - - __m512i scaled = _mm512_slli_epi64(biased, 52); - - __m512d pow2n = _mm512_castsi512_pd(scaled); - - // # 8 MULTs - return _mm512_mul_pd(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 7) & ~7; - - alignas(64) constexpr double lane_offset_arr[8] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; - const __m512d lane_off = _mm512_load_pd(lane_offset_arr); - const __m512d v_neg_v0_div_2s = _mm512_set1_pd(NEG_V0_AB_div_TWO_SIGMA); - const __m512d v_neg_2s_inv = _mm512_set1_pd(NEG_TWO_SIGMA_INV); - const __m512d v_cos_phi_inv = _mm512_set1_pd(cos_phi_inv); - const __m512d v_dt_neg = _mm512_set1_pd(dt_neg); - const __m512d v_c_neg_dt = _mm512_set1_pd(c_neg_times_dt); - const __m512d v_zero = _mm512_setzero_pd(); - - const __m512d v_np = _mm512_set1_pd(n_p); - - // # ADDs: n_iter * n_p * 20 + - // # n_iter * n_p * (n_p_pad / 8) * 232 + - // # n_iter * n_p * board.n_obstacles * 10 + - // # n_iter * (n_p_pad / 8) * 56 - - // # MULTs: n_iter * n_p * 4 + - // # n_iter * n_p * (n_p_pad / 8) * 320 + - // # n_iter * n_p * board.n_obstacles * 13 + - // # n_iter * (n_p_pad / 8) * 120 - - // # DIVs: n_iter * n_p * (n_p_pad / 8) * 8 + - // # n_iter * n_p * board.n_obstacles + - // # n_iter * (n_p_pad / 8) * 16 - - // # SQRTs: n_iter * n_p * (n_p_pad / 8) * 24 + - // # n_iter * n_p * board.n_obstacles + - // # n_iter * (n_p_pad / 8) * 24 - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - - for (int i = 0; i < n_p; i++) { - double pos_x_i = pos_x[i]; - double pos_y_i = pos_y[i]; - double e_x_i = e_x[i]; - double e_y_i = e_y[i]; - double desired_v0_i = desired_v0[i]; - double curr_vel_x_i = curr_vel_x[i]; - double curr_vel_y_i = curr_vel_y[i]; - - // # 4 MULTs, 2 ADDs - double f_alpha_dt_x = (e_x_i * desired_v0_i - curr_vel_x_i) * dt_times_tau_alpha_inv; - double f_alpha_dt_y = (e_y_i * desired_v0_i - curr_vel_y_i) * dt_times_tau_alpha_inv; - - const __m512d pix = _mm512_set1_pd(pos_x_i); - const __m512d piy = _mm512_set1_pd(pos_y_i); - const __m512d eix = _mm512_set1_pd(e_x_i); - const __m512d eiy = _mm512_set1_pd(e_y_i); - const __m512d v_i = _mm512_set1_pd((double)i); - - __m512d acc_x = _mm512_setzero_pd(); - __m512d acc_y = _mm512_setzero_pd(); - - for (int j = 0; j < n_p_pad; j += 8) { - - // # 8 ADDs - __m512d j_idx = _mm512_add_pd(_mm512_set1_pd((double)j), lane_off); - - __mmask8 m_neq_i = _mm512_cmp_pd_mask(j_idx, v_i, _CMP_NEQ_OQ); - __mmask8 m_in_range = _mm512_cmp_pd_mask(j_idx, v_np, _CMP_LT_OQ); - __mmask8 active = m_neq_i & m_in_range; - - __m512d pjx = _mm512_loadu_pd(&pos_x[j]); - __m512d pjy = _mm512_loadu_pd(&pos_y[j]); - __m512d sbe_jx = _mm512_loadu_pd(&sb_e_x[j]); - __m512d sbe_jy = _mm512_loadu_pd(&sb_e_y[j]); - __m512d sb_jsq = _mm512_loadu_pd(&sb_sq[j]); - - // # 16 ADDs - __m512d r_ab_x = _mm512_sub_pd(pix, pjx); - __m512d r_ab_y = _mm512_sub_pd(piy, pjy); - - // # 16 MULTs, 8 ADDs - __m512d r_ab_n2 = _mm512_fmadd_pd(r_ab_x, r_ab_x, _mm512_mul_pd(r_ab_y, r_ab_y)); - - // # 8 SQRTs - __m512d r_ab_n = _mm512_sqrt_pd(r_ab_n2); - - // # 16 ADDs - __m512d r_ab2_x = _mm512_sub_pd(r_ab_x, sbe_jx); - __m512d r_ab2_y = _mm512_sub_pd(r_ab_y, sbe_jy); - - // # 16 MULTs, 8 ADDs - __m512d r_ab2_n2 = _mm512_fmadd_pd(r_ab2_x, r_ab2_x, _mm512_mul_pd(r_ab2_y, r_ab2_y)); - - // # 8 SQRTs - __m512d r_ab2_n = _mm512_sqrt_pd(r_ab2_n2); - - // # 8 ADDs - __m512d r_sum = _mm512_add_pd(r_ab_n, r_ab2_n); - - // # 8 MULTs, 8 ADDs - __m512d two_b_sq = _mm512_fmsub_pd(r_sum, r_sum, sb_jsq); - - // # 8 SQRTs - __m512d two_b = _mm512_sqrt_pd(two_b_sq); - - // # 8 MULTs - __m512d e_arg = _mm512_mul_pd(two_b, v_neg_2s_inv); - - // # 128 MULTs, 112 ADDs - __m512d e_val = _avx512_exp_pd(e_arg); - - // # 32 MULTs - __m512d numer = _mm512_mul_pd(_mm512_mul_pd(r_sum, v_neg_v0_div_2s), e_val); - __m512d denom = _mm512_mul_pd(_mm512_mul_pd(two_b, r_ab_n), r_ab2_n); - - // # 8 DIVs - __m512d smc = _mm512_div_pd(numer, denom); - - // # 16 MULTs - __m512d sm_r_ab = _mm512_mul_pd(smc, r_ab2_n); - __m512d sm_r_ab2 = _mm512_mul_pd(smc, r_ab_n); - - // # 32 MULTs, 16 ADDs - __m512d f_x = _mm512_fmadd_pd(r_ab2_x, sm_r_ab2, _mm512_mul_pd(r_ab_x, sm_r_ab)); - __m512d f_y = _mm512_fmadd_pd(r_ab2_y, sm_r_ab2, _mm512_mul_pd(r_ab_y, sm_r_ab)); - - // # 24 MULTs, 8 ADDs - __m512d a = _mm512_mul_pd(_mm512_fmadd_pd(eix, f_x, _mm512_mul_pd(eiy, f_y)), v_cos_phi_inv); - - // # 8 MULTs - __m512d a_sq = _mm512_mul_pd(a, a); - - // # 16 MULTs, 8 ADDs - __m512d b_sq = _mm512_fmadd_pd(f_x, f_x, _mm512_mul_pd(f_y, f_y)); - - __mmask8 k_ge = _mm512_cmp_pd_mask(a, v_zero, _CMP_GE_OQ); - __mmask8 k_gt = _mm512_cmp_pd_mask(a_sq, b_sq, _CMP_GT_OQ); - __mmask8 k_cond = _mm512_kand(k_ge, k_gt); - __m512d w_val = _mm512_mask_blend_pd(k_cond, v_dt_neg, v_c_neg_dt); - - __m512d f_x_safe = _mm512_maskz_mov_pd(active, f_x); - __m512d f_y_safe = _mm512_maskz_mov_pd(active, f_y); - - // # 16 MULTs, 16 ADDs - acc_x = _mm512_fmadd_pd(f_x_safe, w_val, acc_x); - acc_y = _mm512_fmadd_pd(f_y_safe, w_val, acc_y); - } - - // # 16 ADDS - f_alpha_dt_x += _mm512_reduce_add_pd(acc_x); - f_alpha_dt_y += _mm512_reduce_add_pd(acc_y); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - double v1_x = pos_x_i - board.obstacles[k].start_x; - double v1_y = pos_y_i - board.obstacles[k].start_y; - - // # 3 MULTs, 1 ADD - double projection = (v1_x * board.obstacles[k].obstacle_v_x + v1_y * board.obstacles[k].obstacle_v_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0) - projection = 0.0; - else if (projection > 1.0) - projection = 1.0; - - // # 4 ADDs, 2 MULTs - double r_aB_x = pos_x_i - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - double r_aB_y = pos_y_i - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - double r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - - // # 2 MULTs, 1 EXP, 1 DIV - double scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - - // # 2 MULTs - double f_alpha_B_neg_x = r_aB_x * scalar_mult; - double f_alpha_B_neg_y = r_aB_y * scalar_mult; - - double w_val = dt_neg; - double e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y_i : e_y_i); - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs, 2 ADDs - f_alpha_dt_x += f_alpha_B_neg_x * w_val; - f_alpha_dt_y += f_alpha_B_neg_y * w_val; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 8) { - - __m512d w_x_i_vec = _mm512_loadu_pd(&w_x[i]); - __m512d w_y_i_vec = _mm512_loadu_pd(&w_y[i]); - __m512d v_max_i_vec = _mm512_loadu_pd(&v_max[i]); - __m512d pos_x_i_vec = _mm512_loadu_pd(&pos_x[i]); - __m512d pos_y_i_vec = _mm512_loadu_pd(&pos_y[i]); - __m512d destination_y_i_vec = _mm512_loadu_pd(&destination_y[i]); - __m512d destination_x_i_vec = _mm512_loadu_pd(&destination_x[i]); - __m512d desired_v0_i_vec = _mm512_loadu_pd(&desired_v0[i]); - - __m256i color_i_vec = _mm256_loadu_si256((__m256i *)&color[i]); - - // # 16 MULTs, 8 ADDs - __m512d w_norm_sq = _mm512_fmadd_pd(w_x_i_vec, w_x_i_vec, _mm512_mul_pd(w_y_i_vec, w_y_i_vec)); - - // # 8 SQRTs - __m512d w_norm = _mm512_sqrt_pd(w_norm_sq); - - // # 8 DIVs - __m512d correction_factor = _mm512_min_pd(_mm512_set1_pd(1.0), _mm512_div_pd(v_max_i_vec, w_norm)); - - // # 16 MULTs - __m512d curr_vel_x_i_vec = _mm512_mul_pd(w_x_i_vec, correction_factor); - __m512d curr_vel_y_i_vec = _mm512_mul_pd(w_y_i_vec, correction_factor); - - __m512d dt_vec = _mm512_set1_pd(dt); - - // # 16 MULTs, 16 ADDs - pos_x_i_vec = _mm512_fmadd_pd(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_pd(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask8 cond_1_left = _mm256_cmpeq_epi32_mask(color_i_vec, _mm256_setzero_si256()); - __mmask8 cond_1_right = _mm512_cmp_pd_mask(pos_x_i_vec, _mm512_set1_pd(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask8 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_pd(cond_1, pos_x_i_vec, _mm512_set1_pd(1.0)); - destination_y_i_vec = _mm512_mask_blend_pd(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_pd(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_pd(cond_1, w_y_i_vec, _mm512_setzero_pd()); - curr_vel_x_i_vec = _mm512_mask_blend_pd(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_pd(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask8 cond_2_left = _mm256_cmpeq_epi32_mask(color_i_vec, _mm256_set1_epi32(1)); - __mmask8 cond_2_right = _mm512_cmp_pd_mask(pos_x_i_vec, _mm512_set1_pd(1.5), _CMP_LT_OQ); - __mmask8 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_pd(cond_2, pos_x_i_vec, _mm512_set1_pd(BOARD_LENGTH - 1.0)); - destination_y_i_vec = _mm512_mask_blend_pd(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512d neg_desired_v0 = _mm512_xor_pd(desired_v0_i_vec, _mm512_set1_pd(-0.0)); - w_x_i_vec = _mm512_mask_blend_pd(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_pd(cond_2, w_y_i_vec, _mm512_setzero_pd()); - curr_vel_x_i_vec = _mm512_mask_blend_pd(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_pd(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_pd(pos_y_i_vec, _mm512_set1_pd(WALL_EPS)); - pos_y_i_vec = _mm512_min_pd(pos_y_i_vec, _mm512_set1_pd(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 16 ADDs - __m512d ex_vec = _mm512_sub_pd(destination_x_i_vec, pos_x_i_vec); - __m512d ey_vec = _mm512_sub_pd(destination_y_i_vec, pos_y_i_vec); - - // # 16 MULTs, 8 ADDs - __m512d e_norm_sq = _mm512_fmadd_pd(ex_vec, ex_vec, _mm512_mul_pd(ey_vec, ey_vec)); - - // # 8 SQRTs - __m512d e_norm = _mm512_sqrt_pd(e_norm_sq); - - // # 8 DIVs - __m512d e_norm_inv = _mm512_div_pd(_mm512_set1_pd(1.0), e_norm); - - // # 16 MULT - __m512d e_x_i_vec = _mm512_mul_pd(ex_vec, e_norm_inv); - __m512d e_y_i_vec = _mm512_mul_pd(ey_vec, e_norm_inv); - - // # 16 MULTs, 8 ADDs - __m512d vel_norm_sq = _mm512_fmadd_pd(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_pd(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 8 MULTs - __m512d sb_sq_i_vec = _mm512_mul_pd(vel_norm_sq, _mm512_set1_pd(delta_t_sq)); - - // # 8 SQRTs - __m512d vel_norm_dt = _mm512_sqrt_pd(sb_sq_i_vec); - - _mm512_storeu_pd(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_pd(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_pd(&w_x[i], w_x_i_vec); - _mm512_storeu_pd(&w_y[i], w_y_i_vec); - _mm512_storeu_pd(&pos_x[i], pos_x_i_vec); - _mm512_storeu_pd(&pos_y[i], pos_y_i_vec); - _mm512_storeu_pd(&e_x[i], e_x_i_vec); - _mm512_storeu_pd(&e_y[i], e_y_i_vec); - _mm512_storeu_pd(&destination_y[i], destination_y_i_vec); - _mm512_storeu_pd(&sb_sq[i], sb_sq_i_vec); - - // # 16 MULTs - _mm512_storeu_pd(&sb_e_x[i], _mm512_mul_pd(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_pd(&sb_e_y[i], _mm512_mul_pd(e_y_i_vec, vel_norm_dt)); - } -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -} diff --git a/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp b/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp deleted file mode 100644 index 486512c..0000000 --- a/variants/variant_inlining_8_SoA_AVX512_polyexp_moreavx_ilp_2_expfix.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// # Changes: Added ILP with k = 2 to j-loop -// # Predecessor: variant_inlining_8_SoA_AVX512_polyexp_moreavx.cpp - -#include "../headers/board_reduced.hpp" -#include "../headers/constants.hpp" -#include "../headers/pedestrian_reduced.hpp" - -#include - -#include -#include - -#define SEED 42 -#define BOARD_WIDTH 10.0 -#define BOARD_LENGTH 50.0 -#define BOARD_LENGTH_MINUS_ONE BOARD_LENGTH - 1.0 -#define BOARD_LENGTH_MINUS_ONE_POINT_FIVE BOARD_LENGTH - 1.5 -#define WALL_EPS 1e-3 -#define BOARD_WIDTH_MINUS_WALL_EPS 9.999 - -#ifndef RANDOM_SEED -#define RANDOM_SEED 0 -#endif - -#ifndef BENCHMARK -#define BENCHMARK 0 -#endif - -using namespace std; - -alignas(64) vector pos_x, pos_y; -alignas(64) vector sb_sq; -alignas(64) vector sb_e_x, sb_e_y; -alignas(64) vector e_x, e_y; -alignas(64) vector curr_vel_x, curr_vel_y; -alignas(64) vector w_x, w_y; -alignas(64) vector desired_v0; -alignas(64) vector v_max; -alignas(64) vector destination_x, destination_y; -alignas(64) vector color; - -Pedestrian *init_pedestrians(int n_p) { - -#if RANDOM_SEED - random_device rd; - mt19937 gen(rd()); -#else - mt19937 gen(SEED); -#endif - - normal_distribution velocity_gen(v0_mean, v0_std_dev); - uniform_real_distribution y_gen(0.3, BOARD_WIDTH - 0.3); - uniform_real_distribution x_gen_left(2.0, BOARD_LENGTH / 2.0); - uniform_real_distribution x_gen_right(BOARD_LENGTH / 2.0, BOARD_LENGTH - 2.0); - - const int n_p_pad = (n_p + 15) & ~15; - - pos_x.resize(n_p_pad); - pos_y.resize(n_p_pad); - sb_sq.resize(n_p_pad); - sb_e_x.resize(n_p_pad); - sb_e_y.resize(n_p_pad); - e_x.resize(n_p_pad); - e_y.resize(n_p_pad); - curr_vel_x.resize(n_p_pad); - curr_vel_y.resize(n_p_pad); - w_x.resize(n_p_pad); - w_y.resize(n_p_pad); - desired_v0.resize(n_p_pad); - v_max.resize(n_p_pad); - destination_x.resize(n_p_pad); - destination_y.resize(n_p_pad); - color.resize(n_p_pad); - - int n_p_half = n_p / 2; - - for (int i = 0; i < n_p_half; i++) { - double x = x_gen_left(gen); - double y = y_gen(gen); - - double dest_x = BOARD_LENGTH + 30.0; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 0; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int i = n_p_half; i < n_p; i++) { - double x = x_gen_right(gen); - double y = y_gen(gen); - - double dest_x = -30; - double dest_y = y; - - double init_e_x = dest_x - x; - double init_e_y = dest_y - y; - double init_e_norm = sqrt(init_e_x * init_e_x + init_e_y * init_e_y); - double init_e_unit_x = init_e_x / init_e_norm; - double init_e_unit_y = init_e_y / init_e_norm; - - double d_v0; - do { - d_v0 = velocity_gen(gen); - } while (d_v0 <= 0.1); - - double v_m = 1.3 * d_v0; - - color[i] = 1; - pos_x[i] = x; - pos_y[i] = y; - e_x[i] = init_e_unit_x; - e_y[i] = init_e_unit_y; - v_max[i] = v_m; - desired_v0[i] = d_v0; - destination_x[i] = dest_x; - destination_y[i] = dest_y; - - w_x[i] = 0.0; - w_y[i] = 0.0; - curr_vel_x[i] = 0.0; - curr_vel_y[i] = 0.0; - sb_sq[i] = 0.0; - sb_e_x[i] = 0.0; - sb_e_y[i] = 0.0; - } - - for (int j = n_p; j < n_p_pad; j++) { - pos_x[j] = 1e9; - pos_y[j] = 1e9; - sb_sq[j] = 0.0; - sb_e_x[j] = 0.0; - sb_e_y[j] = 0.0; - } - return nullptr; -} - -Board init_board_without_obstacles() { return Board(BOARD_LENGTH, BOARD_WIDTH, 0, nullptr); } - -// # 128 MULTs, 112 ADDs -static inline __m512d _avx512_exp_pd(__m512d x) { - - const __m512d log2e = _mm512_set1_pd(1.4426950408889634); - - // # 8 MULTs - __m512d nf = _mm512_roundscale_pd(_mm512_mul_pd(x, log2e), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); - const __m512d ln2 = _mm512_set1_pd(0.6931471805599453); - - // # 8 MULTs, 8 ADDs - __m512d r = _mm512_fnmadd_pd(nf, ln2, x); - - const __m512d c13 = _mm512_set1_pd(c13_scalar); - const __m512d c12 = _mm512_set1_pd(c12_scalar); - const __m512d c11 = _mm512_set1_pd(c11_scalar); - const __m512d c10 = _mm512_set1_pd(c10_scalar); - const __m512d c9 = _mm512_set1_pd(c9_scalar); - const __m512d c8 = _mm512_set1_pd(c8_scalar); - const __m512d c7 = _mm512_set1_pd(c7_scalar); - const __m512d c6 = _mm512_set1_pd(c6_scalar); - const __m512d c5 = _mm512_set1_pd(c5_scalar); - const __m512d c4 = _mm512_set1_pd(c4_scalar); - const __m512d c3 = _mm512_set1_pd(c3_scalar); - const __m512d c2 = _mm512_set1_pd(c2_scalar); - const __m512d c1 = _mm512_set1_pd(c1_scalar); - const __m512d c0 = _mm512_set1_pd(c0_scalar); - - __m512d p = c13; - - // # 104 MULTs, 104 ADDs - p = _mm512_fmadd_pd(p, r, c12); - p = _mm512_fmadd_pd(p, r, c11); - p = _mm512_fmadd_pd(p, r, c10); - p = _mm512_fmadd_pd(p, r, c9); - p = _mm512_fmadd_pd(p, r, c8); - p = _mm512_fmadd_pd(p, r, c7); - p = _mm512_fmadd_pd(p, r, c6); - p = _mm512_fmadd_pd(p, r, c5); - p = _mm512_fmadd_pd(p, r, c4); - p = _mm512_fmadd_pd(p, r, c3); - p = _mm512_fmadd_pd(p, r, c2); - p = _mm512_fmadd_pd(p, r, c1); - p = _mm512_fmadd_pd(p, r, c0); - - __m256d nf_lo = _mm512_castpd512_pd256(nf); - __m256d nf_hi = _mm512_extractf64x4_pd(nf, 1); - - __m128i ni32_lo = _mm256_cvtpd_epi32(nf_lo); - __m128i ni32_hi = _mm256_cvtpd_epi32(nf_hi); - - __m256i ni64_lo = _mm256_cvtepi32_epi64(ni32_lo); - __m256i ni64_hi = _mm256_cvtepi32_epi64(ni32_hi); - - __m512i ni64 = _mm512_inserti64x4(_mm512_castsi256_si512(ni64_lo), ni64_hi, 1); - - __m512i biased = _mm512_add_epi64(ni64, _mm512_set1_epi64(1023)); - - __m512i scaled = _mm512_slli_epi64(biased, 52); - - __m512d pow2n = _mm512_castsi512_pd(scaled); - - // # 8 MULTs - return _mm512_mul_pd(p, pow2n); -} - -int run_simulation(Pedestrian *pedestrians, Board &board, int n_p, int n_iter, const char *dump_path) { - -#if BENCHMARK - (void)dump_path; -#endif - -#if !BENCHMARK - const int dump_interval = 1; - - vector> samples; - - if (dump_path) { - samples.reserve(static_cast(n_iter / dump_interval + 1) * n_p); - - for (int i = 0; i < n_p; i++) { - samples.emplace_back(0, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - - const int n_p_pad = (n_p + 15) & ~15; - - alignas(64) constexpr double lane_offset_arr[8] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; - const __m512d lane_off = _mm512_load_pd(lane_offset_arr); - - const __m512d v_neg_v0_div_2s = _mm512_set1_pd(NEG_V0_AB_div_TWO_SIGMA); - const __m512d v_neg_2s_inv = _mm512_set1_pd(NEG_TWO_SIGMA_INV); - const __m512d v_cos_phi_sq = _mm512_set1_pd(cos_phi_sq); - const __m512d v_dt_neg = _mm512_set1_pd(dt_neg); - const __m512d v_c_neg_dt = _mm512_set1_pd(c_neg_times_dt); - const __m512d v_zero = _mm512_setzero_pd(); - const __m512d v_one = _mm512_set1_pd(1.0f); - const __m512d v_np = _mm512_set1_pd((float)n_p); - const __m512d v_exp_min = _mm512_set1_pd(-87.0f); - - // # ADDs: n_iter * n_p * 36 + - // # n_iter * n_p * (n_p_pad / 16) * 464 + - // # n_iter * n_p * board.n_obstacles * 10 + - // # n_iter * (n_p_pad / 8) * 56 - - // # MULTs: n_iter * n_p * 4 + - // # n_iter * n_p * (n_p_pad / 16) * 640 + - // # n_iter * n_p * board.n_obstacles * 13 + - // # n_iter * (n_p_pad / 8) * 120 - - // # DIVs: n_iter * n_p * (n_p_pad / 16) * 16 + - // # n_iter * n_p * board.n_obstacles + - // # n_iter * (n_p_pad / 8) * 16 - - // # SQRTs: n_iter * n_p * (n_p_pad / 16) * 48 + - // # n_iter * n_p * board.n_obstacles + - // # n_iter * (n_p_pad / 8) * 24 - - // # EXPs: n_iter * n_p * board.n_obstacles - - for (int t = 0; t < n_iter; t++) { - - for (int i = 0; i < n_p; i++) { - - double pos_x_i = pos_x[i]; - double pos_y_i = pos_y[i]; - double e_x_i = e_x[i]; - double e_y_i = e_y[i]; - double desired_v0_i = desired_v0[i]; - double curr_vel_x_i = curr_vel_x[i]; - double curr_vel_y_i = curr_vel_y[i]; - - // # 4 MULTs, 2 ADDs - double f_alpha_dt_x = (e_x_i * desired_v0_i - curr_vel_x_i) * dt_times_tau_alpha_inv; - double f_alpha_dt_y = (e_y_i * desired_v0_i - curr_vel_y_i) * dt_times_tau_alpha_inv; - - const __m512d pix = _mm512_set1_pd(pos_x_i); - const __m512d piy = _mm512_set1_pd(pos_y_i); - const __m512d eix = _mm512_set1_pd(e_x_i); - const __m512d eiy = _mm512_set1_pd(e_y_i); - const __m512d v_i = _mm512_set1_pd((double)i); - - __m512d acc_x_0 = _mm512_setzero_pd(); - __m512d acc_y_0 = _mm512_setzero_pd(); - __m512d acc_x_1 = _mm512_setzero_pd(); - __m512d acc_y_1 = _mm512_setzero_pd(); - - for (int j = 0; j < n_p_pad; j += 16) { - - // # 16 ADDs - __m512d j_idx_0 = _mm512_add_pd(_mm512_set1_pd((double)j), lane_off); - __m512d j_idx_1 = _mm512_add_pd(_mm512_set1_pd((double)j + 8), lane_off); - - __mmask8 m_neq_i_0 = _mm512_cmp_pd_mask(j_idx_0, v_i, _CMP_NEQ_OQ); - __mmask8 m_neq_i_1 = _mm512_cmp_pd_mask(j_idx_1, v_i, _CMP_NEQ_OQ); - - __mmask8 m_in_range_0 = _mm512_cmp_pd_mask(j_idx_0, v_np, _CMP_LT_OQ); - __mmask8 m_in_range_1 = _mm512_cmp_pd_mask(j_idx_1, v_np, _CMP_LT_OQ); - - __mmask8 active_0 = m_neq_i_0 & m_in_range_0; - __mmask8 active_1 = m_neq_i_1 & m_in_range_1; - - __m512d pjx_0 = _mm512_loadu_pd(&pos_x[j]); - __m512d pjx_1 = _mm512_loadu_pd(&pos_x[j + 8]); - - __m512d pjy_0 = _mm512_loadu_pd(&pos_y[j]); - __m512d pjy_1 = _mm512_loadu_pd(&pos_y[j + 8]); - - __m512d sbe_jx_0 = _mm512_loadu_pd(&sb_e_x[j]); - __m512d sbe_jx_1 = _mm512_loadu_pd(&sb_e_x[j + 8]); - - __m512d sbe_jy_0 = _mm512_loadu_pd(&sb_e_y[j]); - __m512d sbe_jy_1 = _mm512_loadu_pd(&sb_e_y[j + 8]); - - __m512d sb_jsq_0 = _mm512_loadu_pd(&sb_sq[j]); - __m512d sb_jsq_1 = _mm512_loadu_pd(&sb_sq[j + 8]); - - // # 16 ADDs - __m512d r_ab_x_0 = _mm512_sub_pd(pix, pjx_0); - __m512d r_ab_x_1 = _mm512_sub_pd(pix, pjx_1); - - // # 16 ADDs - __m512d r_ab_y_0 = _mm512_sub_pd(piy, pjy_0); - __m512d r_ab_y_1 = _mm512_sub_pd(piy, pjy_1); - - // # 32 MULTs, 16 ADDs - __m512d r_ab_n2_0 = _mm512_fmadd_pd(r_ab_x_0, r_ab_x_0, _mm512_mul_pd(r_ab_y_0, r_ab_y_0)); - __m512d r_ab_n2_1 = _mm512_fmadd_pd(r_ab_x_1, r_ab_x_1, _mm512_mul_pd(r_ab_y_1, r_ab_y_1)); - - // # 16 SQRTs - __m512d r_ab_n_0 = _mm512_sqrt_pd(r_ab_n2_0); - __m512d r_ab_n_1 = _mm512_sqrt_pd(r_ab_n2_1); - - // # 16 ADDs - __m512d r_ab2_x_0 = _mm512_sub_pd(r_ab_x_0, sbe_jx_0); - __m512d r_ab2_x_1 = _mm512_sub_pd(r_ab_x_1, sbe_jx_1); - - // # 16 ADDs - __m512d r_ab2_y_0 = _mm512_sub_pd(r_ab_y_0, sbe_jy_0); - __m512d r_ab2_y_1 = _mm512_sub_pd(r_ab_y_1, sbe_jy_1); - - // # 32 MULTs, 16 ADDs - __m512d r_ab2_n2_0 = _mm512_fmadd_pd(r_ab2_x_0, r_ab2_x_0, _mm512_mul_pd(r_ab2_y_0, r_ab2_y_0)); - __m512d r_ab2_n2_1 = _mm512_fmadd_pd(r_ab2_x_1, r_ab2_x_1, _mm512_mul_pd(r_ab2_y_1, r_ab2_y_1)); - - // # 16 SQRTs - __m512d r_ab2_n_0 = _mm512_sqrt_pd(r_ab2_n2_0); - __m512d r_ab2_n_1 = _mm512_sqrt_pd(r_ab2_n2_1); - - // # 16 ADDs - __m512d r_sum_0 = _mm512_add_pd(r_ab_n_0, r_ab2_n_0); - __m512d r_sum_1 = _mm512_add_pd(r_ab_n_1, r_ab2_n_1); - - // # 16 MULTs, 16 ADDs - __m512d two_b_sq_0 = _mm512_fmsub_pd(r_sum_0, r_sum_0, sb_jsq_0); - __m512d two_b_sq_1 = _mm512_fmsub_pd(r_sum_1, r_sum_1, sb_jsq_1); - - // # 16 SQRTs - __m512d two_b_0 = _mm512_sqrt_pd(two_b_sq_0); - __m512d two_b_1 = _mm512_sqrt_pd(two_b_sq_1); - - // # 16 MULTs - __m512d e_arg_0 = _mm512_mul_pd(two_b_0, v_neg_2s_inv); - __m512d e_arg_1 = _mm512_mul_pd(two_b_1, v_neg_2s_inv); - - e_arg_0 = _mm512_max_pd(e_arg_0, v_exp_min); - e_arg_1 = _mm512_max_pd(e_arg_1, v_exp_min); - - // # 256 MULTs, 224 ADDs - __m512d e_val_0 = _avx512_exp_pd(e_arg_0); - __m512d e_val_1 = _avx512_exp_pd(e_arg_1); - - // # 32 MULTs - __m512d numer_0 = _mm512_mul_pd(_mm512_mul_pd(r_sum_0, v_neg_v0_div_2s), e_val_0); - __m512d numer_1 = _mm512_mul_pd(_mm512_mul_pd(r_sum_1, v_neg_v0_div_2s), e_val_1); - - // # 32 MULTs - __m512d denom_0 = _mm512_mul_pd(_mm512_mul_pd(two_b_0, r_ab_n_0), r_ab2_n_0); - __m512d denom_1 = _mm512_mul_pd(_mm512_mul_pd(two_b_1, r_ab_n_1), r_ab2_n_1); - - __m512d denom_safe_0 = _mm512_mask_blend_pd(active_0, v_one, denom_0); - __m512d denom_safe_1 = _mm512_mask_blend_pd(active_1, v_one, denom_1); - - // # 16 DIVs - __m512d smc_0 = _mm512_div_pd(numer_0, denom_safe_0); - __m512d smc_1 = _mm512_div_pd(numer_1, denom_safe_1); - - // # 16 MULTs - __m512d sm_r_ab_0 = _mm512_mul_pd(smc_0, r_ab2_n_0); - __m512d sm_r_ab_1 = _mm512_mul_pd(smc_1, r_ab2_n_1); - - // # 16 MULTs - __m512d sm_r_ab2_0 = _mm512_mul_pd(smc_0, r_ab_n_0); - __m512d sm_r_ab2_1 = _mm512_mul_pd(smc_1, r_ab_n_1); - - // # 32 MULTs, 16 ADDs - __m512d f_x_0 = _mm512_fmadd_pd(r_ab2_x_0, sm_r_ab2_0, _mm512_mul_pd(r_ab_x_0, sm_r_ab_0)); - __m512d f_x_1 = _mm512_fmadd_pd(r_ab2_x_1, sm_r_ab2_1, _mm512_mul_pd(r_ab_x_1, sm_r_ab_1)); - - // # 32 MULTs, 16 ADDs - __m512d f_y_0 = _mm512_fmadd_pd(r_ab2_y_0, sm_r_ab2_0, _mm512_mul_pd(r_ab_y_0, sm_r_ab_0)); - __m512d f_y_1 = _mm512_fmadd_pd(r_ab2_y_1, sm_r_ab2_1, _mm512_mul_pd(r_ab_y_1, sm_r_ab_1)); - - // # 32 MULTs, 16 ADDs - __m512d f_norm_sq_0 = _mm512_fmadd_pd(f_x_0, f_x_0, _mm512_mul_pd(f_y_0, f_y_0)); - __m512d f_norm_sq_1 = _mm512_fmadd_pd(f_x_1, f_x_1, _mm512_mul_pd(f_y_1, f_y_1)); - - // # 16 MULTs - __m512d rhs_0 = _mm512_mul_pd(f_norm_sq_0, v_cos_phi_sq); - __m512d rhs_1 = _mm512_mul_pd(f_norm_sq_1, v_cos_phi_sq); - - // # 32 MULTs, 16 ADDs - __m512d e_dot_f_0 = _mm512_fmadd_pd(eix, f_x_0, _mm512_mul_pd(eiy, f_y_0)); - __m512d e_dot_f_1 = _mm512_fmadd_pd(eix, f_x_1, _mm512_mul_pd(eiy, f_y_1)); - - // # 16 MULTs - __m512d e_dot_f_sq_0 = _mm512_mul_pd(e_dot_f_0, e_dot_f_0); - __m512d e_dot_f_sq_1 = _mm512_mul_pd(e_dot_f_1, e_dot_f_1); - - __mmask8 c1_0 = _mm512_cmp_pd_mask(e_dot_f_0, v_zero, _CMP_LT_OQ); - __mmask8 c1_1 = _mm512_cmp_pd_mask(e_dot_f_1, v_zero, _CMP_LT_OQ); - - __mmask8 c2_0 = _mm512_cmp_pd_mask(e_dot_f_sq_0, rhs_0, _CMP_GT_OQ); - __mmask8 c2_1 = _mm512_cmp_pd_mask(e_dot_f_sq_1, rhs_1, _CMP_GT_OQ); - - __mmask8 cond_0 = c1_0 & c2_0; - __mmask8 cond_1 = c1_1 & c2_1; - - __m512d w_val_0 = _mm512_mask_blend_pd(cond_0, v_dt_neg, v_c_neg_dt); - __m512d w_val_1 = _mm512_mask_blend_pd(cond_1, v_dt_neg, v_c_neg_dt); - - __m512d f_x_safe_0 = _mm512_maskz_mov_pd(active_0, f_x_0); - __m512d f_x_safe_1 = _mm512_maskz_mov_pd(active_1, f_x_1); - - __m512d f_y_safe_0 = _mm512_maskz_mov_pd(active_0, f_y_0); - __m512d f_y_safe_1 = _mm512_maskz_mov_pd(active_1, f_y_1); - - // # 16 MULTs, 16 ADDs - acc_x_0 = _mm512_fmadd_pd(f_x_safe_0, w_val_0, acc_x_0); - acc_x_1 = _mm512_fmadd_pd(f_x_safe_1, w_val_1, acc_x_1); - - // # 16 MULTs, 16 ADDs - acc_y_0 = _mm512_fmadd_pd(f_y_safe_0, w_val_0, acc_y_0); - acc_y_1 = _mm512_fmadd_pd(f_y_safe_1, w_val_1, acc_y_1); - } - - // # 32 ADDs - f_alpha_dt_x += _mm512_reduce_add_pd(_mm512_add_pd(acc_x_0, acc_x_1)); - f_alpha_dt_y += _mm512_reduce_add_pd(_mm512_add_pd(acc_y_0, acc_y_1)); - - for (int k = 0; k < board.n_obstacles; k++) { - - // # 2 ADDs - double v1_x = pos_x_i - board.obstacles[k].start_x; - double v1_y = pos_y_i - board.obstacles[k].start_y; - - // # 3 MULTs, 1 ADD - double projection = (v1_x * board.obstacles[k].obstacle_v_x + v1_y * board.obstacles[k].obstacle_v_y) * board.obstacles[k].length_sq_inv; - - if (projection < 0.0) - projection = 0.0; - else if (projection > 1.0) - projection = 1.0; - - // # 4 ADDs, 2 MULTs - double r_aB_x = pos_x_i - (board.obstacles[k].start_x + board.obstacles[k].obstacle_v_x * projection); - double r_aB_y = pos_y_i - (board.obstacles[k].start_y + board.obstacles[k].obstacle_v_y * projection); - - // # 1 SQRT, 2 MULTs, 1 ADD - double r_aB_norm = sqrt(r_aB_x * r_aB_x + r_aB_y * r_aB_y); - - // # 2 MULTs, 1 EXP, 1 DIV - double scalar_mult = (NEG_U0_AB_div_R * exp(r_aB_norm * NEG_R_INV)) / r_aB_norm; - - // # 2 MULTs - double f_alpha_B_neg_x = r_aB_x * scalar_mult; - double f_alpha_B_neg_y = r_aB_y * scalar_mult; - - double w_val = dt_neg; - double e_dot_f = (f_alpha_B_neg_y == 0) ? 0 : (f_alpha_B_neg_y < 0 ? -e_y_i : e_y_i); - if (e_dot_f < cos_phi) - w_val = c_neg_times_dt; - - // # 2 MULTs, 2 ADDs - f_alpha_dt_x += f_alpha_B_neg_x * w_val; - f_alpha_dt_y += f_alpha_B_neg_y * w_val; - } - - // # 2 ADDs - w_x[i] += f_alpha_dt_x; - w_y[i] += f_alpha_dt_y; - } - - for (int i = 0; i < n_p_pad; i += 8) { - - __m512d w_x_i_vec = _mm512_loadu_pd(&w_x[i]); - __m512d w_y_i_vec = _mm512_loadu_pd(&w_y[i]); - __m512d v_max_i_vec = _mm512_loadu_pd(&v_max[i]); - __m512d pos_x_i_vec = _mm512_loadu_pd(&pos_x[i]); - __m512d pos_y_i_vec = _mm512_loadu_pd(&pos_y[i]); - __m512d destination_y_i_vec = _mm512_loadu_pd(&destination_y[i]); - __m512d destination_x_i_vec = _mm512_loadu_pd(&destination_x[i]); - __m512d desired_v0_i_vec = _mm512_loadu_pd(&desired_v0[i]); - - __m256i color_i_vec = _mm256_loadu_si256((__m256i *)&color[i]); - - // # 16 MULTs, 8 ADDs - __m512d w_norm_sq = _mm512_fmadd_pd(w_x_i_vec, w_x_i_vec, _mm512_mul_pd(w_y_i_vec, w_y_i_vec)); - - // # 8 SQRTs - __m512d w_norm = _mm512_sqrt_pd(w_norm_sq); - - // # 8 DIVs - __m512d correction_factor = _mm512_min_pd(_mm512_set1_pd(1.0), _mm512_div_pd(v_max_i_vec, w_norm)); - - // # 16 MULTs - __m512d curr_vel_x_i_vec = _mm512_mul_pd(w_x_i_vec, correction_factor); - __m512d curr_vel_y_i_vec = _mm512_mul_pd(w_y_i_vec, correction_factor); - - __m512d dt_vec = _mm512_set1_pd(dt); - - // # 16 MULTs, 16 ADDs - pos_x_i_vec = _mm512_fmadd_pd(curr_vel_x_i_vec, dt_vec, pos_x_i_vec); - pos_y_i_vec = _mm512_fmadd_pd(curr_vel_y_i_vec, dt_vec, pos_y_i_vec); - - __mmask8 cond_1_left = _mm256_cmpeq_epi32_mask(color_i_vec, _mm256_setzero_si256()); - __mmask8 cond_1_right = _mm512_cmp_pd_mask(pos_x_i_vec, _mm512_set1_pd(BOARD_LENGTH_MINUS_ONE_POINT_FIVE), _CMP_GT_OQ); - __mmask8 cond_1 = cond_1_left & cond_1_right; - - pos_x_i_vec = _mm512_mask_blend_pd(cond_1, pos_x_i_vec, _mm512_set1_pd(1.0)); - destination_y_i_vec = _mm512_mask_blend_pd(cond_1, destination_y_i_vec, pos_y_i_vec); - w_x_i_vec = _mm512_mask_blend_pd(cond_1, w_x_i_vec, desired_v0_i_vec); - w_y_i_vec = _mm512_mask_blend_pd(cond_1, w_y_i_vec, _mm512_setzero_pd()); - curr_vel_x_i_vec = _mm512_mask_blend_pd(cond_1, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_pd(cond_1, curr_vel_y_i_vec, w_y_i_vec); - - __mmask8 cond_2_left = _mm256_cmpeq_epi32_mask(color_i_vec, _mm256_set1_epi32(1)); - __mmask8 cond_2_right = _mm512_cmp_pd_mask(pos_x_i_vec, _mm512_set1_pd(1.5), _CMP_LT_OQ); - __mmask8 cond_2 = cond_2_left & cond_2_right; - - pos_x_i_vec = _mm512_mask_blend_pd(cond_2, pos_x_i_vec, _mm512_set1_pd(BOARD_LENGTH - 1.0)); - destination_y_i_vec = _mm512_mask_blend_pd(cond_2, destination_y_i_vec, pos_y_i_vec); - __m512d neg_desired_v0 = _mm512_xor_pd(desired_v0_i_vec, _mm512_set1_pd(-0.0)); - w_x_i_vec = _mm512_mask_blend_pd(cond_2, w_x_i_vec, neg_desired_v0); - w_y_i_vec = _mm512_mask_blend_pd(cond_2, w_y_i_vec, _mm512_setzero_pd()); - curr_vel_x_i_vec = _mm512_mask_blend_pd(cond_2, curr_vel_x_i_vec, w_x_i_vec); - curr_vel_y_i_vec = _mm512_mask_blend_pd(cond_2, curr_vel_y_i_vec, w_y_i_vec); - - pos_y_i_vec = _mm512_max_pd(pos_y_i_vec, _mm512_set1_pd(WALL_EPS)); - pos_y_i_vec = _mm512_min_pd(pos_y_i_vec, _mm512_set1_pd(BOARD_WIDTH_MINUS_WALL_EPS)); - - // # 16 ADDs - __m512d ex_vec = _mm512_sub_pd(destination_x_i_vec, pos_x_i_vec); - __m512d ey_vec = _mm512_sub_pd(destination_y_i_vec, pos_y_i_vec); - - // # 16 MULTs, 8 ADDs - __m512d e_norm_sq = _mm512_fmadd_pd(ex_vec, ex_vec, _mm512_mul_pd(ey_vec, ey_vec)); - - // # 8 SQRTs - __m512d e_norm = _mm512_sqrt_pd(e_norm_sq); - - // # 8 DIVs - __m512d e_norm_inv = _mm512_div_pd(_mm512_set1_pd(1.0), e_norm); - - // # 16 MULT - __m512d e_x_i_vec = _mm512_mul_pd(ex_vec, e_norm_inv); - __m512d e_y_i_vec = _mm512_mul_pd(ey_vec, e_norm_inv); - - // # 16 MULTs, 8 ADDs - __m512d vel_norm_sq = _mm512_fmadd_pd(curr_vel_x_i_vec, curr_vel_x_i_vec, _mm512_mul_pd(curr_vel_y_i_vec, curr_vel_y_i_vec)); - - // # 8 MULTs - __m512d sb_sq_i_vec = _mm512_mul_pd(vel_norm_sq, _mm512_set1_pd(delta_t_sq)); - - // # 8 SQRTs - __m512d vel_norm_dt = _mm512_sqrt_pd(sb_sq_i_vec); - - _mm512_storeu_pd(&curr_vel_x[i], curr_vel_x_i_vec); - _mm512_storeu_pd(&curr_vel_y[i], curr_vel_y_i_vec); - _mm512_storeu_pd(&w_x[i], w_x_i_vec); - _mm512_storeu_pd(&w_y[i], w_y_i_vec); - _mm512_storeu_pd(&pos_x[i], pos_x_i_vec); - _mm512_storeu_pd(&pos_y[i], pos_y_i_vec); - _mm512_storeu_pd(&e_x[i], e_x_i_vec); - _mm512_storeu_pd(&e_y[i], e_y_i_vec); - _mm512_storeu_pd(&destination_y[i], destination_y_i_vec); - _mm512_storeu_pd(&sb_sq[i], sb_sq_i_vec); - - // # 16 MULTs - _mm512_storeu_pd(&sb_e_x[i], _mm512_mul_pd(e_x_i_vec, vel_norm_dt)); - _mm512_storeu_pd(&sb_e_y[i], _mm512_mul_pd(e_y_i_vec, vel_norm_dt)); - } -#if !BENCHMARK - for (int i = 0; i < n_p; i++) { - if (dump_path && (t % dump_interval == 0)) { - samples.emplace_back(t + 1, i, pos_x[i], pos_y[i], e_x[i], e_y[i], color[i]); - } - } -#endif - } - -#if !BENCHMARK - if (dump_path) { - ofstream out(dump_path); - out << "time,id,x,y,p.e.x,p.e.y,color\n"; - - for (auto &[t, id, x, y, e_x, e_y, c] : samples) { - out << t << ',' << id << ',' << x << ',' << y << ',' << e_x << ',' << e_y << ',' << c << '\n'; - } - } -#endif - - return 0; -}