diff --git a/.github/workflows/ubuntu-focal-external-rocm.yml b/.github/workflows/ubuntu-focal-external-rocm.yml index 9211c0d4f7..694c059fd2 100644 --- a/.github/workflows/ubuntu-focal-external-rocm.yml +++ b/.github/workflows/ubuntu-focal-external-rocm.yml @@ -34,7 +34,7 @@ jobs: wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | apt-key add - && echo "deb [arch=amd64] https://repo.radeon.com/rocm/apt/${{ matrix.rocm_version }}/ ubuntu main" | tee /etc/apt/sources.list.d/rocm.list && apt-get update && - apt-get install -y build-essential m4 autoconf libtool python3-pip clang libomp-dev ${{ matrix.compiler }} libudev-dev libnuma-dev rocm-dev rocm-utils roctracer-dev rocprofiler-dev hip-base hsa-amd-aqlprofile hsa-rocr-dev hsakmt-roct-dev libpapi-dev libopenmpi-dev && + apt-get install -y build-essential m4 autoconf libtool python3-pip clang libomp-dev ${{ matrix.compiler }} libudev-dev libnuma-dev rocm-dev rocm-utils roctracer-dev rocprofiler-dev hip-base hsa-amd-aqlprofile hsa-rocr-dev hsakmt-roct-dev libpapi-dev libopenmpi-dev curl && python3 -m pip install --upgrade pip && python3 -m pip install 'cmake==3.16.3' && for i in 6 7 8 9; do /opt/conda/envs/py3.${i}/bin/python -m pip install numpy; done @@ -66,7 +66,8 @@ jobs: -DOMNITRACE_USE_HIP=ON -DOMNITRACE_MAX_THREADS=64 -DOMNITRACE_USE_SANITIZER=OFF - -DTIMEMORY_USE_PAPI=OFF + -DOMNITRACE_USE_PAPI=OFF + -DOMNITRACE_INSTALL_PERFETTO_TOOLS=ON - name: Build timeout-minutes: 45 @@ -90,7 +91,9 @@ jobs: timeout-minutes: 10 run: | set -v + traced --background export OMNITRACE_DEBUG=ON + export OMNITRACE_PERFETTO_BACKEND=system which omnitrace-avail ldd $(which omnitrace-avail) omnitrace-avail --help @@ -101,10 +104,12 @@ jobs: ldd $(which omnitrace) omnitrace --help omnitrace -e -v 1 -o ls.inst --simulate -- ls - omnitrace -e -v 1 -o ls.inst -- ls - ./ls.inst omnitrace -e -v 1 --simulate -- ls + omnitrace -e -v 1 -o ls.inst -- ls + perfetto --out ls-perfetto-trace.proto --txt -c omnitrace.cfg + ./ls.inst omnitrace -e -v 1 -- ls + du -m ls-perfetto-trace.proto - name: CTest Artifacts if: success() || failure() diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e4cb8612e..513e87a7f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,6 +115,8 @@ omnitrace_add_option( "Build with hidden visibility (disable for Debug builds)" ON ADVANCED) omnitrace_add_option(OMNITRACE_BUILD_CI "Enable internal asserts, etc." OFF ADVANCED NO_FEATURE) +omnitrace_add_option(OMNITRACE_INSTALL_PERFETTO_TOOLS + "Install perfetto tools (i.e. traced, perfetto, etc.)" OFF) omnitrace_add_option(OMNITRACE_STRIP_LIBRARIES "Strip the libraries" ${_STRIP_LIBRARIES_DEFAULT} ADVANCED) @@ -226,7 +228,7 @@ install( OPTIONAL) install( - FILES ${PROJECT_SOURCE_DIR}/roctrace.cfg + FILES ${PROJECT_SOURCE_DIR}/omnitrace.cfg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME} OPTIONAL) diff --git a/cmake/Packages.cmake b/cmake/Packages.cmake index f342d75241..f7d3a13fe0 100644 --- a/cmake/Packages.cmake +++ b/cmake/Packages.cmake @@ -23,6 +23,7 @@ omnitrace_add_interface_library(omnitrace-ptl "Enables PTL support (tasking)") omnitrace_add_interface_library(omnitrace-papi "Enable PAPI support") omnitrace_add_interface_library(omnitrace-ompt "Enable OMPT support") omnitrace_add_interface_library(omnitrace-python "Enables Python support") +omnitrace_add_interface_library(omnitrace-perfetto "Enables Perfetto support") omnitrace_add_interface_library(omnitrace-timemory "Provides timemory libraries") omnitrace_add_interface_library(omnitrace-timemory-config "CMake interface library applied to all timemory targets") @@ -32,7 +33,7 @@ omnitrace_add_interface_library(omnitrace-compile-definitions "Compile definitio set(OMNITRACE_EXTENSION_LIBRARIES omnitrace::omnitrace-hip omnitrace::omnitrace-roctracer omnitrace::omnitrace-rocm-smi omnitrace::omnitrace-mpi omnitrace::omnitrace-ptl omnitrace::omnitrace-ompt - omnitrace::omnitrace-papi) + omnitrace::omnitrace-papi omnitrace::omnitrace-perfetto) target_include_directories( omnitrace-headers INTERFACE ${PROJECT_SOURCE_DIR}/source/lib/omnitrace @@ -50,23 +51,32 @@ string(REPLACE ":" ";" CMAKE_PREFIX_PATH "$ENV{CMAKE_PREFIX_PATH};${CMAKE_PREFIX # # ----------------------------------------------------------------------------------------# -if(NOT WIN32) - set(CMAKE_THREAD_PREFER_PTHREAD ON) - set(THREADS_PREFER_PTHREAD_FLAG OFF) -endif() +set(CMAKE_THREAD_PREFER_PTHREAD ON) +set(THREADS_PREFER_PTHREAD_FLAG OFF) find_library(pthread_LIBRARY NAMES pthread pthreads) find_package_handle_standard_args(pthread-library REQUIRED_VARS pthread_LIBRARY) -find_package(Threads ${omnitrace_FIND_QUIETLY} ${omnitrace_FIND_REQUIREMENT}) -if(Threads_FOUND) - target_link_libraries(omnitrace-threading INTERFACE ${CMAKE_THREAD_LIBS_INIT}) -endif() +find_library(pthread_LIBRARY NAMES pthread pthreads) +find_package_handle_standard_args(pthread-library REQUIRED_VARS pthread_LIBRARY) -if(pthread_LIBRARY AND NOT WIN32) +if(pthread_LIBRARY) target_link_libraries(omnitrace-threading INTERFACE ${pthread_LIBRARY}) +else() + find_package(Threads ${omnitrace_FIND_QUIETLY} ${omnitrace_FIND_REQUIREMENT}) + if(Threads_FOUND) + target_link_libraries(omnitrace-threading INTERFACE Threads::Threads) + endif() endif() +foreach(_LIB dl rt) + find_library(${_LIB}_LIBRARY NAMES ${_LIB}) + find_package_handle_standard_args(${_LIB}-library REQUIRED_VARS ${_LIB}_LIBRARY) + if(${_LIB}_LIBRARY) + target_link_libraries(omnitrace-threading INTERFACE ${${_LIB}_LIBRARY}) + endif() +endforeach() + # ----------------------------------------------------------------------------------------# # # HIP @@ -368,6 +378,8 @@ omnitrace_checkout_git_submodule( REPO_BRANCH v17.0 TEST_FILE sdk/perfetto.cc) +include(Perfetto) + # ----------------------------------------------------------------------------------------# # # ELFIO diff --git a/cmake/Perfetto.cmake b/cmake/Perfetto.cmake new file mode 100644 index 0000000000..f9751dbed3 --- /dev/null +++ b/cmake/Perfetto.cmake @@ -0,0 +1,205 @@ +# ====================================================================================== +# Perfetto.cmake +# +# Configure perfetto for omnitrace +# +# ====================================================================================== + +include_guard(GLOBAL) + +include(ExternalProject) +include(ProcessorCount) + +# ---------------------------------------------------------------------------------------# +# +# executables and libraries +# +# ---------------------------------------------------------------------------------------# + +find_program( + OMNITRACE_COPY_EXECUTABLE + NAMES cp + PATH_SUFFIXES bin) + +find_program( + OMNITRACE_NINJA_EXECUTABLE + NAMES ninja + PATH_SUFFIXES bin) + +mark_as_advanced(OMNITRACE_COPY_EXECUTABLE) +mark_as_advanced(OMNITRACE_NINJA_EXECUTABLE) + +# ---------------------------------------------------------------------------------------# +# +# variables +# +# ---------------------------------------------------------------------------------------# + +processorcount(NUM_PROCS_REAL) +math(EXPR _NUM_THREADS "${NUM_PROCS_REAL} - (${NUM_PROCS_REAL} / 2)") +if(_NUM_THREADS GREATER 8) + set(_NUM_THREADS 8) +elseif(_NUM_THREADS LESS 1) + set(_NUM_THREADS 1) +endif() + +set(OMNITRACE_PERFETTO_SOURCE_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source) +set(OMNITRACE_PERFETTO_TOOLS_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source/tools) +set(OMNITRACE_PERFETTO_BINARY_DIR + ${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux) +set(OMNITRACE_PERFETTO_INSTALL_DIR + ${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux/stripped) +set(OMNITRACE_PERFETTO_LINK_FLAGS + "-static-libgcc -static-libstdc++" + CACHE STRING "Link flags for perfetto") +set(OMNITRACE_PERFETTO_BUILD_THREADS + ${_NUM_THREADS} + CACHE STRING "Number of threads to use when building perfetto tools") + +if(CMAKE_CXX_COMPILER_IS_CLANG) + set(PERFETTO_IS_CLANG true) + set(OMNITRACE_PERFETTO_C_FLAGS + "" + CACHE STRING "Perfetto C flags") + set(OMNITRACE_PERFETTO_CXX_FLAGS + "" + CACHE STRING "Perfetto C++ flags") +else() + set(PERFETTO_IS_CLANG false) + set(OMNITRACE_PERFETTO_C_FLAGS + "-static-libgcc -static-libstdc++ -Wno-maybe-uninitialized" + CACHE STRING "Perfetto C flags") + set(OMNITRACE_PERFETTO_CXX_FLAGS + "-static-libgcc -static-libstdc++ -Wno-maybe-uninitialized" + CACHE STRING "Perfetto C++ flags") +endif() + +mark_as_advanced(OMNITRACE_PERFETTO_C_FLAGS) +mark_as_advanced(OMNITRACE_PERFETTO_CXX_FLAGS) +mark_as_advanced(OMNITRACE_PERFETTO_LINK_FLAGS) + +if(NOT OMNITRACE_NINJA_EXECUTABLE) + set(OMNITRACE_NINJA_EXECUTABLE + ${OMNITRACE_PERFETTO_TOOLS_DIR}/ninja + CACHE FILEPATH "Ninja" FORCE) +endif() + +# ---------------------------------------------------------------------------------------# +# +# source tree +# +# ---------------------------------------------------------------------------------------# + +if(NOT EXISTS "${OMNITRACE_PERFETTO_SOURCE_DIR}") + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory + ${PROJECT_BINARY_DIR}/external/perfetto) + # cmake -E copy_directory fails for some reason + execute_process( + COMMAND ${OMNITRACE_COPY_EXECUTABLE} -r ${PROJECT_SOURCE_DIR}/external/perfetto/ + ${OMNITRACE_PERFETTO_SOURCE_DIR}) +endif() + +configure_file(${PROJECT_SOURCE_DIR}/cmake/Templates/args.gn.in + ${OMNITRACE_PERFETTO_BINARY_DIR}/args.gn @ONLY) + +# ---------------------------------------------------------------------------------------# +# +# build tools +# +# ---------------------------------------------------------------------------------------# + +if(OMNITRACE_INSTALL_PERFETTO_TOOLS) + find_program( + OMNITRACE_CURL_EXECUTABLE + NAMES curl + PATH_SUFFIXES bin) + + if(NOT OMNITRACE_CURL_EXECUTABLE) + omnitrace_message( + SEND_ERROR + "curl executable cannot be found. install-build-deps script for perfetto will fail" + ) + endif() + + externalproject_add( + omnitrace-perfetto-build + PREFIX ${PROJECT_BINARY_DIR}/external/perfetto + SOURCE_DIR ${OMNITRACE_PERFETTO_SOURCE_DIR} + BUILD_IN_SOURCE 1 + PATCH_COMMAND ${OMNITRACE_PERFETTO_TOOLS_DIR}/install-build-deps + CONFIGURE_COMMAND ${OMNITRACE_PERFETTO_TOOLS_DIR}/gn gen + ${OMNITRACE_PERFETTO_BINARY_DIR} + BUILD_COMMAND ${OMNITRACE_NINJA_EXECUTABLE} -C ${OMNITRACE_PERFETTO_BINARY_DIR} -j + ${OMNITRACE_PERFETTO_BUILD_THREADS} + INSTALL_COMMAND "" + BUILD_BYPRODUCTS ${OMNITRACE_PERFETTO_BINARY_DIR}/args.gn) + + add_custom_target( + omnitrace-perfetto-clean + COMMAND ${OMNITRACE_NINJA_EXECUTABLE} -t clean + WORKING_DIRECTORY ${OMNITRACE_PERFETTO_BINARY_DIR} + COMMENT "Cleaning Perfetto...") + + install( + DIRECTORY ${OMNITRACE_PERFETTO_INSTALL_DIR}/ + DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILES_MATCHING + PATTERN "*libperfetto.so*") + + foreach(_FILE perfetto traced tracebox traced_probes traced_perf trigger_perfetto) + install( + PROGRAMS ${OMNITRACE_PERFETTO_INSTALL_DIR}/${_FILE} + DESTINATION ${CMAKE_INSTALL_BINDIR} + OPTIONAL) + endforeach() +endif() + +# ---------------------------------------------------------------------------------------# +# +# perfetto static library +# +# ---------------------------------------------------------------------------------------# + +add_library(omnitrace-perfetto-library STATIC) +add_library(omnitrace::omnitrace-perfetto-library ALIAS omnitrace-perfetto-library) +target_sources( + omnitrace-perfetto-library PRIVATE ${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.cc + ${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.h) +target_link_libraries( + omnitrace-perfetto-library + PRIVATE omnitrace::omnitrace-threading omnitrace::omnitrace-static-libgcc + omnitrace::omnitrace-static-libstdcxx) +set_target_properties( + omnitrace-perfetto-library + PROPERTIES OUTPUT_NAME perfetto + ARCHIVE_OUTPUT_DIRECTORY ${OMNITRACE_PERFETTO_BINARY_DIR} + POSITION_INDEPENDENT_CODE ON + CXX_VISIBILITY_PRESET "internal") + +set(perfetto_DIR ${OMNITRACE_PERFETTO_SOURCE_DIR}) +set(PERFETTO_ROOT_DIR + ${OMNITRACE_PERFETTO_SOURCE_DIR} + CACHE PATH "Root Perfetto installation" FORCE) +set(PERFETTO_INCLUDE_DIR + ${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk + CACHE PATH "Perfetto include folder" FORCE) +set(PERFETTO_LIBRARY + ${OMNITRACE_PERFETTO_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}perfetto${CMAKE_STATIC_LIBRARY_SUFFIX} + CACHE FILEPATH "Perfetto library" FORCE) + +mark_as_advanced(PERFETTO_ROOT_DIR) +mark_as_advanced(PERFETTO_INCLUDE_DIR) +mark_as_advanced(PERFETTO_LIBRARY) + +# ---------------------------------------------------------------------------------------# +# +# perfetto interface library +# +# ---------------------------------------------------------------------------------------# + +omnitrace_target_compile_definitions(omnitrace-perfetto INTERFACE OMNITRACE_USE_PERFETTO) +target_include_directories(omnitrace-perfetto SYSTEM + INTERFACE $) +target_link_libraries( + omnitrace-perfetto INTERFACE $ + $) diff --git a/cmake/Templates/args.gn.in b/cmake/Templates/args.gn.in new file mode 100644 index 0000000000..3bc69b2355 --- /dev/null +++ b/cmake/Templates/args.gn.in @@ -0,0 +1,29 @@ +# Set build arguments here. See `gn help buildargs`. + +cc = "@CMAKE_C_COMPILER@" +cxx = "@CMAKE_CXX_COMPILER@" + +is_debug = false +is_clang = @PERFETTO_IS_CLANG@ +is_hermetic_clang = false + +enable_perfetto_benchmarks = false +enable_perfetto_integration_tests = false +enable_perfetto_unittests = false +enable_perfetto_fuzzers = false + +# enable_perfetto_stderr_crash_dump = false +enable_perfetto_heapprofd = false +enable_perfetto_tools = false +enable_perfetto_tools_trace_to_text = false +enable_perfetto_trace_processor = false +enable_perfetto_trace_processor_httpd = false +enable_perfetto_trace_processor_json = false +enable_perfetto_trace_processor_linenoise = false +enable_perfetto_trace_processor_percentile = false +enable_perfetto_trace_processor_sqlite = false +enable_perfetto_ui = false + +extra_cflags = "@OMNITRACE_PERFETTO_C_FLAGS@" +extra_cxxflags = "@OMNITRACE_PERFETTO_CXX_FLAGS@" +extra_ldflags = "@OMNITRACE_PERFETTO_LINK_FLAGS@ -Wl,-rpath=\\\$ORIGIN:\\\$ORIGIN/../lib" diff --git a/external/timemory b/external/timemory index 52e7034fd4..83f911bc46 160000 --- a/external/timemory +++ b/external/timemory @@ -1 +1 @@ -Subproject commit 52e7034fd419ff296506cdef43084f6071dbaba1 +Subproject commit 83f911bc464ab9d271d75391a977b28d6a8af874 diff --git a/omnitrace.cfg b/omnitrace.cfg index 16891202a9..4932f1d91c 100644 --- a/omnitrace.cfg +++ b/omnitrace.cfg @@ -1,6 +1,6 @@ # perfetto --out OUTPUT_FILE --txt -c omnitrace.cfg -# 2 minute trace, but can be stopped prematurely. -duration_ms: 120000 +# 5 minute trace, but can be stopped prematurely. +duration_ms: 300000 write_into_file: true file_write_period_ms: 100 flush_period_ms: 100 diff --git a/source/lib/omnitrace-dl/dl.cpp b/source/lib/omnitrace-dl/dl.cpp index edf905735c..5561547993 100644 --- a/source/lib/omnitrace-dl/dl.cpp +++ b/source/lib/omnitrace-dl/dl.cpp @@ -392,8 +392,8 @@ extern "C" OMNITRACE_DL_INVOKE_STATUS(_invoked, get_indirect().omnitrace_init_f, a, b, c); if(_invoked) { - dl::get_active() = true; - dl::get_inited() = true; + dl::get_active() = true; + dl::get_inited() = true; dl::_omnitrace_dl_verbose = dl::get_omnitrace_dl_env(); } } diff --git a/source/lib/omnitrace/CMakeLists.txt b/source/lib/omnitrace/CMakeLists.txt index 1d6a9f717f..de549c30ee 100644 --- a/source/lib/omnitrace/CMakeLists.txt +++ b/source/lib/omnitrace/CMakeLists.txt @@ -10,8 +10,6 @@ add_library(omnitrace::omnitrace-interface-library ALIAS omnitrace-interface-lib target_include_directories( omnitrace-interface-library INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) -target_include_directories(omnitrace-interface-library SYSTEM - INTERFACE ${perfetto_DIR}/sdk) target_compile_definitions( omnitrace-interface-library @@ -25,6 +23,7 @@ target_link_libraries( $ $ $ + $ $ $ $ @@ -73,8 +72,7 @@ set(library_sources ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_gotcha.cpp ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_create_gotcha.cpp ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_mutex_gotcha.cpp - ${CMAKE_CURRENT_LIST_DIR}/library/components/user_region.cpp - ${perfetto_DIR}/sdk/perfetto.cc) + ${CMAKE_CURRENT_LIST_DIR}/library/components/user_region.cpp) set(library_headers ${CMAKE_CURRENT_LIST_DIR}/library.hpp @@ -108,8 +106,7 @@ set(library_headers ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_gotcha.hpp ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_create_gotcha.hpp ${CMAKE_CURRENT_LIST_DIR}/library/components/pthread_mutex_gotcha.hpp - ${CMAKE_CURRENT_LIST_DIR}/library/components/user_region.hpp - ${perfetto_DIR}/sdk/perfetto.h) + ${CMAKE_CURRENT_LIST_DIR}/library/components/user_region.hpp) target_sources(omnitrace-object-library PRIVATE ${library_sources} ${library_headers}) @@ -142,7 +139,7 @@ endif() add_library(omnitrace-library SHARED $) add_library(omnitrace::omnitrace-library ALIAS omnitrace-library) -target_link_libraries(omnitrace-library PRIVATE omnitrace-interface-library) +target_link_libraries(omnitrace-library PRIVATE omnitrace::omnitrace-interface-library) set_target_properties( omnitrace-library diff --git a/source/lib/omnitrace/library/config.cpp b/source/lib/omnitrace/library/config.cpp index 52924ba538..efca3d2ee4 100644 --- a/source/lib/omnitrace/library/config.cpp +++ b/source/lib/omnitrace/library/config.cpp @@ -142,7 +142,8 @@ configure_settings(bool _init) auto _default_perfetto_v = !tim::get_env("OMNITRACE_USE_TIMEMORY", false, false); - auto _system_backend = tim::get_env("OMNITRACE_PERFETTO_BACKEND_SYSTEM", false, false); + auto _system_backend = + tim::get_env("OMNITRACE_PERFETTO_BACKEND_SYSTEM", false, false); auto _omnitrace_debug = _config->get("OMNITRACE_DEBUG"); if(_omnitrace_debug) tim::set_env("TIMEMORY_DEBUG_SETTINGS", "1", 0); @@ -221,9 +222,9 @@ configure_settings(bool _init) auto _backend = tim::get_env_choice( "OMNITRACE_PERFETTO_BACKEND", - (_system_backend) - ? "system" // if OMNITRACE_PERFETTO_BACKEND_SYSTEM is true, default to system. - : "inprocess", // Otherwise, default to inprocess + (_system_backend) ? "system" // if OMNITRACE_PERFETTO_BACKEND_SYSTEM is true, + // default to system. + : "inprocess", // Otherwise, default to inprocess { "inprocess", "system", "all" }, false); OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_PERFETTO_BACKEND",