From ed976db651a66b692c6ff117a528af4dd0db7fef Mon Sep 17 00:00:00 2001 From: tqcq <99722391+tqcq@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:55:10 +0800 Subject: [PATCH] feat add microprofile --- CMakeLists.txt | 16 +- examples/tracy_demo.cc | 5 + third_party/tracy/CMakeLists.txt | 335 ++++++++++++++++++++++--------- 3 files changed, 256 insertions(+), 100 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b6ff51..3a56cfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,10 +11,10 @@ if(CMAKE_CXX_COMPILER_ID endif() -# option( -# WITH_MICROPROFILE -# "with MicroProfile" -# ON) +option( + WITH_MICROPROFILE + "with MicroProfile" + ON) option( WITH_EXAMPLES "with examples" @@ -55,7 +55,9 @@ CPMAddPackage( NAME tracy URI https://github.com/wolfpld/tracy SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tracy - OPTIONS "TRACY_ENABLE ON" "TRACY_ON_DEMAND ON" + OPTIONS "TRACY_ENABLE ON" + "TRACY_ON_DEMAND ON" + "TRACY_TIMER_FALLBACK ON" FORCE) CPMAddPackage( @@ -74,7 +76,9 @@ CPMAddPackage( FORCE) if(WITH_EXAMPLES) - # cc_executable(microprofile_demo SRCS examples/microprofile_demo.cc) + if(WITH_MICROPROFILE) + cc_executable(microprofile_demo SRCS examples/microprofile_demo.cc) + endif() cc_executable(tracy_demo SRCS examples/tracy_demo.cc) endif() diff --git a/examples/tracy_demo.cc b/examples/tracy_demo.cc index efca6ba..ba79f9e 100644 --- a/examples/tracy_demo.cc +++ b/examples/tracy_demo.cc @@ -1,6 +1,11 @@ +#include +#include #include void Test() { + TracyLockable(std::mutex, lock); + std::lock_guard _(lock); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } diff --git a/third_party/tracy/CMakeLists.txt b/third_party/tracy/CMakeLists.txt index 7f82a66..b4c9e78 100644 --- a/third_party/tracy/CMakeLists.txt +++ b/third_party/tracy/CMakeLists.txt @@ -3,9 +3,15 @@ cmake_minimum_required(VERSION 3.10) # Run version helper script include(cmake/version.cmake) -project(Tracy LANGUAGES CXX VERSION ${TRACY_VERSION_STRING}) +project( + Tracy + LANGUAGES CXX + VERSION ${TRACY_VERSION_STRING}) -file(GENERATE OUTPUT .gitignore CONTENT "*") +file( + GENERATE + OUTPUT .gitignore + CONTENT "*") if(${BUILD_SHARED_LIBS}) set(DEFAULT_STATIC OFF) @@ -13,13 +19,22 @@ else() set(DEFAULT_STATIC ON) endif() -option(TRACY_STATIC "Whether to build Tracy as a static library" ${DEFAULT_STATIC}) -option(TRACY_Fortran "Build Fortran bindings" OFF) -option(TRACY_LTO "Enable Link-Time optimization" OFF) +option( + TRACY_STATIC + "Whether to build Tracy as a static library" + ${DEFAULT_STATIC}) +option( + TRACY_Fortran + "Build Fortran bindings" + OFF) +option( + TRACY_LTO + "Enable Link-Time optimization" + OFF) if(TRACY_Fortran) - enable_language(Fortran) - set(CMAKE_Fortran_VERSION 2003) + enable_language(Fortran) + set(CMAKE_Fortran_VERSION 2003) endif() if(TRACY_LTO OR CMAKE_INTERPROCEDURAL_OPTIMIZATION) @@ -33,7 +48,10 @@ else() endif() find_package(Threads REQUIRED) -find_package(rocprofiler-sdk PATHS "/opt/rocm/lib/cmake") +find_package( + rocprofiler-sdk + PATHS + "/opt/rocm/lib/cmake") set(TRACY_PUBLIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/public) @@ -45,68 +63,87 @@ else() set(TRACY_VISIBILITY "SHARED") endif() -add_library(TracyClient ${TRACY_VISIBILITY} "${TRACY_PUBLIC_DIR}/TracyClient.cpp") +add_library(TracyClient ${TRACY_VISIBILITY} + "${TRACY_PUBLIC_DIR}/TracyClient.cpp") target_compile_features(TracyClient PUBLIC cxx_std_11) -set_target_properties(TracyClient PROPERTIES INTERPROCEDURAL_OPTIMIZATION ${LTO_SUPPORTED}) -target_include_directories(TracyClient SYSTEM PUBLIC - $ - $) -target_link_libraries( - TracyClient - PUBLIC - Threads::Threads - ${CMAKE_DL_LIBS} -) +set_target_properties(TracyClient PROPERTIES INTERPROCEDURAL_OPTIMIZATION + ${LTO_SUPPORTED}) +target_include_directories( + TracyClient SYSTEM PUBLIC $ + $) +target_link_libraries(TracyClient PUBLIC Threads::Threads ${CMAKE_DL_LIBS}) if(rocprofiler-sdk_FOUND) target_compile_definitions(TracyClient PUBLIC TRACY_ROCPROF) target_link_libraries(TracyClient PUBLIC rocprofiler-sdk::rocprofiler-sdk) endif() if(TRACY_Fortran) - add_library(TracyClientF90 ${TRACY_VISIBILITY} "${TRACY_PUBLIC_DIR}/TracyClient.F90") - target_include_directories(TracyClientF90 PUBLIC - $ - $) - target_link_libraries( - TracyClientF90 - PUBLIC - TracyClient - ) - set_target_properties(TracyClientF90 PROPERTIES Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR} - INTERPROCEDURAL_OPTIMIZATION ${LTO_SUPPORTED}) + add_library(TracyClientF90 ${TRACY_VISIBILITY} + "${TRACY_PUBLIC_DIR}/TracyClient.F90") + target_include_directories( + TracyClientF90 PUBLIC $ + $) + target_link_libraries(TracyClientF90 PUBLIC TracyClient) + set_target_properties( + TracyClientF90 PROPERTIES Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR} + INTERPROCEDURAL_OPTIMIZATION ${LTO_SUPPORTED}) endif() # Public dependency on some libraries required when using Mingw -if(WIN32 AND ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU|Clang") +if(WIN32 + AND ${CMAKE_CXX_COMPILER_ID} + MATCHES + "GNU|Clang") target_link_libraries(TracyClient PUBLIC ws2_32 dbghelp) endif() -if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") +if(CMAKE_SYSTEM_NAME + MATCHES + "FreeBSD") find_library(EXECINFO_LIBRARY NAMES execinfo REQUIRED) target_link_libraries(TracyClient PUBLIC ${EXECINFO_LIBRARY}) endif() if(TRACY_LIBUNWIND_BACKTRACE) include(FindPkgConfig) - pkg_check_modules(unwind REQUIRED libunwind) + pkg_check_modules( + unwind + REQUIRED + libunwind) target_include_directories(TracyClient INTERFACE ${unwind_INCLUDE_DIRS}) target_link_libraries(TracyClient INTERFACE ${unwind_LINK_LIBRARIES}) endif() if(TRACY_DEBUGINFOD) include(FindPkgConfig) - pkg_check_modules(debuginfod REQUIRED libdebuginfod) + pkg_check_modules( + debuginfod + REQUIRED + libdebuginfod) target_include_directories(TracyClient INTERFACE ${debuginfod_INCLUDE_DIRS}) target_link_libraries(TracyClient INTERFACE ${debuginfod_LINK_LIBRARIES}) endif() -add_library(Tracy::TracyClient ALIAS TracyClient) +add_library( + Tracy::TracyClient + ALIAS + TracyClient) if(TRACY_Fortran) - add_library(Tracy::TracyClient_Fortran ALIAS TracyClientF90) + add_library( + Tracy::TracyClient_Fortran + ALIAS + TracyClientF90) endif() -macro(set_option option help value) - option(${option} ${help} ${value}) +macro( + set_option + option + help + value) + option( + ${option} + ${help} + ${value}) if(${option}) message(STATUS "${option}: ON") target_compile_definitions(TracyClient PUBLIC ${option}) @@ -115,46 +152,136 @@ macro(set_option option help value) endif() endmacro() -set_option(TRACY_ENABLE "Enable profiling" ON) -set_option(TRACY_ON_DEMAND "On-demand profiling" OFF) -set_option(TRACY_CALLSTACK "Enforce callstack collection for tracy regions" OFF) -set_option(TRACY_NO_CALLSTACK "Disable all callstack related functionality" OFF) -set_option(TRACY_NO_CALLSTACK_INLINES "Disables the inline functions in callstacks" OFF) -set_option(TRACY_ONLY_LOCALHOST "Only listen on the localhost interface" OFF) -set_option(TRACY_NO_BROADCAST "Disable client discovery by broadcast to local network" OFF) -set_option(TRACY_ONLY_IPV4 "Tracy will only accept connections on IPv4 addresses (disable IPv6)" OFF) -set_option(TRACY_NO_CODE_TRANSFER "Disable collection of source code" OFF) -set_option(TRACY_NO_CONTEXT_SWITCH "Disable capture of context switches" OFF) -set_option(TRACY_NO_EXIT "Client executable does not exit until all profile data is sent to server" OFF) -set_option(TRACY_NO_SAMPLING "Disable call stack sampling" OFF) -set_option(TRACY_NO_VERIFY "Disable zone validation for C API" OFF) -set_option(TRACY_NO_VSYNC_CAPTURE "Disable capture of hardware Vsync events" OFF) -set_option(TRACY_NO_FRAME_IMAGE "Disable the frame image support and its thread" OFF) -set_option(TRACY_NO_SYSTEM_TRACING "Disable systrace sampling" OFF) -set_option(TRACY_PATCHABLE_NOPSLEDS "Enable nopsleds for efficient patching by system-level tools (e.g. rr)" OFF) -set_option(TRACY_DELAYED_INIT "Enable delayed initialization of the library (init on first call)" OFF) -set_option(TRACY_MANUAL_LIFETIME "Enable the manual lifetime management of the profile" OFF) -set_option(TRACY_FIBERS "Enable fibers support" OFF) -set_option(TRACY_NO_CRASH_HANDLER "Disable crash handling" OFF) -set_option(TRACY_TIMER_FALLBACK "Use lower resolution timers" OFF) -set_option(TRACY_LIBUNWIND_BACKTRACE "Use libunwind backtracing where supported" OFF) -set_option(TRACY_SYMBOL_OFFLINE_RESOLVE "Instead of full runtime symbol resolution, only resolve the image path and offset to enable offline symbol resolution" OFF) -set_option(TRACY_LIBBACKTRACE_ELF_DYNLOAD_SUPPORT "Enable libbacktrace to support dynamically loaded elfs in symbol resolution resolution after the first symbol resolve operation" OFF) -set_option(TRACY_DEBUGINFOD "Enable debuginfod support" OFF) +set_option( + TRACY_ENABLE + "Enable profiling" + ON) +set_option( + TRACY_ON_DEMAND + "On-demand profiling" + OFF) +set_option( + TRACY_CALLSTACK + "Enforce callstack collection for tracy regions" + OFF) +set_option( + TRACY_NO_CALLSTACK + "Disable all callstack related functionality" + OFF) +set_option( + TRACY_NO_CALLSTACK_INLINES + "Disables the inline functions in callstacks" + OFF) +set_option( + TRACY_ONLY_LOCALHOST + "Only listen on the localhost interface" + OFF) +set_option( + TRACY_NO_BROADCAST + "Disable client discovery by broadcast to local network" + OFF) +set_option( + TRACY_ONLY_IPV4 + "Tracy will only accept connections on IPv4 addresses (disable IPv6)" + OFF) +set_option( + TRACY_NO_CODE_TRANSFER + "Disable collection of source code" + OFF) +set_option( + TRACY_NO_CONTEXT_SWITCH + "Disable capture of context switches" + OFF) +set_option( + TRACY_NO_EXIT + "Client executable does not exit until all profile data is sent to server" + OFF) +set_option( + TRACY_NO_SAMPLING + "Disable call stack sampling" + OFF) +set_option( + TRACY_NO_VERIFY + "Disable zone validation for C API" + OFF) +set_option( + TRACY_NO_VSYNC_CAPTURE + "Disable capture of hardware Vsync events" + OFF) +set_option( + TRACY_NO_FRAME_IMAGE + "Disable the frame image support and its thread" + OFF) +set_option( + TRACY_NO_SYSTEM_TRACING + "Disable systrace sampling" + OFF) +set_option( + TRACY_PATCHABLE_NOPSLEDS + "Enable nopsleds for efficient patching by system-level tools (e.g. rr)" + OFF) +set_option( + TRACY_DELAYED_INIT + "Enable delayed initialization of the library (init on first call)" + OFF) +set_option( + TRACY_MANUAL_LIFETIME + "Enable the manual lifetime management of the profile" + OFF) +set_option( + TRACY_FIBERS + "Enable fibers support" + OFF) +set_option( + TRACY_NO_CRASH_HANDLER + "Disable crash handling" + OFF) +set_option( + TRACY_TIMER_FALLBACK + "Use lower resolution timers" + OFF) +set_option( + TRACY_LIBUNWIND_BACKTRACE + "Use libunwind backtracing where supported" + OFF) +set_option( + TRACY_SYMBOL_OFFLINE_RESOLVE + "Instead of full runtime symbol resolution, only resolve the image path and offset to enable offline symbol resolution" + OFF) +set_option( + TRACY_LIBBACKTRACE_ELF_DYNLOAD_SUPPORT + "Enable libbacktrace to support dynamically loaded elfs in symbol resolution resolution after the first symbol resolve operation" + OFF) +set_option( + TRACY_DEBUGINFOD + "Enable debuginfod support" + OFF) # advanced -set_option(TRACY_VERBOSE "[advanced] Verbose output from the profiler" OFF) +set_option( + TRACY_VERBOSE + "[advanced] Verbose output from the profiler" + OFF) mark_as_advanced(TRACY_VERBOSE) -set_option(TRACY_DEMANGLE "[advanced] Don't use default demangling function - You'll need to provide your own" OFF) +set_option( + TRACY_DEMANGLE + "[advanced] Don't use default demangling function - You'll need to provide your own" + OFF) mark_as_advanced(TRACY_DEMANGLE) if(rocprofiler-sdk_FOUND) - set_option(TRACY_ROCPROF_CALIBRATION "[advanced] Use continuous calibration of the Rocprof GPU time." OFF) + set_option( + TRACY_ROCPROF_CALIBRATION + "[advanced] Use continuous calibration of the Rocprof GPU time." + OFF) mark_as_advanced(TRACY_ROCPROF_CALIBRATION) endif() # handle incompatible combinations if(TRACY_MANUAL_LIFETIME AND NOT TRACY_DELAYED_INIT) - message(FATAL_ERROR "TRACY_MANUAL_LIFETIME can not be activated with disabled TRACY_DELAYED_INIT") + message( + FATAL_ERROR + "TRACY_MANUAL_LIFETIME can not be activated with disabled TRACY_DELAYED_INIT" + ) endif() if(NOT TRACY_STATIC) @@ -221,29 +348,42 @@ set(common_includes ${TRACY_PUBLIC_DIR}/common/TracyWinFamily.hpp ${TRACY_PUBLIC_DIR}/common/TracyYield.hpp) -install(TARGETS TracyClient - EXPORT TracyConfig - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/$,,$> - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> +install( + TARGETS TracyClient + EXPORT TracyConfig + RUNTIME + DESTINATION ${CMAKE_INSTALL_BINDIR}/$,,$> + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> + ARCHIVE + DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> COMPONENT lib) if(TRACY_Fortran) - install(TARGETS TracyClientF90 - EXPORT TracyConfig - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/$,,$> - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/$,,$> + install( + TARGETS TracyClientF90 + EXPORT TracyConfig + RUNTIME + DESTINATION + ${CMAKE_INSTALL_BINDIR}/$,,$> + LIBRARY + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/$,,$> + ARCHIVE + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/$,,$> COMPONENT lib) endif() # Export targets to build tree root -export(TARGETS TracyClient - NAMESPACE Tracy:: - FILE ${CMAKE_BINARY_DIR}/TracyTargets.cmake) +export( + TARGETS TracyClient + NAMESPACE Tracy:: + FILE ${CMAKE_BINARY_DIR}/TracyTargets.cmake) if(TRACY_Fortran) - export(TARGETS TracyClientF90 - NAMESPACE Tracy:: - APPEND - FILE ${CMAKE_BINARY_DIR}/TracyTargets.cmake) + export( + TARGETS TracyClientF90 + NAMESPACE Tracy:: + APPEND + FILE ${CMAKE_BINARY_DIR}/TracyTargets.cmake) endif() install(FILES ${tracy_includes} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tracy/tracy) @@ -252,7 +392,9 @@ install(FILES ${client_includes} install(FILES ${common_includes} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tracy/common) if(TRACY_Fortran) - if(${CMAKE_Fortran_COMPILER_ID} MATCHES "Cray") + if(${CMAKE_Fortran_COMPILER_ID} + MATCHES + "Cray") install(FILES ${PROJECT_BINARY_DIR}/TRACY.mod DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tracy) else() @@ -260,18 +402,23 @@ if(TRACY_Fortran) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tracy) endif() endif() -install(EXPORT TracyConfig - NAMESPACE Tracy:: - FILE TracyTargets.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +install( + EXPORT TracyConfig + NAMESPACE Tracy:: + FILE TracyTargets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) include(CMakePackageConfigHelpers) -configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/TracyConfig.cmake" - INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/TracyConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/TracyConfig.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) -option(TRACY_CLIENT_PYTHON "Whether to build Tracy python client library" OFF) +option( + TRACY_CLIENT_PYTHON + "Whether to build Tracy python client library" + OFF) if(TRACY_CLIENT_PYTHON) if(TRACY_STATIC)