#!/bin/bash set -u set -o pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' COMPILER=./build/bin/compiler TESTS=( "huffman-01" "huffman-02" "huffman-03" "many_mat_cal-1" "many_mat_cal-2" "many_mat_cal-3" "h-1-01" "h-1-02" "h-1-03" "fft0" "fft1" "fft2" "matmul1" "matmul2" "matmul3" "conv2d-1" "conv2d-2" "conv2d-3" "shuffle0" "shuffle1" "shuffle2" "sl1" "sl2" "sl3" "crypto-1" "crypto-2" "crypto-3" "crc1" "crc2" "crc3" "h-4-01" "h-4-02" "h-4-03" "h-5-01" "h-5-02" "h-5-03" "h-8-01" "h-8-02" "h-8-03" "h-9-01" "h-9-02" "h-9-03" "h-10-01" "h-10-02" "h-10-03" "knapsack_naive-1" "knapsack_naive-2" "knapsack_naive-3" "optimization_scheduling1" "optimization_scheduling2" "optimization_scheduling3" "transpose0" "transpose1" "transpose2" "03_sort1" "03_sort2" "03_sort3" "01_mm1" "01_mm2" "01_mm3" ) BASELINE_FILE="./指令数基线.md" RESULT_DIR="./.count_results" JOBS=$(nproc 2>/dev/null || echo 4) # ============================================================ # Worker: 编译单个测试并计数 # ============================================================ run_one_count() { local idx="$1" name="$2" local result_file="$RESULT_DIR/$idx" local tmp_asm="$RESULT_DIR/.tmp_${idx}.s" set +e timeout --signal=KILL 60 "$COMPILER" -S -O -o "$tmp_asm" "2026test/performance/${name}.sy" 2>/dev/null local lines lines=$(wc -l < "$tmp_asm" 2>/dev/null) lines=${lines:-0} rm -f "$tmp_asm" set -e printf 'TEST=%s\nLINES=%s\n' "$name" "$lines" > "$result_file" } # ============================================================ # 构建带索引的测试队列 # ============================================================ declare -a TEST_QUEUE=() for i in "${!TESTS[@]}"; do TEST_QUEUE+=("$i|${TESTS[$i]}") done mkdir -p "$RESULT_DIR" wall_start=$(date +%s%3N 2>/dev/null || date +%s000) # ============================================================ # 并行执行编译(或串行 fallback) # ============================================================ if [[ $JOBS -gt 1 && ${#TEST_QUEUE[@]} -gt 1 ]]; then export RESULT_DIR COMPILER export -f run_one_count printf '%s\n' "${TEST_QUEUE[@]}" | xargs -P "$JOBS" -L 1 bash -c ' IFS="|" read -r idx name <<< "$1" run_one_count "$idx" "$name" ' _ else for item in "${TEST_QUEUE[@]}"; do IFS='|' read -r idx name <<< "$item" run_one_count "$idx" "$name" done fi wall_end=$(date +%s%3N 2>/dev/null || date +%s000) wall_elapsed=$((wall_end - wall_start)) # ============================================================ # 汇总结果(串行处理基线对比和文件更新) # ============================================================ UPDATED=0 TOTAL_TESTS=0 echo "=== 指令数测试 ===" for item in "${TEST_QUEUE[@]}"; do IFS='|' read -r idx name <<< "$item" result_file="$RESULT_DIR/$idx" if [[ ! -f "$result_file" ]]; then echo -e "${RED}performance/${name}: 编译失败/超时${NC}" continue fi test_name=$(grep '^TEST=' "$result_file" | cut -d= -f2) lines=$(grep '^LINES=' "$result_file" | cut -d= -f2) if [[ ! "$lines" =~ ^[0-9]+$ ]]; then echo -e "${RED}performance/${name}: 指令数异常 (${lines})${NC}" continue fi TOTAL_TESTS=$((TOTAL_TESTS + 1)) baseline=$(grep "performance/${name}" "$BASELINE_FILE" 2>/dev/null | grep -oP '\|\s*\d+\s*\|' | grep -oP '\d+' | head -1) if [[ -n "$baseline" && "$baseline" =~ ^[0-9]+$ ]]; then if [[ "$lines" -lt "$baseline" ]]; then diff=$((baseline - lines)) echo -e "performance/${name}: ${lines} ${GREEN}(基线:${baseline} 减少${diff}行) <- 更新基线${NC}" sed -i "s/| performance\/${name} | ${baseline} |/| performance\/${name} | ${lines} |/" "$BASELINE_FILE" UPDATED=$((UPDATED + 1)) elif [[ "$lines" -gt "$baseline" ]]; then echo -e "performance/${name}: ${lines} ${RED}(基线:${baseline} 增加$((lines - baseline))行)${NC}" else echo "performance/${name}: ${lines} (基线:${baseline} 持平)" fi else echo "performance/${name}: ${lines}" fi done # ============================================================ # 清理 # ============================================================ rm -rf "$RESULT_DIR" echo "" echo -e "${BLUE}总耗时: ${wall_elapsed}ms | 测试: ${TOTAL_TESTS}/${#TESTS[@]}${NC}" if [[ $UPDATED -gt 0 ]]; then echo -e "${GREEN}已更新 ${UPDATED} 个测试集的指令数基线${NC}" fi