From 191980027f9e963c6d1a6aacaef9dff642d26c17 Mon Sep 17 00:00:00 2001 From: Xudong Hao Date: Wed, 24 Dec 2025 09:00:11 +0800 Subject: [PATCH] BM/PMU: Support new SIMD sampling format Kernel patch series "Support SIMD/eGPRs/SSP registers sampling for perf" also change SIMD sampling format. https://lkml.org/lkml/2025/12/3/241 $perf record -I? available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 R30 R31 SSP XMM0-15 YMM0-15 ZMM0-31 OPMASK0-7 Signed-off-by: Xudong Hao --- BM/pmu/apebs_tests.sh | 34 +++++++++++++++++++++------------- BM/pmu/pmu_tests.sh | 12 ++++++++++-- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/BM/pmu/apebs_tests.sh b/BM/pmu/apebs_tests.sh index e0493637..fb5fcb26 100755 --- a/BM/pmu/apebs_tests.sh +++ b/BM/pmu/apebs_tests.sh @@ -26,16 +26,10 @@ usage() { __EOF } -lbr_test() { - level=$1 - perfdata="pebs.data" - logfile="temp.txt" - perf record -o "$perfdata" -b -e cycles:"$level" -a sleep 1 2> "$logfile" - sample_count=$(grep "sample" $logfile | awk '{print $10}' | tr -cd "0-9") - lbr_count=$(perf report -D -i $perfdata| grep -c "branch stack") - test_print_trc "sample_count = $sample_count; lbr_count = $lbr_count" - [[ $sample_count -eq 0 ]] && die "samples = 0!" - [[ $sample_count -eq $lbr_count ]] || die "samples does not match!" +clear_files() { + for i in "$@"; do + [[ -f $i ]] && test_print_trc "Remove file: $i" && rm "$i" + done; } lbr_test() { @@ -54,11 +48,25 @@ xmm_test() { level=$1 perfdata="pebs.data" logfile="temp.txt" - perf record -o "$perfdata" -IXMM0 -e cycles:"$level" -a sleep 1 2> "$logfile" + simdfile="simd.txt" + local reg_type=0 + perf record -I? 2>&1|tee $simdfile + grep 'XMM0-15' $simdfile > /dev/null && reg_type=0 + grep 'XMM0 XMM1' $simdfile > /dev/null && reg_type=1 + if [[ $reg_type -eq 0 ]]; then + xmm_reg="XMM" + mul=$((2 * 16)) + elif [[ $reg_type -eq 1 ]]; then + xmm_reg="XMM0" + mul=2 + fi + + perf record -o $perfdata -I${xmm_reg} -e cycles:"$level" -a sleep 1 2>&1|tee $logfile sample_count=$(grep "sample" $logfile | awk '{print $10}' | tr -cd "0-9") - count=$(perf report -D -i $perfdata| grep -c "XMM0") + count=$(perf report -D -i $perfdata| grep -c "${xmm_reg}") + clear_files $perfdata $logfile $simdfile test_print_trc "before sample_count = $sample_count; count = $count" - sample_count=$((sample_count * 2)) + sample_count=$((sample_count * mul)) test_print_trc "after sample_count = $sample_count; count = $count" [[ $sample_count -eq 0 ]] && die "samples = 0!" [[ $sample_count -eq $count ]] || die "samples does not match!" diff --git a/BM/pmu/pmu_tests.sh b/BM/pmu/pmu_tests.sh index 9389791c..7390b185 100755 --- a/BM/pmu/pmu_tests.sh +++ b/BM/pmu/pmu_tests.sh @@ -215,8 +215,16 @@ arch_pebs_gp_reg_group_test() { arch_pebs_xer_group_test() { level="p" -# reg_group_test_more_option "OPMASK0" "opmask0" 1 - reg_group_test_more_option "YMMH0" "YMMH0" 2 + simdfile="simd.txt" + do_cmd "perf record -I? 2>&1|tee $simdfile" + if grep 'YMM0-15' $simdfile > /dev/null; then + # All 16 YMM registers are recorded, so 4*16=64 + reg_group_test_more_option "YMM" "YMM" 64 + clear_files $simdfile + else + clear_files $simdfile + die "SIMD sampling format is incorrect!" + fi # reg_group_test_more_option "ZMMH0" "ZMMLH0" 4 }