Files
Elwazir, Ammar 0270964ce6 SWDEV-526393: HSA_TOOLS_LIB is not respected for some pytorch APPs (#24)
HSA_TOOLS_LIB is not respected for some pytorch APPs

Instead of depending on HSA_TOOLS_LIB, move to depending on LD_PRELOAD for loading the rocprofiler library.

[ROCm/rocprofiler commit: f23fe43c29]
2025-04-14 08:41:00 -05:00

712 wiersze
22 KiB
Bash
Executable File

#!/bin/bash
################################################################################
# Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
################################################################################
ROCPROF_ARGS="$*"
time_stamp=`date +%y%m%d_%H%M%S`
BIN_DIR=$(dirname $(realpath ${BASH_SOURCE[0]}))
ROOT_DIR=$(dirname $BIN_DIR)
RUN_DIR=`pwd`
TMP_DIR="/tmp"
DATA_DIR="rpl_data_${time_stamp}_$$"
RPL_PATH=$ROOT_DIR/lib
TLIB_PATH=$RPL_PATH/rocprofiler
TTLIB_PATH=$ROOT_DIR/lib/roctracer
ROCM_LIB_PATH=$ROOT_DIR/lib
PROF_BIN_DIR=$ROOT_DIR/libexec/rocprofiler
# Define color code
GREEN='\033[0;32m'
GREY='\033[0;90m'
RED='\033[0;31m'
RESET='\033[0m'
# Function to display deprecation warning message
display_warning() {
echo -e "\n${RED}WARNING: We are phasing out development and support for roctracer/rocprofiler/rocprof/rocprofv2 in favor of \
rocprofiler-sdk/rocprofv3 in upcoming ROCm releases. Going forward, only critical defect fixes will be addressed for \
older versions of profiling tools and libraries. We encourage all users to upgrade to the latest version, \
rocprofiler-sdk library and rocprofv3 tool, to ensure continued support and access to new features.${RESET}\n"
}
# Display the warning message
display_warning
# check if rocprof is supportd on this gpu arch
V1_SUPPORTED_GPU_ARCHS=("gfx80x","gfx90x","gfx94x")
IS_SUPPORTED="false"
if [ -f $BIN_DIR/rocm_agent_enumerator ]; then
CURRENT_AGENTS_LIST=$($BIN_DIR/rocm_agent_enumerator)
else
IS_SUPPORTED="false"
echo -e "Warning: Missing rocm_agent_enumerator binary"
exit 0
fi
if [ -z "$ROCP_PYTHON_VERSION" ] ; then
ROCP_PYTHON_VERSION=python3
fi
# runtime API trace
ROCTX_TRACE=0
HSA_TRACE=0
SYS_TRACE=0
HIP_TRACE=0
# Generate stats
GEN_STATS=0
# Quoting profiled cmd line
CMD_QTS=1
export PATH=.:$PATH
# enable error logging
export HSA_TOOLS_REPORT_LOAD_FAILURE=1
export HSA_VEN_AMD_AQLPROFILE_LOG=1
export ROCPROFILER_LOG=1
unset ROCPROFILER_SESS
# Profiler environment
# Loading of profiler library by HSA runtime
MY_HSA_TOOLS_LIB="$RPL_PATH/librocprofiler64.so.1"
# Tool internal Preloads
ROCPROFV1_LD_PRELOAD=$MY_HSA_TOOLS_LIB
ROCPROFV1_TOOL_PRELOAD=$MY_HSA_TOOLS_LIB
# Loading of the test tool by ROC Profiler
export ROCP_TOOL_LIB=$TLIB_PATH/librocprof-tool.so
# ROC Profiler metrics definition
export ROCP_METRICS=$TLIB_PATH/metrics.xml
# Enabling HSA dispatches intercepting by ROC PRofiler
export ROCP_HSA_INTERCEPT=1
# Disabling internal ROC Profiler proxy queue (simple version supported for testing purposes)
unset ROCP_PROXY_QUEUE
# Disable AQL-profile read API
export AQLPROFILE_READ_API=0
# ROC Profiler package path
export ROCP_PACKAGE_DIR=$ROOT_DIR
# enabled SPM KFD mode
export ROCP_SPM_KFD_MODE=1
# error handling
fatal() {
echo "$0: Error: $1"
echo ""
usage
exit 1
}
error() {
echo "$0: Error: $1"
echo ""
exit 1
}
error_message=""
errck() {
if [ -n "$error_message" ]; then
fatal "$1 : $error_message"
fi
}
# usage method
usage() {
bin_name=`basename $0`
echo "ROCm Profiling Library (RPL) run script, a part of ROCprofiler library package."
echo "Full path: $BIN_DIR/$bin_name"
echo "Metrics definition: $TLIB_PATH/metrics.xml"
echo ""
echo "Usage:"
echo " $bin_name [-h] [--list-basic] [--list-derived] [-i <input .txt/.xml file>] [-o <output CSV file>] <app command line>"
echo ""
echo "Options:"
echo " -h - this help"
echo " --tool-version <1|2> - to use specific version of rocprof tool, by default v1 is used"
echo " 1 - rocprofiler tool v1"
echo " 2 - rocprofiler tool v2"
echo " --verbose - verbose mode, dumping all base counters used in the input metrics"
echo " --list-basic - to print the list of basic HW counters"
echo " --list-derived - to print the list of derived metrics with formulas"
echo " --cmd-qts <on|off> - quoting profiled cmd line [on]"
echo ""
echo " -i <.txt|.xml file> - input file"
echo " Input file .txt format, automatically rerun application for every profiling features line:"
echo ""
echo " # Perf counters group 1"
echo " pmc : Wavefronts VALUInsts SALUInsts SFetchInsts FlatVMemInsts LDSInsts FlatLDSInsts GDSInsts VALUUtilization FetchSize"
echo " # Perf counters group 2"
echo " pmc : WriteSize L2CacheHit"
echo " # Filter by dispatches range, GPU index and kernel names"
echo " # supported range formats: \"3:9\", \"3:\", \"3\""
echo " range: 1 : 4"
echo " gpu: 0 1 2 3"
echo " kernel: simple Pass1 simpleConvolutionPass2"
echo ""
echo " Input file .xml format, for single profiling run:"
echo ""
echo " # Metrics list definition, also the form \"<block-name>:<event-id>\" can be used"
echo " # All defined metrics can be found in the 'metrics.xml'"
echo " # There are basic metrics for raw HW counters and high-level metrics for derived counters"
echo " <metric name=SQ:4,SQ_WAVES,VFetchInsts"
echo " ></metric>"
echo ""
echo " # Filter by dispatches range, GPU index and kernel names"
echo " <metric"
echo " # range formats: \"3:9\", \"3:\", \"3\""
echo " range=\"\""
echo " # list of gpu indexes \"0,1,2,3\""
echo " gpu_index=\"\""
echo " # list of matched sub-strings \"Simple1,Conv1,SimpleConvolution\""
echo " kernel=\"\""
echo " ></metric>"
echo ""
echo " -o <output file> - output CSV file [<input file base>.csv]"
echo " -d <data directory> - directory where profiler store profiling data including traces [/tmp]"
echo " The data directory is automatically removed if it is matching the default temporary directory."
echo " -t <temporary directory> - to change the temporary directory [/tmp]"
echo " By changing the temporary directory you can prevent removing the profiling data from /tmp or enable removing from not '/tmp' directory."
echo " -m <metric file> - file defining custom metrics to use in-place of defaults."
echo ""
echo " --basenames <on|off> - to turn on/off truncating of the kernel full function names till the base ones [off]"
echo " --timestamp <on|off> - to turn on/off the kernel dispatches timestamps, dispatch/begin/end/complete during kernel profiling [off]"
echo " --ctx-wait <on|off> - to wait for outstanding contexts on profiler exit [on]"
echo " --ctx-limit <max number> - maximum number of outstanding contexts [0 - unlimited]"
echo " --heartbeat <rate sec> - to print progress heartbeats [0 - disabled]"
echo " --obj-tracking <on|off> - to turn on/off kernels code objects tracking [on]"
echo " To support V3 code object"
echo ""
echo " --stats - generating kernel execution stats, file <output name>.stats.csv"
echo ""
echo " --roctx-trace - to enable rocTX application code annotation trace, \"Markers and Ranges\" JSON trace section."
echo " --hip-trace - to trace HIP, generates API execution stats and JSON file chrome-tracing compatible"
echo " --hsa-trace - to trace HSA, generates API execution stats and JSON file chrome-tracing compatible"
echo " --sys-trace - to trace HIP/HSA APIs and GPU activity, generates stats and JSON trace chrome-tracing compatible"
echo " '--hsa-trace' can be used in addition to select activity tracing from HSA (ROCr runtime) level"
echo " Generated files: <output name>.<domain>_stats.txt <output name>.json"
echo " Traced API list can be set by input .txt or .xml files."
echo " Input .txt:"
echo " hsa: hsa_queue_create hsa_amd_memory_pool_allocate"
echo " Input .xml:"
echo " <trace name=\"HSA\">"
echo " <parameters list=\"hsa_queue_create, hsa_amd_memory_pool_allocate\">"
echo " </parameters>"
echo " </trace>"
echo ""
echo " --roctx-rename - to rename kernels with their enclosing rocTX range's message."
echo ""
echo " --trace-start <on|off> - to enable tracing on start [on]"
echo " --trace-period <dealy:length:rate> - to enable trace with initial delay, with periodic sample length and rate"
echo " Supported time formats: <number(m|s|ms|us)>"
echo " --flush-rate <rate> - to enable trace flush rate (time period)"
echo " Supported time formats: <number(m|s|ms|us)>"
echo " --parallel-kernels - to enable concurrent kernels"
echo ""
echo "Configuration file:"
echo " You can set your parameters defaults preferences in the configuration file 'rpl_rc.xml'. The search path sequence: .:${HOME}:<installation directory>"
echo " First the configuration file is searched in the current directory, then in the current user's home directory, and then in the installation directory."
echo " Configurable options: 'basenames', 'timestamp', 'ctx-limit', 'heartbeat', 'obj-tracking'."
echo " An example of 'rpl_rc.xml':"
echo " <defaults"
echo " basenames=off"
echo " timestamp=off"
echo " ctx-limit=0"
echo " heartbeat=0"
echo " obj-tracking=off"
echo " ></defaults>"
echo ""
echo " --merge-traces - Script for aggregating results from multiple rocprofiler out directries."
echo " Usage: if running with rocprof"
echo " rocprof --merge-traces -o <outputdir> [<inputdir>...]"
echo ""
exit 1
}
# checking for availability of rocminfo utility
if !command -v rocminfo > /dev/null 2>&1 ; then
error "'rocminfo' utility is not found: please add ROCM bin path to PATH env var.";
fi
# setting ROCM_LIB_PATH
set_rocm_lib_path() {
for ROCM_LIB_PATH in "$ROOT_DIR/lib" "$ROOT_DIR/lib64" ; do
if [ -d "$ROCM_LIB_PATH" ]; then
return 0
fi
done
#error
return 255
}
# profiling run method
OUTPUT_LIST=""
run() {
if ! set_rocm_lib_path ; then
echo " Fatal could not find ROCm lib directory "
fatal
fi
# split the CURRENT_AGENTS_LIST array into individual elements.
current_gpus=(${CURRENT_AGENTS_LIST[@]})
for gpu in "${current_gpus[@]}"; do
# Check first 5 characters of gpu strings.
if [[ "${V1_SUPPORTED_GPU_ARCHS[@]:0:5}" =~ "${gpu:0:5}" ]]; then
IS_SUPPORTED="true"
fi
done
if [[ $IS_SUPPORTED == "false" ]]; then
echo ""
echo "------------ ------------ ------------"
echo "WARNING: rocprof(v1) is not supported on this device. Recommended use: rocprofv2"
echo "Please refer project's README for a list of supported architecures."
echo "------------ ------------ ------------"
echo ""
fi
export ROCP_INPUT="$1"
OUTPUT_DIR="$2"
shift
shift
APP_CMD=$*
if [ "$OUTPUT_DIR" = "-" ] ; then
input_tag=`echo $ROCP_INPUT | sed "s/\.xml//"`
export ROCP_OUTPUT_DIR=${input_tag}_results_${time_stamp}
elif [ "$OUTPUT_DIR" = "--" ] ; then
unset ROCP_OUTPUT_DIR
else
export ROCP_OUTPUT_DIR=$OUTPUT_DIR
fi
echo "RPL: result dir '$ROCP_OUTPUT_DIR'"
if [ ! -e "$ROCP_INPUT" ] ; then
error "Input file '$ROCP_INPUT' not found"
fi
if [ -n "$ROCP_OUTPUT_DIR" ] ; then
if [ "$OUTPUT_DIR" = "-" ] ; then
if [ -e "$ROCP_OUTPUT_DIR" ] ; then
error "generated dir '$ROCP_OUTPUT_DIR' exists"
fi
fi
mkdir -p "$ROCP_OUTPUT_DIR"
OUTPUT_LIST="$OUTPUT_LIST $ROCP_OUTPUT_DIR/results.txt"
fi
API_TRACE=""
MY_LD_PRELOAD=""
if [ "$ROCTX_TRACE" = 1 ] ; then
API_TRACE=${API_TRACE}":roctx"
MY_LD_PRELOAD="$ROCM_LIB_PATH/libroctx64.so"
fi
if [ "$HIP_TRACE" = 1 ] ; then
API_TRACE=${API_TRACE}":hip"
fi
if [ "$SYS_TRACE" = 1 ] ; then
API_TRACE=${API_TRACE}":sys"
fi
if [ "$HSA_TRACE" = 1 ] ; then
export ROCTRACER_DOMAIN=$API_TRACE":hsa"
ROCPROFV1_TOOL_PRELOAD="$MY_LD_PRELOAD $TTLIB_PATH/libroctracer_tool.so"
ROCPROFV1_LD_PRELOAD="$MY_HSA_TOOLS_LIB:$ROCM_LIB_PATH/libroctracer64.so.4"
elif [ -n "$API_TRACE" ] ; then
export ROCTRACER_DOMAIN=$API_TRACE
OUTPUT_LIST="$ROCP_OUTPUT_DIR/"
ROCPROFV1_TOOL_PRELOAD="$MY_LD_PRELOAD $TTLIB_PATH/libroctracer_tool.so"
ROCPROFV1_LD_PRELOAD="$ROCM_LIB_PATH/libroctracer64.so.4"
fi
if [ "$ROCP_STATS_OPT" = 1 ] ; then
if [ "$ROCTRACER_DOMAIN" = ":hip" ] ; then
ROCPROFV1_LD_PRELOAD="$ROCM_LIB_PATH/libroctracer64.so.4"
ROCPROFV1_TOOL_PRELOAD="$MY_LD_PRELOAD $TTLIB_PATH/libhip_stats.so"
else
error_message="ROCP_STATS_OPT is only available with --hip-trace option"
echo $error_message
exit 1
fi
fi
retval=1
if [ -n "$ROCP_OUTPUT_DIR" ] ; then
log_file="$ROCP_OUTPUT_DIR/log.txt"
exit_file="$ROCP_OUTPUT_DIR/exit.txt"
{
HSA_TOOLS_LIB="$ROCPROFV1_TOOL_PRELOAD" LD_PRELOAD=$LD_PRELOAD:"$ROCPROFV1_LD_PRELOAD" eval "$APP_CMD"
retval=$?
echo "exit($retval)" > $exit_file
} 2>&1 | tee "$log_file"
exitval=`cat "$exit_file" | sed -n "s/^.*exit(\([0-9]*\)).*$/\1/p"`
if [ -n "$exitval" ] ; then retval=$exitval; fi
else
HSA_TOOLS_LIB="$ROCPROFV1_TOOL_PRELOAD" LD_PRELOAD=$LD_PRELOAD:"$ROCPROFV1_LD_PRELOAD" eval "$APP_CMD"
retval=$?
fi
return $retval
}
merge_output() {
while [ -n "$1" ] ; do
output_dir=$(echo "$1" | sed "s/\/[^\/]*$//")
for file_name in `ls $output_dir` ; do
output_name=$(echo $file_name | sed -n "/\.txt$/ s/^[0-9]*_//p")
if [ -n "$output_name" ] ; then
trace_file=$output_dir/$file_name
output_file=$output_dir/$output_name
touch $output_file
cat $trace_file >> $output_file
fi
done
shift
done
}
convert_time_val() {
local time_maxumim_us=$((0xffffffff))
local __resultvar=$1
eval "local val=$"$__resultvar
val_m=`echo $val | sed -n "s/^\([0-9]*\)m$/\1/p"`
val_s=`echo $val | sed -n "s/^\([0-9]*\)s$/\1/p"`
val_ms=`echo $val | sed -n "s/^\([0-9]*\)ms$/\1/p"`
val_us=`echo $val | sed -n "s/^\([0-9]*\)us$/\1/p"`
if [ -n "$val_m" ] ; then val_us=$((val_m*60000000))
elif [ -n "$val_s" ] ; then val_us=$((val_s*1000000))
elif [ -n "$val_ms" ] ; then val_us=$((val_ms*1000))
fi
if [ -z "$val_us" ] ; then
error_message="invalid time value format ($val)"
elif [ "$val_us" -gt "$time_maxumim_us" ] ; then
error_message="time value exceeds maximum supported ($val > ${time_maxumim_us}us)"
else
eval $__resultvar="'$val_us'"
fi
}
unset_v1_envs() {
# enable error logging
unset HSA_TOOLS_REPORT_LOAD_FAILURE
unset HSA_VEN_AMD_AQLPROFILE_LOG
unset ROCPROFILER_LOG
unset ROCPROFILER_SESS
unset MY_HSA_TOOLS_LIB
unset ROCP_TOOL_LIB
unset ROCP_METRICS
unset ROCP_HSA_INTERCEPT
unset ROCP_PROXY_QUEUE
unset AQLPROFILE_READ_API
unset ROCP_PACKAGE_DIR
unset ROCP_SPM_KFD_MODE
}
################################################################################################
# main
echo "RPL: on '$time_stamp' from '$ROOT_DIR' in '$RUN_DIR'"
# Parsing arguments
if [ -z "$1" ] ; then
usage
fi
INPUT_FILE=""
DATA_PATH="-"
OUTPUT_DIR="-"
output=""
csv_output=""
ARG_IN=""
while [ 1 ] ; do
ARG_IN=$1
ARG_VAL=1
if [ "$1" = "--tool-version" ] ; then
if [ $2 = 1 ] ; then
:
elif [ $2 = 2 ] ; then
# unset all v1 variables
unset_v1_envs
eval $BIN_DIR/rocprofv2 $ROCPROF_ARGS
exit 0
else
echo "Wrong option '$1 $2'"
usage
fi
elif [ "$1" = "--version" ]; then
if [ -f "$BIN_DIR/../libexec/rocprofiler/rocprofiler-version" ]; then
ROCPROFILER_LIBRARY_VERSION=1 $BIN_DIR/../libexec/rocprofiler/rocprofiler-version
else
ROCM_VERSION=$(cat $BIN_DIR/../.info/version)
echo -e "ROCm version: $ROCM_VERSION"
echo -e "ROCProfiler version: 2.0"
fi
exit 0
elif [ "$1" = "-h" ] ; then
usage
elif [ "$1" = "-i" ] ; then
INPUT_FILE="$2"
elif [ "$1" = "-o" ] ; then
output="$2"
if [[ $output != *.csv ]]; then
echo "error: file name must have .CSV extension"
exit 1
fi
elif [ "$1" = "-d" ] ; then
DATA_PATH=$2
elif [ "$1" = "-t" ] ; then
TMP_DIR="$2"
if [ "$OUTPUT_DIR" = "-" ] ; then
DATA_PATH=$TMP_DIR
fi
elif [ "$1" = "-m" ] ; then
unset ROCP_METRICS
export ROCP_METRICS="$2"
elif [ "$1" = "--list-basic" ] ; then
export ROCP_INFO=b
HSA_TOOLS_LIB="$MY_HSA_TOOLS_LIB" eval "$TLIB_PATH/rocprof-ctrl"
exit 1
elif [ "$1" = "--list-derived" ] ; then
export ROCP_INFO=d
HSA_TOOLS_LIB="$MY_HSA_TOOLS_LIB" eval "$TLIB_PATH/rocprof-ctrl"
exit 1
elif [ "$1" = "--basenames" ] ; then
if [ "$2" = "on" ] ; then
export ROCP_TRUNCATE_NAMES=1
else
export ROCP_TRUNCATE_NAMES=0
fi
elif [ "$1" = "--timestamp" ] ; then
if [ "$2" = "on" ] ; then
export ROCP_TIMESTAMP_ON=1
else
export ROCP_TIMESTAMP_ON=0
fi
elif [ "$1" = "--ctx-wait" ] ; then
if [ "$2" = "on" ] ; then
export ROCP_OUTSTANDING_WAIT=1
else
export ROCP_OUTSTANDING_WAIT=0
fi
elif [ "$1" = "--ctx-limit" ] ; then
export ROCP_OUTSTANDING_MAX="$2"
elif [ "$1" = "--heartbeat" ] ; then
export ROCP_OUTSTANDING_MON="$2"
elif [ "$1" = "--stats" ] ; then
ARG_VAL=0
export ROCP_TIMESTAMP_ON=1
GEN_STATS=1
elif [ "$1" = "--roctx-trace" ] ; then
ARG_VAL=0
GEN_STATS=1
ROCTX_TRACE=1
elif [ "$1" = "--hsa-trace" ] ; then
ARG_VAL=0
export ROCP_TIMESTAMP_ON=1
GEN_STATS=1
HSA_TRACE=1
elif [ "$1" = "--sys-trace" ] ; then
ARG_VAL=0
export ROCP_TIMESTAMP_ON=1
GEN_STATS=1
SYS_TRACE=1
elif [ "$1" = "--hip-trace" ] ; then
ARG_VAL=0
export ROCP_TIMESTAMP_ON=1
GEN_STATS=1
HIP_TRACE=1
elif [ "$1" = "--roctx-rename" ] ; then
ARG_VAL=0
export ROCP_RENAME_KERNEL=1
elif [ "$1" = "--trace-start" ] ; then
if [ "$2" = "off" ] ; then
export ROCP_CTRL_RATE="-1:0:0"
fi
elif [ "$1" = "--trace-period" ] ; then
period_expr="^\([^:]*\):\([^:]*\):\([^:]*\)$"
period_ck=`echo "$2" | sed -n "s/"${period_expr}"/ok/p"`
if [ -z "$period_ck" ] ; then
fatal "Wrong option '$1 $2'"
fi
period_delay=`echo "$2" | sed -n "s/"${period_expr}"/\1/p"`
period_len=`echo "$2" | sed -n "s/"${period_expr}"/\2/p"`
period_rate=`echo "$2" | sed -n "s/"${period_expr}"/\3/p"`
convert_time_val period_delay
errck "Option '$ARG_IN', delay value"
convert_time_val period_len
errck "Option '$ARG_IN', length value"
convert_time_val period_rate
errck "Option '$ARG_IN', rate value"
export ROCP_CTRL_RATE="$period_delay:$period_len:$period_rate"
elif [ "$1" = "--flush-rate" ] ; then
period_rate=$2
convert_time_val period_rate
errck "Option '$ARG_IN', rate value"
export ROCP_FLUSH_RATE="$period_rate"
elif [ "$1" = "--obj-tracking" ] ; then
if [ "$2" = "off" ] ; then
export ROCP_OBJ_TRACKING=0
fi
elif [ "$1" = "--parallel-kernels" ] ; then
ARG_VAL=0
export ROCP_K_CONCURRENT=1
export AQLPROFILE_READ_API=1
elif [ "$1" = "--verbose" ] ; then
ARG_VAL=0
export ROCP_VERBOSE_MODE=1
elif [ "$1" = "--cmd-qts" ] ; then
if [ "$2" = "off" ] ; then
CMD_QTS=0
fi
elif [ "$1" = "--merge-traces" ] ; then
shift
echo "merging traces with $PROF_BIN_DIR/merge_traces.sh"
$PROF_BIN_DIR/merge_traces.sh $@
exit 0
else
break
fi
shift
if [ "$ARG_VAL" = 1 ] ; then shift; fi
done
ARG_CK=`echo $ARG_IN | sed "s/^-.*$/-/"`
if [ "$ARG_CK" = "-" ] ; then
fatal "Wrong option '$ARG_IN'"
fi
if [ "$GEN_STATS" = "1" -a "$ROCP_TIMESTAMP_ON" = "0" ] ; then
fatal "Wrong options, stats enabled with disabled timestamps"
fi
if [ -z "$INPUT_FILE" ] ; then
input_base="results"
input_type="none"
else
input_base=`echo "$INPUT_FILE" | sed "s/^\(.*\)\.\([^\.]*\)$/\1/"`
input_type=`echo "$INPUT_FILE" | sed "s/^\(.*\)\.\([^\.]*\)$/\2/"`
if [ -z "${input_base}" -o -z "${input_type}" ] ; then
fatal "Bad input file '$INPUT_FILE'"
fi
input_base=`basename $input_base`
fi
if [ "$DATA_PATH" = "-" ] ; then
DATA_PATH=$TMP_DIR
fi
if [ -n "$output" ] ; then
if [ "$output" = "--" ] ; then
OUTPUT_DIR="--"
else
csv_output=$output
fi
else
csv_output=$RUN_DIR/${input_base}.csv
fi
# Profiled cmd line string
APP_CMD=$*
if [ "$CMD_QTS" = 1 ] ; then
APP_CMD=""
for i in `seq 1 $#`; do
if [ -n "$APP_CMD" ] ; then
APP_CMD=$APP_CMD" "
fi
eval "arg=\${$i}"
APP_CMD=$APP_CMD\"$arg\"
done
fi
echo "RPL: profiling '$APP_CMD'"
echo "RPL: input file '$INPUT_FILE'"
input_list=""
RES_DIR=""
if [ "$input_type" = "xml" ] ; then
OUTPUT_DIR=$DATA_PATH
input_list=$INPUT_FILE
elif [ "$input_type" = "txt" -o "$input_type" = "none" ] ; then
RES_DIR=$DATA_PATH/$DATA_DIR
if [ -e $RES_DIR ] ; then
error "Rundir '$RES_DIR' exists"
fi
mkdir -p $RES_DIR
echo "RPL: output dir '$RES_DIR'"
if [ "$input_type" = "txt" ] ; then
$PROF_BIN_DIR/txt2xml.sh $INPUT_FILE $RES_DIR
else
echo "<metric></metric>" > $RES_DIR/input.xml
fi
input_list=`/bin/ls $RES_DIR/input*.xml`
export ROCPROFILER_SESS=$RES_DIR
else
fatal "Bad input file type '$INPUT_FILE'"
fi
if [ -n "$csv_output" ] ; then
rm -f $csv_output
fi
RET=1
export ROCP_MERGE_PIDS=1
for name in $input_list; do
run $name $OUTPUT_DIR $APP_CMD
RET=$?
if [ -n "$ROCPROFILER_SESS" -a -e "$ROCPROFILER_SESS/error" ] ; then
error_string=`cat $ROCPROFILER_SESS/error`
echo "Profiling error found: '$error_string'"
csv_output=""
RET=1
break
fi
done
if [ -n "$csv_output" ] ; then
merge_output $OUTPUT_LIST
if [ "$GEN_STATS" = "1" ] ; then
db_output=$(echo $csv_output | sed "s/\.csv/.db/")
$ROCP_PYTHON_VERSION $PROF_BIN_DIR/tblextr.py $db_output $OUTPUT_LIST
else
$ROCP_PYTHON_VERSION $PROF_BIN_DIR/tblextr.py $csv_output $OUTPUT_LIST
fi
if [ "$?" -ne 0 ] ; then
echo "Profiling data corrupted: '$OUTPUT_LIST'" | tee "$ROCPROFILER_SESS/error"
RET=1
fi
fi
if [ "$DATA_PATH" = "$TMP_DIR" ] ; then
if [ -e "$RES_DIR" ] ; then
rm -rf $RES_DIR
fi
fi
exit $RET