Best Non-Vectorized Version Benchmark + Duplicate Files Removal
This commit is contained in:
+357
-305
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 92 KiB |
+42
-11
@@ -114,7 +114,7 @@ tracks = [
|
|||||||
"AVX-512 + PolyExp + RSQRT + ILP-Outer (float)", crimson, "-"),
|
"AVX-512 + PolyExp + RSQRT + ILP-Outer (float)", crimson, "-"),
|
||||||
]
|
]
|
||||||
|
|
||||||
fig, ax = plt.subplots(figsize=(9, 4.7))
|
fig, ax = plt.subplots(figsize=(10, 7))
|
||||||
ends = []
|
ends = []
|
||||||
|
|
||||||
for v, lab, c, ls in tracks:
|
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)
|
lw=2.4 if c == maroon else 1.8)
|
||||||
if c == maroon:
|
if c == maroon:
|
||||||
side = "below"
|
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:
|
else:
|
||||||
side = "above"
|
side = "above"
|
||||||
xpos = None
|
xpos = None
|
||||||
ends.append((x, y, lab, c, xpos, side))
|
ends.append((x, y, lab, c, xpos, side))
|
||||||
|
|
||||||
|
perf_bound_instruction_mix = 28.19
|
||||||
for yv, t in [
|
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_D, f"Peak π par. w/ doubles ({PEAK_D} flops/cycle)"),
|
||||||
# (PEAK_F, f"Peak π par. w/ floats ({PEAK_F} flops/cycle)")
|
# (PEAK_F, f"Peak π par. w/ floats ({PEAK_F} flops/cycle)")
|
||||||
]:
|
]:
|
||||||
ax.axhline(yv, ls=":", color="#999", lw=1.2)
|
ax.axhline(yv, ls=":", color="#999", lw=4)
|
||||||
ax.text(52, yv * 1.03, t, fontsize=9, color="#888", fontweight="bold")
|
ax.text(52, yv * 1.03, t, fontsize=15, color="#888", fontweight="bold")
|
||||||
|
|
||||||
ax.set_xscale("log", base=10)
|
ax.set_xscale("log", base=10)
|
||||||
ax.set_xticks([50, 100, 200, 500, 1000, 2000, 5000, 10000])
|
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)
|
ax.set_ylim(0, 30)
|
||||||
for label in ax.get_yticklabels():
|
for label in ax.get_yticklabels():
|
||||||
label.set_fontweight('bold')
|
label.set_fontweight('bold')
|
||||||
label.set_fontsize(9)
|
label.set_fontsize(14)
|
||||||
for label in ax.get_xticklabels():
|
for label in ax.get_xticklabels():
|
||||||
label.set_fontweight('bold')
|
label.set_fontweight('bold')
|
||||||
label.set_fontsize(9)
|
label.set_fontsize(14)
|
||||||
ax.set_xlabel("Number of Pedestrians", fontweight="bold", fontsize=9)
|
ax.set_xlabel("Number of Pedestrians", fontweight="bold", fontsize=16)
|
||||||
ax.grid(color="#e9e9e9")
|
ax.grid(color="#e9e9e9")
|
||||||
ax.spines["top"].set_visible(False)
|
ax.spines["top"].set_visible(False)
|
||||||
ax.spines["right"].set_visible(False)
|
ax.spines["right"].set_visible(False)
|
||||||
plt.title(
|
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',
|
loc='left',
|
||||||
size=9,
|
size=18,
|
||||||
fontweight="bold")
|
fontweight="bold")
|
||||||
ax.grid(color="#e9e9e9")
|
ax.grid(color="#e9e9e9")
|
||||||
plt.tight_layout()
|
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")
|
plt.savefig("analysis/fig_tracks.svg", bbox_inches="tight")
|
||||||
|
|
||||||
# plot 2: all the milestones + the symmetry one that got slower
|
# plot 2: all the milestones + the symmetry one that got slower
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-64
@@ -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
|
|
||||||
|
|
||||||
-64
@@ -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
|
|
||||||
|
|
||||||
-66
@@ -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
|
|
||||||
|
|
||||||
-64
@@ -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
|
|
||||||
|
|
||||||
-64
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
-58
@@ -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
|
|
||||||
|
|
||||||
+16
-22
@@ -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 ===
|
=== N_P=50 N_ITER=200 ===
|
||||||
W(n) per iteration: 183700.00 flops
|
W(n) per iteration: 183700.00 flops
|
||||||
Q(n) per iteration: 6512 bytes
|
Q(n) per iteration: 6512 bytes
|
||||||
I(n): 28.21 flops/byte
|
I(n): 28.21 flops/byte
|
||||||
W(n): 36740000.00 flops
|
W(n): 36740000.00 flops
|
||||||
T(n): 11368170.00 cycles
|
T(n): 26033555.00 cycles
|
||||||
P(n): 3.23 flops/cycle
|
P(n): 1.41 flops/cycle
|
||||||
|
|
||||||
=== N_P=100 N_ITER=200 ===
|
=== N_P=100 N_ITER=200 ===
|
||||||
W(n) per iteration: 727400.00 flops
|
W(n) per iteration: 727400.00 flops
|
||||||
Q(n) per iteration: 12912 bytes
|
Q(n) per iteration: 12912 bytes
|
||||||
I(n): 56.34 flops/byte
|
I(n): 56.34 flops/byte
|
||||||
W(n): 145480000.00 flops
|
W(n): 145480000.00 flops
|
||||||
T(n): 39909820.00 cycles
|
T(n): 101832660.00 cycles
|
||||||
P(n): 3.65 flops/cycle
|
P(n): 1.43 flops/cycle
|
||||||
|
|
||||||
=== N_P=200 N_ITER=200 ===
|
=== N_P=200 N_ITER=200 ===
|
||||||
W(n) per iteration: 2894800.00 flops
|
W(n) per iteration: 2894800.00 flops
|
||||||
Q(n) per iteration: 25712 bytes
|
Q(n) per iteration: 25712 bytes
|
||||||
I(n): 112.59 flops/byte
|
I(n): 112.59 flops/byte
|
||||||
W(n): 578960000.00 flops
|
W(n): 578960000.00 flops
|
||||||
T(n): 152279380.00 cycles
|
T(n): 413861080.00 cycles
|
||||||
P(n): 3.80 flops/cycle
|
P(n): 1.40 flops/cycle
|
||||||
|
|
||||||
=== N_P=500 N_ITER=200 ===
|
=== N_P=500 N_ITER=200 ===
|
||||||
W(n) per iteration: 18037000.00 flops
|
W(n) per iteration: 18037000.00 flops
|
||||||
Q(n) per iteration: 64112 bytes
|
Q(n) per iteration: 64112 bytes
|
||||||
I(n): 281.34 flops/byte
|
I(n): 281.34 flops/byte
|
||||||
W(n): 3607400000.00 flops
|
W(n): 3607400000.00 flops
|
||||||
T(n): 925130680.00 cycles
|
T(n): 2656371140.00 cycles
|
||||||
P(n): 3.90 flops/cycle
|
P(n): 1.36 flops/cycle
|
||||||
|
|
||||||
=== N_P=1000 N_ITER=200 ===
|
=== N_P=1000 N_ITER=200 ===
|
||||||
W(n) per iteration: 72074000.00 flops
|
W(n) per iteration: 72074000.00 flops
|
||||||
Q(n) per iteration: 128112 bytes
|
Q(n) per iteration: 128112 bytes
|
||||||
I(n): 562.59 flops/byte
|
I(n): 562.59 flops/byte
|
||||||
W(n): 14414800000.00 flops
|
W(n): 14414800000.00 flops
|
||||||
T(n): 3668254420.00 cycles
|
T(n): 10821923320.00 cycles
|
||||||
P(n): 3.93 flops/cycle
|
P(n): 1.33 flops/cycle
|
||||||
|
|
||||||
=== N_P=2000 N_ITER=200 ===
|
=== N_P=2000 N_ITER=200 ===
|
||||||
W(n) per iteration: 288148000.00 flops
|
W(n) per iteration: 288148000.00 flops
|
||||||
Q(n) per iteration: 256112 bytes
|
Q(n) per iteration: 256112 bytes
|
||||||
I(n): 1125.09 flops/byte
|
I(n): 1125.09 flops/byte
|
||||||
W(n): 57629600000.00 flops
|
W(n): 57629600000.00 flops
|
||||||
T(n): 14660040260.00 cycles
|
T(n): 44189161700.00 cycles
|
||||||
P(n): 3.93 flops/cycle
|
P(n): 1.30 flops/cycle
|
||||||
|
|
||||||
=== N_P=5000 N_ITER=200 ===
|
=== N_P=5000 N_ITER=200 ===
|
||||||
W(n) per iteration: 1800370000.00 flops
|
W(n) per iteration: 1800370000.00 flops
|
||||||
Q(n) per iteration: 640112 bytes
|
Q(n) per iteration: 640112 bytes
|
||||||
I(n): 2812.59 flops/byte
|
I(n): 2812.59 flops/byte
|
||||||
W(n): 360074000000.00 flops
|
W(n): 360074000000.00 flops
|
||||||
T(n): 93340296780.00 cycles
|
T(n): 301595160640.00 cycles
|
||||||
P(n): 3.86 flops/cycle
|
P(n): 1.19 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
|
|
||||||
|
|
||||||
+16
-22
@@ -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 ===
|
=== N_P=50 N_ITER=200 ===
|
||||||
W(n) per iteration: 183700.00 flops
|
W(n) per iteration: 183700.00 flops
|
||||||
Q(n) per iteration: 6512 bytes
|
Q(n) per iteration: 6512 bytes
|
||||||
I(n): 28.21 flops/byte
|
I(n): 28.21 flops/byte
|
||||||
W(n): 36740000.00 flops
|
W(n): 36740000.00 flops
|
||||||
T(n): 11342471.25 cycles
|
T(n): 25831475.00 cycles
|
||||||
P(n): 3.24 flops/cycle
|
P(n): 1.42 flops/cycle
|
||||||
|
|
||||||
=== N_P=100 N_ITER=200 ===
|
=== N_P=100 N_ITER=200 ===
|
||||||
W(n) per iteration: 727400.00 flops
|
W(n) per iteration: 727400.00 flops
|
||||||
Q(n) per iteration: 12912 bytes
|
Q(n) per iteration: 12912 bytes
|
||||||
I(n): 56.34 flops/byte
|
I(n): 56.34 flops/byte
|
||||||
W(n): 145480000.00 flops
|
W(n): 145480000.00 flops
|
||||||
T(n): 40124180.00 cycles
|
T(n): 103789940.00 cycles
|
||||||
P(n): 3.63 flops/cycle
|
P(n): 1.40 flops/cycle
|
||||||
|
|
||||||
=== N_P=200 N_ITER=200 ===
|
=== N_P=200 N_ITER=200 ===
|
||||||
W(n) per iteration: 2894800.00 flops
|
W(n) per iteration: 2894800.00 flops
|
||||||
Q(n) per iteration: 25712 bytes
|
Q(n) per iteration: 25712 bytes
|
||||||
I(n): 112.59 flops/byte
|
I(n): 112.59 flops/byte
|
||||||
W(n): 578960000.00 flops
|
W(n): 578960000.00 flops
|
||||||
T(n): 151911440.00 cycles
|
T(n): 412306040.00 cycles
|
||||||
P(n): 3.81 flops/cycle
|
P(n): 1.40 flops/cycle
|
||||||
|
|
||||||
=== N_P=500 N_ITER=200 ===
|
=== N_P=500 N_ITER=200 ===
|
||||||
W(n) per iteration: 18037000.00 flops
|
W(n) per iteration: 18037000.00 flops
|
||||||
Q(n) per iteration: 64112 bytes
|
Q(n) per iteration: 64112 bytes
|
||||||
I(n): 281.34 flops/byte
|
I(n): 281.34 flops/byte
|
||||||
W(n): 3607400000.00 flops
|
W(n): 3607400000.00 flops
|
||||||
T(n): 923357200.00 cycles
|
T(n): 2661212560.00 cycles
|
||||||
P(n): 3.91 flops/cycle
|
P(n): 1.36 flops/cycle
|
||||||
|
|
||||||
=== N_P=1000 N_ITER=200 ===
|
=== N_P=1000 N_ITER=200 ===
|
||||||
W(n) per iteration: 72074000.00 flops
|
W(n) per iteration: 72074000.00 flops
|
||||||
Q(n) per iteration: 128112 bytes
|
Q(n) per iteration: 128112 bytes
|
||||||
I(n): 562.59 flops/byte
|
I(n): 562.59 flops/byte
|
||||||
W(n): 14414800000.00 flops
|
W(n): 14414800000.00 flops
|
||||||
T(n): 3687447740.00 cycles
|
T(n): 10822175600.00 cycles
|
||||||
P(n): 3.91 flops/cycle
|
P(n): 1.33 flops/cycle
|
||||||
|
|
||||||
=== N_P=2000 N_ITER=200 ===
|
=== N_P=2000 N_ITER=200 ===
|
||||||
W(n) per iteration: 288148000.00 flops
|
W(n) per iteration: 288148000.00 flops
|
||||||
Q(n) per iteration: 256112 bytes
|
Q(n) per iteration: 256112 bytes
|
||||||
I(n): 1125.09 flops/byte
|
I(n): 1125.09 flops/byte
|
||||||
W(n): 57629600000.00 flops
|
W(n): 57629600000.00 flops
|
||||||
T(n): 14732693600.00 cycles
|
T(n): 44231659260.00 cycles
|
||||||
P(n): 3.91 flops/cycle
|
P(n): 1.30 flops/cycle
|
||||||
|
|
||||||
=== N_P=5000 N_ITER=200 ===
|
=== N_P=5000 N_ITER=200 ===
|
||||||
W(n) per iteration: 1800370000.00 flops
|
W(n) per iteration: 1800370000.00 flops
|
||||||
Q(n) per iteration: 640112 bytes
|
Q(n) per iteration: 640112 bytes
|
||||||
I(n): 2812.59 flops/byte
|
I(n): 2812.59 flops/byte
|
||||||
W(n): 360074000000.00 flops
|
W(n): 360074000000.00 flops
|
||||||
T(n): 90864696480.00 cycles
|
T(n): 300195617220.00 cycles
|
||||||
P(n): 3.96 flops/cycle
|
P(n): 1.20 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
|
|
||||||
|
|
||||||
+15
-23
@@ -1,66 +1,58 @@
|
|||||||
rm -f main_* run_tests *.o *.s variants/*.s variants/*.o headers/*.s headers/*.o
|
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 ===
|
=== N_P=50 N_ITER=200 ===
|
||||||
W(n) per iteration: 183700.00 flops
|
W(n) per iteration: 183700.00 flops
|
||||||
Q(n) per iteration: 6512 bytes
|
Q(n) per iteration: 6512 bytes
|
||||||
I(n): 28.21 flops/byte
|
I(n): 28.21 flops/byte
|
||||||
W(n): 36740000.00 flops
|
W(n): 36740000.00 flops
|
||||||
T(n): 11371033.75 cycles
|
T(n): 25817360.00 cycles
|
||||||
P(n): 3.23 flops/cycle
|
P(n): 1.42 flops/cycle
|
||||||
|
|
||||||
=== N_P=100 N_ITER=200 ===
|
=== N_P=100 N_ITER=200 ===
|
||||||
W(n) per iteration: 727400.00 flops
|
W(n) per iteration: 727400.00 flops
|
||||||
Q(n) per iteration: 12912 bytes
|
Q(n) per iteration: 12912 bytes
|
||||||
I(n): 56.34 flops/byte
|
I(n): 56.34 flops/byte
|
||||||
W(n): 145480000.00 flops
|
W(n): 145480000.00 flops
|
||||||
T(n): 39890030.00 cycles
|
T(n): 101855300.00 cycles
|
||||||
P(n): 3.65 flops/cycle
|
P(n): 1.43 flops/cycle
|
||||||
|
|
||||||
=== N_P=200 N_ITER=200 ===
|
=== N_P=200 N_ITER=200 ===
|
||||||
W(n) per iteration: 2894800.00 flops
|
W(n) per iteration: 2894800.00 flops
|
||||||
Q(n) per iteration: 25712 bytes
|
Q(n) per iteration: 25712 bytes
|
||||||
I(n): 112.59 flops/byte
|
I(n): 112.59 flops/byte
|
||||||
W(n): 578960000.00 flops
|
W(n): 578960000.00 flops
|
||||||
T(n): 153171560.00 cycles
|
T(n): 411909020.00 cycles
|
||||||
P(n): 3.78 flops/cycle
|
P(n): 1.41 flops/cycle
|
||||||
|
|
||||||
=== N_P=500 N_ITER=200 ===
|
=== N_P=500 N_ITER=200 ===
|
||||||
W(n) per iteration: 18037000.00 flops
|
W(n) per iteration: 18037000.00 flops
|
||||||
Q(n) per iteration: 64112 bytes
|
Q(n) per iteration: 64112 bytes
|
||||||
I(n): 281.34 flops/byte
|
I(n): 281.34 flops/byte
|
||||||
W(n): 3607400000.00 flops
|
W(n): 3607400000.00 flops
|
||||||
T(n): 926036960.00 cycles
|
T(n): 2676205320.00 cycles
|
||||||
P(n): 3.90 flops/cycle
|
P(n): 1.35 flops/cycle
|
||||||
|
|
||||||
=== N_P=1000 N_ITER=200 ===
|
=== N_P=1000 N_ITER=200 ===
|
||||||
W(n) per iteration: 72074000.00 flops
|
W(n) per iteration: 72074000.00 flops
|
||||||
Q(n) per iteration: 128112 bytes
|
Q(n) per iteration: 128112 bytes
|
||||||
I(n): 562.59 flops/byte
|
I(n): 562.59 flops/byte
|
||||||
W(n): 14414800000.00 flops
|
W(n): 14414800000.00 flops
|
||||||
T(n): 3676943300.00 cycles
|
T(n): 10820544340.00 cycles
|
||||||
P(n): 3.92 flops/cycle
|
P(n): 1.33 flops/cycle
|
||||||
|
|
||||||
=== N_P=2000 N_ITER=200 ===
|
=== N_P=2000 N_ITER=200 ===
|
||||||
W(n) per iteration: 288148000.00 flops
|
W(n) per iteration: 288148000.00 flops
|
||||||
Q(n) per iteration: 256112 bytes
|
Q(n) per iteration: 256112 bytes
|
||||||
I(n): 1125.09 flops/byte
|
I(n): 1125.09 flops/byte
|
||||||
W(n): 57629600000.00 flops
|
W(n): 57629600000.00 flops
|
||||||
T(n): 14545721140.00 cycles
|
T(n): 44152816920.00 cycles
|
||||||
P(n): 3.96 flops/cycle
|
P(n): 1.31 flops/cycle
|
||||||
|
|
||||||
=== N_P=5000 N_ITER=200 ===
|
=== N_P=5000 N_ITER=200 ===
|
||||||
W(n) per iteration: 1800370000.00 flops
|
W(n) per iteration: 1800370000.00 flops
|
||||||
Q(n) per iteration: 640112 bytes
|
Q(n) per iteration: 640112 bytes
|
||||||
I(n): 2812.59 flops/byte
|
I(n): 2812.59 flops/byte
|
||||||
W(n): 360074000000.00 flops
|
W(n): 360074000000.00 flops
|
||||||
T(n): 90702048200.00 cycles
|
T(n): 300163261180.00 cycles
|
||||||
P(n): 3.97 flops/cycle
|
P(n): 1.20 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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<uint32_t>(y);
|
|
||||||
|
|
||||||
i = 0x5f3759df - (i >> 1);
|
|
||||||
|
|
||||||
y = bit_cast<float>(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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <arm_neon.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __x86_64__
|
|
||||||
#define SIMDE_ENABLE_NATIVE_ALIASES
|
|
||||||
#include <simde/arm/neon.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
#include <tuple>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#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<float> pos_x, pos_y;
|
|
||||||
alignas(64) vector<float> sb_sq;
|
|
||||||
alignas(64) vector<float> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<float> e_x, e_y;
|
|
||||||
alignas(64) vector<float> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<float> w_x, w_y;
|
|
||||||
alignas(64) vector<float> desired_v0;
|
|
||||||
alignas(64) vector<float> v_max;
|
|
||||||
alignas(64) vector<float> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<float> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<float> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<float> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<float> 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<tuple<int, int, float, float, float, float, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#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<double> pos_x, pos_y;
|
|
||||||
alignas(64) vector<double> sb_sq;
|
|
||||||
alignas(64) vector<double> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<double> e_x, e_y;
|
|
||||||
alignas(64) vector<double> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<double> w_x, w_y;
|
|
||||||
alignas(64) vector<double> desired_v0;
|
|
||||||
alignas(64) vector<double> v_max;
|
|
||||||
alignas(64) vector<double> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<double> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<double> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<double> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<double> 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<uint64_t>(y);
|
|
||||||
|
|
||||||
i = 0x5fe6eb50c7b537a9ULL - (i >> 1);
|
|
||||||
|
|
||||||
y = bit_cast<double>(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<tuple<int, int, double, double, double, double, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#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<double> pos_x, pos_y;
|
|
||||||
alignas(64) vector<double> sb_sq;
|
|
||||||
alignas(64) vector<double> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<double> e_x, e_y;
|
|
||||||
alignas(64) vector<double> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<double> w_x, w_y;
|
|
||||||
alignas(64) vector<double> desired_v0;
|
|
||||||
alignas(64) vector<double> v_max;
|
|
||||||
alignas(64) vector<double> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<double> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<double> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<double> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<double> 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<uint64_t>(y);
|
|
||||||
|
|
||||||
i = 0x5fe6eb50c7b537a9ULL - (i >> 1);
|
|
||||||
|
|
||||||
y = bit_cast<double>(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<tuple<int, int, double, double, double, double, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<double> pos_x, pos_y;
|
|
||||||
alignas(64) vector<double> sb_sq;
|
|
||||||
alignas(64) vector<double> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<double> e_x, e_y;
|
|
||||||
alignas(64) vector<double> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<double> w_x, w_y;
|
|
||||||
alignas(64) vector<double> desired_v0;
|
|
||||||
alignas(64) vector<double> v_max;
|
|
||||||
alignas(64) vector<double> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<double> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<double> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<double> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<double> 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<tuple<int, int, double, double, double, double, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
@@ -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 <immintrin.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#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<double> pos_x, pos_y;
|
|
||||||
alignas(64) vector<double> sb_sq;
|
|
||||||
alignas(64) vector<double> sb_e_x, sb_e_y;
|
|
||||||
alignas(64) vector<double> e_x, e_y;
|
|
||||||
alignas(64) vector<double> curr_vel_x, curr_vel_y;
|
|
||||||
alignas(64) vector<double> w_x, w_y;
|
|
||||||
alignas(64) vector<double> desired_v0;
|
|
||||||
alignas(64) vector<double> v_max;
|
|
||||||
alignas(64) vector<double> destination_x, destination_y;
|
|
||||||
alignas(64) vector<int> color;
|
|
||||||
|
|
||||||
Pedestrian *init_pedestrians(int n_p) {
|
|
||||||
|
|
||||||
#if RANDOM_SEED
|
|
||||||
random_device rd;
|
|
||||||
mt19937 gen(rd());
|
|
||||||
#else
|
|
||||||
mt19937 gen(SEED);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
normal_distribution<double> velocity_gen(v0_mean, v0_std_dev);
|
|
||||||
uniform_real_distribution<double> y_gen(0.3, BOARD_WIDTH - 0.3);
|
|
||||||
uniform_real_distribution<double> x_gen_left(2.0, BOARD_LENGTH / 2.0);
|
|
||||||
uniform_real_distribution<double> 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<tuple<int, int, double, double, double, double, int>> samples;
|
|
||||||
|
|
||||||
if (dump_path) {
|
|
||||||
samples.reserve(static_cast<size_t>(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;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user