Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions BM/pmu/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@
# Copyright (c) 2026 Intel Corporation.

CC = gcc
TARGET = rdpmc_user_disable_test
TARGET = rdpmc_user_disable_test pebs_mrt_workload

$(TARGET): rdpmc_user_disable_test.c
$(TARGET): rdpmc_user_disable_test.c pebs_mrt_workload.c

rdpmc_user_disable_test: rdpmc_user_disable_test.c
$(CC) -o $@ $<

pebs_mrt_workload: pebs_mrt_workload.c
$(CC) -O2 -pthread -o $@ $<

clean:
rm -f $(TARGET)
rm -f rdpmc_user_disable_test pebs_mrt_workload
139 changes: 124 additions & 15 deletions BM/pmu/apebs_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -45,26 +45,66 @@ lbr_test() {
[[ $sample_count -eq $count ]] || die "samples does not match!"
}

pebs_event_test() {
local event_name=$1
local level=$2
perfdata="pebs.data"
logfile="temp.txt"
clear_files $perfdata $logfile
event="${event_name}:$level"
benchmark="sleep 1"
perf record -o "$perfdata" -e "$event" -a $benchmark 2>&1|tee "$logfile"
sample_count=$(grep "sample" $logfile | awk '{print $10}' | tr -cd "0-9")
count=$(perf report -D -i $perfdata | grep -A 1 "$event_name" | grep "SAMPLE events" | awk '{print $3}')
clear_files $perfdata $logfile
test_print_trc "sample_count = $sample_count; count = $count"
[[ $sample_count -eq 0 ]] && die "samples = 0!"
[[ $sample_count -eq $count ]] || die "samples does not match!"
}

pebs_gp_counter_test() {
pebs_event_test "branches" "$1"
}

pebs_fixed_counter_test() {
pebs_event_test "instructions" "$1"
}

adaptive_pebs_msr_test() {
# MSR_IA32_PERF_CAPABILITIES(0x345) bit 14 indicates adaptive PEBS support.
bit_14=$(rdmsr 0x345 -f 14:14)
test_print_trc "MSR IA32_PERF_CAPABILITIES(0x345) bit 14 is: $bit_14"
[[ $bit_14 -eq 1 ]] || die "Adaptive PEBS msr bit is not set!"
}

