diff --git a/CMakeLists.txt b/CMakeLists.txt index 68d13c4dc2..a19be6ac22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,6 +370,11 @@ configure_file( ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/modulefiles/${PROJECT_NAME}/${ROCPROFSYS_VERSION} @ONLY) +configure_file( + ${PROJECT_SOURCE_DIR}/scripts/merge-multiprocess-output.sh + ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/bin/merge-multiprocess-output.sh + COPYONLY) + install( FILES ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/setup-env.sh ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/perfetto.cfg @@ -387,6 +392,12 @@ install( DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME} COMPONENT setup) +install( + PROGRAMS + ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/bin/merge-multiprocess-output.sh + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/bin/ + COMPONENT setup) + # ------------------------------------------------------------------------------# # # install diff --git a/cmake/Templates/modulefile.in b/cmake/Templates/modulefile.in index cf45f889d6..f1f09e40b9 100644 --- a/cmake/Templates/modulefile.in +++ b/cmake/Templates/modulefile.in @@ -11,6 +11,7 @@ set ROOT [file normalize [file dirname [file normalize ${ModulesCurrentModulefil setenv @PROJECT_NAME_UNDERSCORED@_ROOT "${ROOT}" prepend-path CMAKE_PREFIX_PATH "${ROOT}" prepend-path PATH "${ROOT}/bin" +prepend-path PATH "${ROOT}/@CMAKE_INSTALL_DATAROOTDIR@/@PROJECT_NAME@/bin" prepend-path LD_LIBRARY_PATH "${ROOT}/@CMAKE_INSTALL_LIBDIR@" prepend-path PYTHONPATH "${ROOT}/@CMAKE_INSTALL_PYTHONDIR@" setenv @PROJECT_NAME_UNDERSCORED@_DIR "${ROOT}/@CMAKE_INSTALL_DATAROOTDIR@/cmake/@PROJECT_NAME@" diff --git a/cmake/Templates/setup-env.sh.in b/cmake/Templates/setup-env.sh.in index 882c7838c0..4e086316c7 100644 --- a/cmake/Templates/setup-env.sh.in +++ b/cmake/Templates/setup-env.sh.in @@ -15,6 +15,7 @@ fi @PROJECT_NAME_UNDERSCORED@_ROOT=${BASEDIR} PATH=${BASEDIR}/bin:${PATH} +PATH=${BASEDIR}/@CMAKE_INSTALL_DATAROOTDIR@/@PROJECT_NAME@/bin:${PATH} LD_LIBRARY_PATH=${BASEDIR}/@CMAKE_INSTALL_LIBDIR@:${LD_LIBRARY_PATH} PYTHONPATH=${BASEDIR}/@CMAKE_INSTALL_PYTHONDIR@:${PYTHONPATH} CMAKE_PREFIX_PATH=${BASEDIR}:${CMAKE_PREFIX_PATH} diff --git a/scripts/merge-multiprocess-output.sh b/scripts/merge-multiprocess-output.sh new file mode 100755 index 0000000000..d257e45e7c --- /dev/null +++ b/scripts/merge-multiprocess-output.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Check if the folder path is provided +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Assign the folder path to a variable +FOLDER_PATH=$1 + +# Check if the folder exists +if [ ! -d "$FOLDER_PATH" ]; then + echo "Error: Folder '$FOLDER_PATH' does not exist." + exit 1 +fi + +# Check if there are more than one .proto files +PROTO_FILES=("$FOLDER_PATH"/*.proto) +if [ ${#PROTO_FILES[@]} -le 1 ]; then + exit 0 +fi + +echo "Merging multiprocess files ..." +# Check if all .proto files have been fully written or wait +TIMEOUT=60 # Timeout in seconds +for file in "${PROTO_FILES[@]}"; do + SECONDS=0 + while lsof "$file" > /dev/null 2>&1; do + if [ $SECONDS -ge $TIMEOUT ]; then + echo "Timeout reached while waiting for $file to be released." + break + fi + echo "Waiting for $file to be released..." + sleep 1 + done +done + +# Output file name +OUTPUT_FILE="merged.proto" + +# Merge all .proto files into one file +cat "$FOLDER_PATH"/*.proto > "$FOLDER_PATH"/"$OUTPUT_FILE" + +echo "All multiprocess .proto files in '$FOLDER_PATH' have been merged into '$OUTPUT_FILE'." diff --git a/source/lib/core/perfetto.cpp b/source/lib/core/perfetto.cpp index 427ca6e6f0..810cd71d3d 100644 --- a/source/lib/core/perfetto.cpp +++ b/source/lib/core/perfetto.cpp @@ -263,6 +263,25 @@ post_process(tim::manager* _timemory_manager, bool& _perfetto_output_error) _timemory_manager->add_file_output("protobuf", "perfetto", _filename); } ofs.close(); + + if(dmp::rank() == 0) + { + const char* file_path = _filename.c_str(); + auto folder_path = [](std::string_view _v) { + return tim::filepath::dirname(std::string(_v)); + }; + // Execute the merge script + std::string command = + "merge-multiprocess-output.sh '" + folder_path(file_path) + "'"; + int result = system(command.c_str()); + if(result != 0) + { + ROCPROFSYS_VERBOSE(0, + "Failed to execute merge-multiprocess-output.sh with " + "folder path: %s\n", + folder_path(file_path).c_str()); + } + } } else if(dmp::rank() == 0) {