85ROOT_DIR=
"$(cd "$(dirname
"${BASH_SOURCE[0]}")/..
" && pwd)"
86export PYTHONPATH=
"$ROOT_DIR:$PYTHONPATH"
91DEFAULT_TRIALS=100000000
92ALL_METHODS=(
"Sequential" "Heap" "Pool" "SIMD")
93SCRIPT_DIR=
"$(cd "$(dirname
"${BASH_SOURCE[0]}")
" && pwd)"
94BATCHID=$(uuidgen | cut -d
'-' -f1)
95BUILD_PATH=
"./build/montecarlo"
96GLOBAL_TIMESTAMP=$(date
"+%Y-%m-%d_%H-%M-%S")
105if [[
"$ARG3" ==
"insert_db=false" ]]; then
109if [[ -z
"$ARG1" && -z
"$ARG2" ]]; then
110 TRIALS=$DEFAULT_TRIALS
111 METHODS=(
"${ALL_METHODS[@]}")
112elif [[
"$ARG1" =~ ^[0-9]+$ && -z
"$ARG2" ]]; then
114 METHODS=(
"${ALL_METHODS[@]}")
115elif [[
"$ARG1" =~ ^[a-zA-Z]+$ && -z
"$ARG2" ]]; then
116 TRIALS=$DEFAULT_TRIALS
124echo
"[INFO] Trials : $TRIALS"
125echo
"[INFO] Methods : ${METHODS[*]}"
126echo
"[INFO] Batch ID : $BATCHID"
127echo
"[INFO] Timestamp: $GLOBAL_TIMESTAMP"
129LOG_DIR=
"db/logs/batch_${BATCHID}_${GLOBAL_TIMESTAMP}"
134PERF_EVENTS+=
"cycles,instructions,"
135PERF_EVENTS+=
"cache-references,cache-misses,"
136PERF_EVENTS+=
"branch-instructions,branch-misses,"
137PERF_EVENTS+=
"L1-dcache-loads,L1-dcache-load-misses,"
138PERF_EVENTS+=
"dTLB-loads,dTLB-load-misses"
140echo
"[INFO] Using perf events:"
141echo
"$PERF_EVENTS" | tr
',' '\n' | sed
's/^/ - /'
144for METHOD
in "${METHODS[@]}"; do
145 METHOD_TIMESTAMP=$(date +
"%Y-%m-%d %H:%M:%S")
146 echo
"[▶] Running: $METHOD"
148 LOG_PATH=
"$LOG_DIR/perf_${METHOD}_${METHOD_TIMESTAMP}.csv"
149 PERF_PARQUET=
"$LOG_DIR/perf_results_${METHOD}_${METHOD_TIMESTAMP}_${BATCHID}.parquet"
151 mkdir -p
"$(dirname "$LOG_PATH
")"
153 START_NS=$(date +%s%N)
154 perf stat -x, -o
"$LOG_PATH" -e $PERF_EVENTS
"$BUILD_PATH" "$TRIALS" "$METHOD" > /dev/null
157 WALL_NS=$((END - START_NS))
158 WALL_S=$(awk
"BEGIN {printf \"%.6f\", $WALL_NS / 1000000000}")
161 eval
"$(python3 pipeline/parse_perf_metrics.py "$LOG_PATH
" "$TRIALS
")"
163 python3 pipeline/gen_perf_parquet_logs.py \
164 --out_path
"$PERF_PARQUET" \
165 --wall_time_s
"$WALL_S" \
166 --wall_time_ns
"$WALL_NS" \
167 --timestamp
"$METHOD_TIMESTAMP" \
168 --batchid
"$BATCHID" \
174 --cache_loads
"$CACHE_LOADS" \
175 --cache_miss
"$CACHE_MISS" \
176 --l1_loads
"$L1_LOADS" \
177 --l1_misses
"$L1_MISSES" \
178 --l2_loads
"$L2_LOADS" \
179 --l2_misses
"$L2_MISSES" \
180 --l3_loads
"$L3_LOADS" \
181 --l3_misses
"$L3_MISSES" \
182 --tlb_loads
"$TLB_LOADS" \
183 --tlb_misses
"$TLB_MISSES" \
184 --branch_instr
"$BRANCH_INSTR" \
185 --branch_misses
"$BRANCH_MISSES" \
186 --miss_per_trial
"$MISS_PER_TRIAL" \
187 --cycles_per_trial
"$CYCLES_PER_TRIAL"
190python3 pipeline/combine_batch_parquets.py \
192 "$LOG_DIR/perf_results_all_${BATCHID}.parquet"
194if [
"$INSERT_DB" = true ]; then
195 python3 pipeline/insert_to_clickhouse.py \
198 echo
"[INFO] Skipping ClickHouse insertion (insert_db=false)"
201echo
"[INFO] Simulation Finished:"
202echo
" └─ Exported CSV & Parquet logs to : $LOG_DIR"
203echo
" └─ Combined batch Parquet logs : $LOG_DIR/perf_results_all_${BATCHID}.parquet"