|
|
|
|
@ -48,6 +48,11 @@ STEM="${BASE%.sy}"
|
|
|
|
|
INPUT_DIR="$(dirname "$(realpath "$INPUT")")"
|
|
|
|
|
TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
|
|
|
|
|
|
|
|
|
|
# 与 run_baseline.sh 一致的路径键:去掉 test/ 前缀和 .sy 后缀
|
|
|
|
|
REL="$(realpath --relative-to="$REPO_ROOT" "$INPUT" 2>/dev/null || echo "$INPUT")"
|
|
|
|
|
CASE_KEY="${REL#test/}"
|
|
|
|
|
CASE_KEY="${CASE_KEY%.sy}"
|
|
|
|
|
|
|
|
|
|
if [[ $# -ge 2 ]]; then
|
|
|
|
|
OUT_DIR="$2"
|
|
|
|
|
else
|
|
|
|
|
@ -162,26 +167,28 @@ GCC_ASM_LINES=0
|
|
|
|
|
GCC_ELAPSED_RAW="" # 秒,无 s 后缀
|
|
|
|
|
|
|
|
|
|
if [[ -f "$BASELINE_TSV_PATH" ]]; then
|
|
|
|
|
GCC_ELAPSED_RAW=$(awk -F'\t' -v s="$STEM" '$1==s{v=$2} END{if(v!="") print v}' \
|
|
|
|
|
GCC_ELAPSED_RAW=$(awk -F'\t' -v s="$CASE_KEY" '$1==s{v=$2} END{if(v!="") print v}' \
|
|
|
|
|
"$BASELINE_TSV_PATH" 2>/dev/null || true)
|
|
|
|
|
if [[ -n "$GCC_ELAPSED_RAW" ]]; then
|
|
|
|
|
GCC_OK=true
|
|
|
|
|
rpt_color "$GREEN" "baseline timing: ${GCC_ELAPSED_RAW}s"
|
|
|
|
|
else
|
|
|
|
|
rpt_color "$YELLOW" "WARNING: no baseline entry for '$STEM'"
|
|
|
|
|
rpt_color "$YELLOW" "WARNING: no baseline entry for '$CASE_KEY'"
|
|
|
|
|
rpt " Run: scripts/run_baseline.sh"
|
|
|
|
|
fi
|
|
|
|
|
# 复制汇编文件
|
|
|
|
|
if [[ -f "$BASELINE_DATA_DIR/$STEM.gcc.s" ]]; then
|
|
|
|
|
cp "$BASELINE_DATA_DIR/$STEM.gcc.s" "$GCC_ASM"
|
|
|
|
|
# 复制汇编文件(路径镜像结构)
|
|
|
|
|
local_gcc_asm="$BASELINE_DATA_DIR/${CASE_KEY}.gcc.s"
|
|
|
|
|
if [[ -f "$local_gcc_asm" ]]; then
|
|
|
|
|
cp "$local_gcc_asm" "$GCC_ASM"
|
|
|
|
|
GCC_ASM_LINES=$(wc -l < "$GCC_ASM")
|
|
|
|
|
rpt "GCC ASM: $GCC_ASM ($GCC_ASM_LINES lines)"
|
|
|
|
|
else
|
|
|
|
|
rpt_color "$YELLOW" "GCC ASM not found in baseline dir"
|
|
|
|
|
rpt_color "$YELLOW" "GCC ASM not found in baseline dir: $local_gcc_asm"
|
|
|
|
|
fi
|
|
|
|
|
# 复制输出文件(供步骥5 diff)
|
|
|
|
|
if [[ -f "$BASELINE_DATA_DIR/$STEM.gcc.out" ]]; then
|
|
|
|
|
cp "$BASELINE_DATA_DIR/$STEM.gcc.out" "$GCC_OUT"
|
|
|
|
|
# 复制输出文件(供步骤5 diff)
|
|
|
|
|
local_gcc_out="$BASELINE_DATA_DIR/${CASE_KEY}.gcc.out"
|
|
|
|
|
if [[ -f "$local_gcc_out" ]]; then
|
|
|
|
|
cp "$local_gcc_out" "$GCC_OUT"
|
|
|
|
|
rpt "GCC output: $GCC_OUT"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
@ -199,24 +206,25 @@ run_and_time() {
|
|
|
|
|
local label="$1"
|
|
|
|
|
local exe="$2"
|
|
|
|
|
local out_file="$3"
|
|
|
|
|
local time_file="$4"
|
|
|
|
|
local timeout_sec="${5:-60}"
|
|
|
|
|
local timeout_sec="${4:-60}"
|
|
|
|
|
local stdout_file="$out_file.raw"
|
|
|
|
|
local status=0
|
|
|
|
|
|
|
|
|
|
local _t0 _t1 _ns
|
|
|
|
|
_t0=$(date +%s%N)
|
|
|
|
|
set +e
|
|
|
|
|
if [[ -f "$STDIN_FILE" ]]; then
|
|
|
|
|
timeout "$timeout_sec" \
|
|
|
|
|
/usr/bin/time -f "%e" -o "$time_file" \
|
|
|
|
|
qemu-aarch64 -L /usr/aarch64-linux-gnu "$exe" \
|
|
|
|
|
< "$STDIN_FILE" > "$stdout_file" 2>/dev/null
|
|
|
|
|
else
|
|
|
|
|
timeout "$timeout_sec" \
|
|
|
|
|
/usr/bin/time -f "%e" -o "$time_file" \
|
|
|
|
|
qemu-aarch64 -L /usr/aarch64-linux-gnu "$exe" \
|
|
|
|
|
> "$stdout_file" 2>/dev/null
|
|
|
|
|
fi
|
|
|
|
|
status=$?
|
|
|
|
|
_t1=$(date +%s%N)
|
|
|
|
|
_ns=$((_t1 - _t0))
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
# 将 stdout + exit_code 合并为 .out(与 verify_asm.sh 格式一致)
|
|
|
|
|
@ -229,26 +237,27 @@ run_and_time() {
|
|
|
|
|
} > "$out_file"
|
|
|
|
|
rm -f "$stdout_file"
|
|
|
|
|
|
|
|
|
|
local elapsed="timeout"
|
|
|
|
|
[[ $status -ne 124 ]] && elapsed="$(cat "$time_file" 2>/dev/null || echo "?")s"
|
|
|
|
|
|
|
|
|
|
local elapsed
|
|
|
|
|
if [[ $status -eq 124 ]]; then
|
|
|
|
|
rpt_color "$YELLOW" "$label: TIMEOUT (>${timeout_sec}s)"
|
|
|
|
|
elif [[ $status -ne 0 ]]; then
|
|
|
|
|
rpt_color "$YELLOW" "$label: exit $status elapsed=${elapsed}"
|
|
|
|
|
elapsed="timeout"
|
|
|
|
|
rpt_color "$YELLOW" "$label: TIMEOUT (>${timeout_sec}s)" >&2
|
|
|
|
|
else
|
|
|
|
|
rpt_color "$GREEN" "$label: OK elapsed=${elapsed}"
|
|
|
|
|
elapsed=$(awk "BEGIN{printf \"%.5f\", $_ns / 1000000000}")
|
|
|
|
|
if [[ $status -ne 0 ]]; then
|
|
|
|
|
rpt_color "$YELLOW" "$label: exit $status elapsed=${elapsed}s" >&2
|
|
|
|
|
else
|
|
|
|
|
rpt_color "$GREEN" "$label: OK elapsed=${elapsed}s" >&2
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
echo "$elapsed"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OUR_OUT="$OUT_DIR/$STEM.our.out"
|
|
|
|
|
OUR_TIME_FILE="$OUT_DIR/$STEM.our.time"
|
|
|
|
|
|
|
|
|
|
TIMEOUT_SEC=60
|
|
|
|
|
[[ "$INPUT" == *"/performance/"* || "$INPUT" == *"/h_performance/"* ]] && TIMEOUT_SEC=300
|
|
|
|
|
|
|
|
|
|
OUR_ELAPSED=$(run_and_time "our compiler" "$OUR_ELF" "$OUR_OUT" "$OUR_TIME_FILE" "$TIMEOUT_SEC")
|
|
|
|
|
OUR_ELAPSED=$(run_and_time "our compiler" "$OUR_ELF" "$OUR_OUT" "$TIMEOUT_SEC")
|
|
|
|
|
|
|
|
|
|
# GCC 耗时直接读取基线数据,不重新运行
|
|
|
|
|
GCC_ELAPSED="N/A"
|
|
|
|
|
@ -305,7 +314,7 @@ rpt "$(printf '%-20s %s' 'GCC time:' "$GCC_ELAPSED")"
|
|
|
|
|
if [[ "$GCC_ELAPSED" != "N/A" && "$GCC_ELAPSED" != "timeout" && "$OUR_ELAPSED" != "timeout" ]]; then
|
|
|
|
|
OUR_S="${OUR_ELAPSED%s}"
|
|
|
|
|
GCC_S="${GCC_ELAPSED%s}"
|
|
|
|
|
SPEEDUP=$(awk "BEGIN{if($OUR_S>0) printf \"%.3f\", $GCC_S/$OUR_S; else print \"inf\"}")
|
|
|
|
|
SPEEDUP=$(awk "BEGIN{if($OUR_S>0) printf \"%.5f\", $GCC_S/$OUR_S; else print \"inf\"}")
|
|
|
|
|
rpt "$(printf '%-20s %sx' 'Speedup (gcc/ours):' "$SPEEDUP")"
|
|
|
|
|
fi
|
|
|
|
|
rpt ""
|
|
|
|
|
|