diff --git a/scripts/sof-testbench-build-profile.sh b/scripts/sof-testbench-build-profile.sh new file mode 100755 index 000000000000..ca92f42a6f0d --- /dev/null +++ b/scripts/sof-testbench-build-profile.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-3-Clause + +set -e + +usage() { + echo "Usage: $0 " + echo " -d directory to place code profiling reports" + echo " -h shows this text" + echo " -p sets platform for scripts/rebuild-testbench.sh" + echo +} + +MODULES_S32="asrc dcblock drc drc_multiband eqfir eqiir gain src tdfb" +MODULES_S24="aria" + +if [ -z "${SOF_WORKSPACE}" ]; then + echo "Error: environment variable SOF_WORKSPACE need to be set to top level sof directory" + exit 1 +fi + +PLATFORM=none +PDIR=$SOF_WORKSPACE/sof/tools/testbench/profile + +while getopts "hp:d:" opt; do + case "${opt}" in + d) + PDIR=${OPTARG} + ;; + h) + usage + exit + ;; + p) + PLATFORM=${OPTARG} + ;; + *) + usage + exit + ;; + esac +done +shift $((OPTIND-1)) + +# Build +SCRIPTS=$SOF_WORKSPACE/sof/scripts +mkdir -p "$PDIR" +"$SCRIPTS"/rebuild-testbench.sh -p "$PLATFORM" + +echo "Profiler reports are stored to $PDIR" + +# Run sof-hda-generic.tplg playback +echo "Profiling sof-hda-generic.tplg ..." +sof-testbench-helper.sh -x -t production/sof-hda-generic.tplg -n 1,2 \ + -p "$PDIR/profile-$PLATFORM-generic.txt" > "$PDIR/log-$PLATFORM-generic.txt" + +# Run sof-hda-benchmark-generic.tplg playback +echo "Profiling sof-hda-benchmark-generic.tplg ..." +sof-testbench-helper.sh -x -t development/sof-hda-benchmark-generic.tplg -n 1,2,3 \ + -p "$PDIR/profile-$PLATFORM-benchmark.txt" > "$PDIR/log-$PLATFORM-benchmark.txt" + +# Profile modules +for mod in $MODULES_S32 +do + echo "Profiling $mod ..." + sof-testbench-helper.sh -x -m "$mod" -p "$PDIR/profile-$PLATFORM-$mod.txt" > "$PDIR/log-$PLATFORM-$mod.txt" +done + +for mod in $MODULES_S24 +do + echo "Profiling $mod ..." + sof-testbench-helper.sh -b 24 -x -m "$mod" -p "$PDIR/profile-$PLATFORM-$mod.txt" > "$PDIR/log-$PLATFORM-$mod.txt" +done diff --git a/scripts/sof-testbench-helper.sh b/scripts/sof-testbench-helper.sh new file mode 100755 index 000000000000..5de7d8d43a7b --- /dev/null +++ b/scripts/sof-testbench-helper.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-3-Clause + +set -e + +usage() { + echo "Usage: $0 " + echo "Options" + echo " -b , default 32" + echo " -c , default 2" + echo " -h shows this text" + echo " -i , default /usr/share/sounds/alsa/Front_Center.wav" + echo " -k keep temporary files in /tmp" + echo " -m , default gain" + echo " -n , default 1,2" + echo " -o , default none" + echo " -p , use with -x, default none" + echo " -r , default 48000" + echo " -t , default none, e.g. production/sof-hda-generic.tplg" + echo " -v runs with valgrind, not available with -x" + echo " -x runs testbench with xt-run simulator" + echo + echo "Example: run DRC with xt-run with profiling (slow)" + echo "$0 -x -m drc -p profile-drc32.txt" + echo + echo "Example: process with native build DRC file Front_Center.wav (fast)" + echo "$0 -m drc -i /usr/share/sounds/alsa/Front_Center.wav -o ~/tmp/Front_Center_with_DRC.wav" + echo + echo "Example: check component eqiir with valgrind" + echo "$0 -v -m eqiir" + echo +} + +if [ -z "${SOF_WORKSPACE}" ]; then + echo "Error: environment variable SOF_WORKSPACE need to be set to top level sof directory" + exit 1 +fi + +OUTWAV= +CLIP=/usr/share/sounds/alsa/Front_Center.wav +MODULE=gain +BITS=32 +RATE_IN=48000 +RATE_OUT=48000 +CHANNELS_IN=2 +CHANNELS_OUT=2 +PIPELINES="1,2" +INFILE1=$(mktemp --tmpdir=/tmp in-XXXX.raw) +OUTFILE1=$(mktemp --tmpdir=/tmp out-XXXX.raw) +TRACEFILE=$(mktemp --tmpdir=/tmp trace-XXXX.txt) +PROFILEOUT=$(mktemp --tmpdir=/tmp profile-XXXX.out) +KEEP_TMP=false +XTRUN=false +PROFILE=false +TPLG0= +VALGRIND= + +while getopts "b:c:hi:km:n:o:p:r:t:vx" opt; do + case "${opt}" in + b) + BITS=${OPTARG} + ;; + c) + CHANNELS_IN=${OPTARG} + CHANNELS_OUT=${OPTARG} + ;; + h) + usage + exit + ;; + i) + CLIP=${OPTARG} + ;; + k) + KEEP_TMP=true + ;; + m) + MODULE=${OPTARG} + ;; + n) + PIPELINES=${OPTARG} + ;; + o) + OUTWAV=${OPTARG} + ;; + p) + PROFILETXT=${OPTARG} + PROFILE=true + ;; + r) + RATE_IN=${OPTARG} + RATE_OUT=${OPTARG} + ;; + t) + TPLG0=${OPTARG} + ;; + v) + VALGRIND=valgrind + ;; + x) + XTRUN=true + ;; + *) + usage + exit + ;; + esac +done +shift $((OPTIND-1)) + +echo Converting clip "$CLIP" to raw input +if [[ "$BITS" == "24" ]]; then + # Sox does not support S24_4LE format + # Note gain 0.00390615 is empically find just a bit lower gain than + # 1/256 = 0.00390625 that doesn't cause sox rounding to exceed + # INT24_MIN .. INT24_MAX range. + sox --encoding signed-integer "$CLIP" -L -r "$RATE_IN" -c "$CHANNELS_IN" -b 32 "$INFILE1" vol 0.00390615 +else + sox --encoding signed-integer "$CLIP" -L -r "$RATE_IN" -c "$CHANNELS_IN" -b "$BITS" "$INFILE1" +fi + +TB4="$SOF_WORKSPACE/sof/tools/testbench/build_testbench/install/bin/sof-testbench4" +XTB4="$SOF_WORKSPACE/sof/tools/testbench/build_xt_testbench/sof-testbench4" +XTB4_SETUP="$SOF_WORKSPACE/sof/tools/testbench/build_xt_testbench/xtrun_env.sh" +if [ -z "$TPLG0" ]; then + TPLG="$SOF_WORKSPACE/sof/tools/build_tools/topology/topology2/development/sof-hda-benchmark-${MODULE}${BITS}.tplg" +else + TPLG="$SOF_WORKSPACE/sof/tools/build_tools/topology/topology2/$TPLG0" +fi +FMT="S${BITS}_LE" +OPTS="-r $RATE_IN -R $RATE_OUT -c $CHANNELS_IN -c $CHANNELS_OUT -b $FMT -p $PIPELINES -t $TPLG -i $INFILE1 -o $OUTFILE1" + +if [ ! -f "$TPLG" ]; then + echo "Error: Topology $TPLG is not found" + echo "Build with scripts/build-tools.sh -Y" + exit 1 +fi + +if [[ "$XTRUN" == true ]]; then + if [ ! -x "$XTB4" ]; then + echo "Error: No executable found from $XTB4" + echo "Build with scripts/rebuild-testbench.sh -p " + exit 1 + fi + echo "Running xtensa testbench" + echo " topology: $TPLG" + echo " input: $INFILE1, output: $OUTFILE1, trace: $TRACEFILE, profile: $PROFILETXT" + source "$XTB4_SETUP" + if [[ $PROFILE == true ]]; then + "$XTENSA_PATH"/xt-run --profile="$PROFILEOUT" "$XTB4" $OPTS 2> "$TRACEFILE" + "$XTENSA_PATH"/xt-gprof "$XTB4" "$PROFILEOUT" > "$PROFILETXT" + else + "$XTENSA_PATH"/xt-run "$XTB4" $OPTS 2> "$TRACEFILE" + fi +else + if [ ! -x "$TB4" ]; then + echo "Error: No executable found from $TB4" + exit 1 + fi + echo "Running testbench" + echo " topology: $TPLG" + echo " input: $INFILE1, output: $OUTFILE1, trace: $TRACEFILE" + $VALGRIND "$TB4" $OPTS 2> "$TRACEFILE" || { + cat "$TRACEFILE" + exit $? + } + if [ -n "$VALGRIND" ]; then + cat "$TRACEFILE" + fi +fi + +if [ -n "$OUTWAV" ]; then + echo Converting raw output to "$OUTWAV" + if [[ "$BITS" == "24" ]]; then + sox --encoding signed-integer -L -r "$RATE_OUT" -c "$CHANNELS_OUT" -b 32 "$OUTFILE1" "$OUTWAV" vol 256 + else + sox --encoding signed-integer -L -r "$RATE_OUT" -c "$CHANNELS_OUT" -b "$BITS" "$OUTFILE1" "$OUTWAV" + fi +fi + +if [[ "$KEEP_TMP" == false ]]; then + echo Deleting temporary files + rm -f "$INFILE1" "$OUTFILE1" "$TRACEFILE" "$PROFILEOUT" +fi