xmm_test() {
level=$1
perfdata="pebs.data"
logfile="temp.txt"
simdfile="simd.txt"
local reg_type=0
local xmm_arg=""
local xmm_count=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"
xmm_arg="XMM"
mul=$((2 * 16))
elif [[ $reg_type -eq 1 ]]; then
xmm_reg="XMM0"
mul=2
xmm_arg=$(tr ' ,:()' '\n' < $simdfile | awk '
{ tok=toupper($0) }
tok ~ /^XMM[0-9]+$/ && !seen[tok]++ { list = list ? list "," tok : tok }
END { print list }
')
xmm_count=$(echo "$xmm_arg" | tr ',' '\n' | wc -l)
mul=$((2 * xmm_count))
fi

perf record -o $perfdata -I${xmm_reg} -e cycles:"$level" -a sleep 1 2>&1|tee $logfile

test_print_trc "XMM arg: $xmm_arg, mul: $mul"
perf record -o $perfdata -I${xmm_arg} -e cycles:"$level" -C 0 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 "${xmm_reg}")
count=$(perf report -D -i $perfdata| grep -c "XMM")
clear_files $perfdata $logfile $simdfile
test_print_trc "before sample_count = $sample_count; count = $count"
sample_count=$((sample_count * mul))
Expand All @@ -73,22 +113,70 @@ xmm_test() {
[[ $sample_count -eq $count ]] || die "samples does not match!"
}

pebs_gpr_test() {
level=$1
perfdata="pebs.data"
logfile="temp.txt"
regfile="reg.txt"
reportfile="report.txt"
gpr_regs=()
gpr_csv=""
clear_files $perfdata $logfile $regfile $reportfile

event="cycles:$level"
benchmark="sleep 1"

perf record -I? 2>&1|tee "$regfile"
gpr_csv=$(tr ' ,:()' '\n' < $regfile | awk '
{
tok=toupper($0)
if (tok == "" || tok == "SSP")
next
if (tok ~ /^(R[0-9]+|[ABCD]X|[SD]I|BP|SP|IP|FLAGS|[CDEFGS]S)$/ && !seen[tok]++)
list = list ? list "," tok : tok
}
END { print list }
')

[ -z "$gpr_csv" ] && die "The system doesn't expose supported GPR registers in perf -I? output!"
IFS=',' read -r -a gpr_regs <<< "$gpr_csv"
test_print_trc "Detected GPR list: $gpr_csv"

perf record -o "$perfdata" -I"${gpr_csv}" -e "$event" -C 0 $benchmark 2>&1|tee "$logfile"
sample_count=$(grep "sample" $logfile | awk '{print $10}' | tr -cd "0-9")
perf report -D -i "$perfdata" > "$reportfile"
count=0
for reg in "${gpr_regs[@]}"; do
reg_count=$(grep -v events "$reportfile" | grep -c "\. ${reg} ")
count=$((count + reg_count))
done
gpr_total=${#gpr_regs[@]}
test_print_trc "sample_count = $sample_count; gpr_total = $gpr_total; count = $count"
sample_count=$((sample_count * gpr_total))
test_print_trc "expected_gpr_records = $sample_count"
clear_files $perfdata $logfile $regfile $reportfile
[[ $sample_count -eq 0 ]] && die "samples = 0!"
[[ $sample_count -eq $count ]] || die "samples does not match!"
}

ip_test() {
level=$1
perfdata="pebs.data"
logfile="temp.txt"
task="mem-loads"
model=$(grep model /proc/cpuinfo | awk '{print $3}' | head -1)
[[ $model -eq 150 ]] && task="cycles"
[[ $model -eq 156 ]] && task="cycles"
test_print_trc "task=$task"
perf mem record -o "$perfdata" -t load -a sleep 1 2> "$logfile"
clear_files $perfdata $logfile

event="cycles:$level"
benchmark="sleep 1"

perf record -o "$perfdata" -e "$event" -a $benchmark 2>&1|tee "$logfile"
sample_count=$(grep "sample" $logfile | awk '{print $10}' | tr -cd "0-9")
count=$(perf report -D -i $perfdata| grep -c "data_src")
ip_count=$(perf script -i "$perfdata" -F ip | awk '$1 ~ /^[0-9a-fA-F]+$/ {c++} END {print c+0}')
nonzero_ip_count=$(perf script -i "$perfdata" -F ip | awk '$1 ~ /^[0-9a-fA-F]+$/ && $1 != "0" && $1 != "0000000000000000" {c++} END {print c+0}')
clear_files $perfdata $logfile
test_print_trc "sample_count = $sample_count; count = $count"
test_print_trc "sample_count = $sample_count; ip_count = $ip_count; nonzero_ip_count = $nonzero_ip_count"
[[ $sample_count -eq 0 ]] && die "samples = 0!"
[[ $sample_count -eq $count ]] || die "samples does not match!"
[[ $sample_count -eq $ip_count ]] || die "sample count does not match EventingIP count!"
[[ $ip_count -eq $nonzero_ip_count ]] || die "zero EventingIP was found in samples!"
}

data_src_test() {
Expand Down Expand Up @@ -123,6 +211,27 @@ apebs_test() {
xmm_2)
xmm_test P
;;
gpr_1)
pebs_gpr_test p
;;
gpr_2)
pebs_gpr_test P
;;
gp_counter_1)
pebs_gp_counter_test p
;;
gp_counter_2)
pebs_gp_counter_test P
;;
fixed_counter_1)
pebs_fixed_counter_test p
;;
fixed_counter_2)
pebs_fixed_counter_test P
;;
adaptive_pebs_msr)
adaptive_pebs_msr_test
;;
ip_1)
ip_test p
;;
Expand Down
Loading
Loading