Files
rocm-systems/bin/rocprofv2
T
Saurabh Verma 8f82ff6a46 MI300 counters support for rocprof and rocprofv2(Accumulation from all xccs)
1. Xml files updated for gfx940 counters
2. File plugin changes to allow rocprofv2 backward compatibility for results.csv
3. Changes in rocprofv2 script to use tblextr.py, to generate results.csv just like rocprof

Change-Id: I7798f4411ce01f6fbfffb126de654ed806ca7045
(cherry picked from commit 86cbaf38c436be876f0426fa27803b1e64d90378)
2023-05-30 21:41:54 -05:00

330 lines
11 KiB
Bash
Executable File

#!/bin/bash
CURRENT_DIR="$( dirname -- "$0"; )";
ROCPROFV2_DIR=$(dirname -- $(realpath ${BASH_SOURCE[0]}));
ROCM_DIR=$(dirname -- ${ROCPROFV2_DIR})
ROCM_PATH="${ROCM_PATH:=/opt/rocm}"
PLUGIN_LIST=("ctf" "perfetto" "file" "att")
RUN_FROM_BUILD=0
if [[ $ROCPROFV2_DIR == *"/build"* ]]; then
RUN_FROM_BUILD=1
elif [[ $ROCPROFV2_DIR == *"/rocprofiler"* ]]; then
RUN_FROM_BUILD=1
ROCM_DIR=$ROCPROFV2_DIR
fi
usage() {
echo -e "ROCProfilerV2 Run Script Usage:"
echo -e "-h | --help For showing this message"
echo -e "--list-counters For showing all available counters for the current GPUs"
if [ $RUN_FROM_BUILD == 1 ]; then
echo -e "-b | --build For compiling"
echo -e "-cb | --clean-build For full clean build"
echo -e "-t | --test For Running the tests"
echo -e "-ct | --clean-build-test For Running the tests after a clean build"
echo -e "-mt | --mem-test For Running the Memory Leak tests. This run requires building using -acb | --asan-clean-build option"
echo -e "-acb | --asan-clean-build For compiling with ASAN library attached"
echo -e "--install For installing ROCProfilerV2 without clean build in the default installation folder (review build.sh to know more about the default paths)"
echo -e "--clean-install For installing ROCProfilerV2 with new clean build in the default installation folder (review build.sh to know more about the default paths)"
fi
echo -e "--hip-api For Collecting HIP API Traces"
echo -e "--hip-activity | --hip-trace For Collecting HIP API Activities Traces"
echo -e "--hsa-api For Collecting HSA API Traces"
echo -e "--hsa-activity | --hsa-trace For Collecting HSA API Activities Traces"
echo -e "--roctx-trace For Collecting ROCTx Traces"
echo -e "--kernel-trace For Collecting Kernel dispatch Traces"
echo -e "--sys-trace For Collecting HIP and HSA APIs and their Activities Traces along ROCTX and Kernel Dispatch traces"
echo -e "--plugin PLUGIN_NAME For enabling a plugin (file/perfetto/att/ctf)"
echo -e "-i | --input For adding counters file path (every line in the text file represents a counter)"
echo -e "-o | --output-file For the output file name"
echo -e "-d | --output-directory For adding output path where the output files will be saved"
echo -e "-fi | --flush-interval For adding a flush interval in milliseconds, every \"flush interval\" the buffers will be flushed"
exit 1
}
if [ -z "$1" ] ; then
usage
exit 1
fi
while [ 1 ] ; do
if [[ "$1" = "-h" || "$1" = "--help" ]] ; then
usage
exit 1
elif [[ "$1" = "-b" || "$1" = "--build" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
TO_CLEAN=no ./build.sh
exit 1
fi
elif [[ "$1" = "-acb" || "$1" = "--asan-clean-build" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
ASAN=yes TO_CLEAN=yes ./build.sh
exit 1
fi
elif [[ "$1" = "-cb" || "$1" = "--clean-build" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
TO_CLEAN=yes ./build.sh
exit 1
fi
elif [[ "$1" = "-t" || "$1" = "--test" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
export ROCPROFILER_METRICS_PATH=$ROCM_DIR/build/counters/derived_counters.xml
TO_CLEAN=no $ROCM_DIR/build.sh
if [ "$CURRENT_DIR/build" -ef "./build" ] ; then
./run_tests.sh
else
pushd build
./run_tests.sh
fi
exit 1
fi
elif [[ "$1" = "-mt" || "$1" = "--mem-test" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
ASAN=yes TO_CLEAN=yes ./build.sh
./tests/memorytests/run_asan_tests.sh $ROCM_DIR/build/tests/featuretests/profiler/gtests/apps/hip_vectoradd $ROCM_DIR/build/memleaks.log
exit 1
fi
elif [[ "$1" = "-ct" || "$1" = "--clean-build-test" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
TO_CLEAN=yes $ROCM_DIR/build.sh
if [ "$CURRENT_DIR/build" -ef "./build" ] ; then
./run_tests.sh
else
pushd build
./run_tests.sh
fi
exit 1
fi
elif [[ "$1" = "--install" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
TO_CLEAN=no $ROCM_DIR/build.sh
pushd build
make install
exit 1
fi
elif [[ "$1" = "--clean-install" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
TO_CLEAN=yes $ROCM_DIR/build.sh
pushd build
make install
exit 1
fi
elif [[ "$1" = "--list-counters" ]] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
export ROCPROFILER_METRICS_PATH=$ROCM_DIR/build/counters/derived_counters.xml
eval $ROCM_DIR/build/src/tools/ctrl
else
export ROCPROFILER_METRICS_PATH=$ROCPROFV2_DIR/../libexec/rocprofiler/counters/derived_counters.xml
export LD_LIBRARY_PATH=$ROCPROFV2_DIR/../lib:$LD_LIBRARY_PATH
export LD_PRELOAD=$ROCPROFV2_DIR/../lib/librocprofiler_tool.so
eval $ROCPROFV2_DIR/../libexec/rocprofiler/ctrl
fi
exit 1
elif [[ "$1" = "-i" || "$1" = "--input" ]] ; then
if [ $2 ] && [ -n $2 ] && [ -r $2 ] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
export ROCPROFILER_METRICS_PATH=$ROCM_DIR/build/counters/derived_counters.xml
else
export ROCPROFILER_METRICS_PATH=$ROCPROFV2_DIR/../libexec/rocprofiler/counters/derived_counters.xml
fi
export COUNTERS_PATH=$2
else
echo -e "Error: \"$2\" doesn't exist!"
usage
exit 1
fi
shift
shift
elif [[ "$1" = "-o" || "$1" = "--output-file-name" ]] ; then
if [ $2 ] ; then
export OUT_FILE_NAME=$2
else
usage
exit 1
fi
shift
shift
elif [[ "$1" = "-d" || "$1" = "--output-directory" ]] ; then
if [ $2 ] ; then
mkdir -p $2
export OUTPUT_PATH=$2
OUTPUT_PATH_INTERNAL=$2
else
usage
exit 1
fi
shift
shift
elif [[ "$1" = "-fi" || "$1" = "--flush-interval" ]] ; then
if [ $2 ] && [ $2 -gt 0 ] ; then
export ROCPROFILER_FLUSH_INTERVAL=$2
else
echo -e "Wrong input \"$2\" for flush interval, it needs to be integer greater than zero!"
usage
exit 1
fi
shift
shift
elif [ "$1" = "--hip-api" ] ; then
export ROCPROFILER_HIP_API_TRACE=1
shift
elif [[ "$1" = "--hip-activity" || "$1" = "--hip-trace" ]] ; then
export ROCPROFILER_HIP_API_TRACE=1
export ROCPROFILER_HIP_ACTIVITY_TRACE=1
shift
elif [ "$1" = "--hsa-api" ] ; then
export ROCPROFILER_HSA_API_TRACE=1
shift
elif [[ "$1" = "--hsa-activity" || "$1" = "--hsa-trace" ]] ; then
export ROCPROFILER_HSA_API_TRACE=1
export ROCPROFILER_HSA_ACTIVITY_TRACE=1
shift
elif [ "$1" = "--roctx-trace" ] ; then
export ROCPROFILER_ROCTX_TRACE=1
shift
elif [ "$1" = "--kernel-trace" ] ; then
export ROCPROFILER_KERNEL_TRACE=1
shift
elif [ "$1" = "--sys-trace" ] ; then
export ROCPROFILER_HIP_API_TRACE=1
export ROCPROFILER_HIP_ACTIVITY_TRACE=1
export ROCPROFILER_HSA_API_TRACE=1
export ROCPROFILER_HSA_ACTIVITY_TRACE=1
export ROCPROFILER_ROCTX_TRACE=1
export ROCPROFILER_KERNEL_TRACE=1
shift
elif [ "$1" = "--roc-sys" ] ; then
export ROCPROFILER_ENABLE_AMDSYS=$2
shift
shift
elif [ "$1" = "--plugin" ] ; then
if [ -n $2 ] ; then
PLUGIN=$2
if [[ ! "${PLUGIN_LIST[*]}" =~ $PLUGIN ]]; then
echo -e "Wrong input \"$2\" for plugin!"
usage
exit 1
fi
if [ $RUN_FROM_BUILD == 1 ]; then
export ROCPROFILER_PLUGIN_LIB=lib${PLUGIN}_plugin.so
else
export ROCPROFILER_PLUGIN_LIB=lib${PLUGIN}_plugin.so
fi
else
echo -e "Wrong input \"$2\" for plugin!"
usage
exit 1
fi
if [ "$2" = "att" ] ; then
if [ $RUN_FROM_BUILD == 1 ]; then
ATT_PATH=$ROCPROFV2_DIR/build/plugin/att/att/att.py
export ROCPROFV2_ATT_LIB_PATH=$ROCM_PATH/lib/hsa-amd-aqlprofile/librocprofv2_att.so
else
ATT_PATH=$ROCPROFV2_DIR/../libexec/rocprofiler/att/att.py
export ROCPROFV2_ATT_LIB_PATH=$ROCPROFV2_DIR/../lib/hsa-amd-aqlprofile/librocprofv2_att.so
fi
ATT_ARGV=$3
shift
ATT_OPTIONS="Not done"
while [ "$ATT_OPTIONS" = "Not done" ]; do
if [[ "$3" = "--trace_file" ]]; then
ATT_ARGV="$ATT_ARGV $3 \"$4\""
shift
shift
elif [[ "$3" = "--mode" || "$3" = "--ports" || "$3" = "--genasm" || "$3" == "--att_kernel" ]]; then
ATT_ARGV="$ATT_ARGV $3 $4"
shift
shift
else
ATT_OPTIONS="Done"
fi
done
fi
shift
shift
elif [[ "$1" = "-"* || "$1" = "--"* ]] ; then
echo -e "Wrong option \"$1\", Please use the following options:\n"
usage
exit 1
else
break
fi
done
PMC_LINES=()
if [ -n "$COUNTERS_PATH" ]; then
input=$COUNTERS_PATH
while IFS= read -r line || [[ -n "$line" ]]; do
# if in att mode, only add the first line
if [[ ! -n "$PMC_LINES" ]] || [[ ! -n "$ATT_ARGV" ]]; then
PMC_LINES+=( "$line" )
fi
done < $input
fi
COUNTERS_PMC_DIRS=""
if [ -n "$PMC_LINES" ]; then
COUNTER=1
for i in ${!PMC_LINES[@]}; do
export ROCPROFILER_COUNTERS="${PMC_LINES[$i]}"
if [ -n "$OUTPUT_PATH" ]; then
if [ ! -n "$ATT_ARGV" ]; then
FINAL_PATH="$OUTPUT_PATH_INTERNAL/pmc_$COUNTER"
COUNTERS_PMC_DIRS="$COUNTERS_PMC_DIRS $FINAL_PATH"
else
FINAL_PATH="$OUTPUT_PATH"
fi
echo -e "\nThe output path for the following counters: $FINAL_PATH"
mkdir -p $FINAL_PATH
echo $ROCPROFILER_COUNTERS > $FINAL_PATH/pmc.txt
export OUTPUT_PATH=$FINAL_PATH
let COUNTER=COUNTER+1
fi
if [ $RUN_FROM_BUILD == 1 ]; then
LD_PRELOAD=$LD_PRELOAD:$ROCM_DIR/build/librocprofiler_tool.so $*
else
LD_PRELOAD=$LD_PRELOAD:$ROCM_DIR/lib/rocprofiler/librocprofiler_tool.so $*
fi
done
elif [ ! -n "$ATT_ARGV" ]; then
if [ $RUN_FROM_BUILD == 1 ]; then
LD_PRELOAD=$LD_PRELOAD:$ROCM_DIR/build/librocprofiler_tool.so $*
else
LD_PRELOAD=$LD_PRELOAD:$ROCM_DIR/lib/rocprofiler/librocprofiler_tool.so $*
fi
fi
get_pmc_results_txt_path(){
for file_name in `ls $1` ; do
if [[ $file_name == *results.txt ]]; then
echo "$1/$file_name"
fi
done
}
if [ -n "$COUNTERS_PMC_DIRS" ]; then
COUNTERS_RESULTS_TXT=""
for PMC_DIR in $COUNTERS_PMC_DIRS; do
COUNTERS_RESULTS_TXT="$COUNTERS_RESULTS_TXT $(get_pmc_results_txt_path $PMC_DIR)"
done
CSV_RESULTS=$OUTPUT_PATH_INTERNAL/results.csv
if [ -n "$OUT_FILE_NAME" ]; then
CSV_RESULTS=$OUTPUT_PATH_INTERNAL/$OUT_FILE_NAME
fi
echo "csv results path: $CSV_RESULTS"
export ROCP_MERGE_PIDS=1 #required for tblextr.py to work correctly for counters
if [ $RUN_FROM_BUILD == 1 ]; then
eval "python3 $ROCM_DIR/bin/tblextr.py $CSV_RESULTS $COUNTERS_RESULTS_TXT"
else
eval "python3 $ROCPROFV2_DIR/../libexec/rocprofiler/tblextr.py $CSV_RESULTS $COUNTERS_RESULTS_TXT"
fi
fi
if [ -n "$ATT_PATH" ]; then
if [ -n "$ATT_ARGV" ]; then
eval "python3 $ATT_PATH $ATT_ARGV"
elif [ ! -n "$PMC_LINES" ]; then
echo "ATT File is required!"
fi
fi