diff --git a/source/lib/rocprof-sys/api.cpp b/source/lib/rocprof-sys/api.cpp index ad2369ca59..bda609ef6e 100644 --- a/source/lib/rocprof-sys/api.cpp +++ b/source/lib/rocprof-sys/api.cpp @@ -122,7 +122,7 @@ rocprofsys_init_library(void) extern "C" void rocprofsys_init_tooling(void) { - rocprofsys_init_tooling_hidden(); + rocprofsys_init_tooling_hidden(true); } extern "C" void diff --git a/source/lib/rocprof-sys/api.hpp b/source/lib/rocprof-sys/api.hpp index 478f96ec58..55dfbbdd0a 100644 --- a/source/lib/rocprof-sys/api.hpp +++ b/source/lib/rocprof-sys/api.hpp @@ -95,7 +95,7 @@ extern "C" // these are the real implementations for internal calling convention void rocprofsys_init_library_hidden(void) ROCPROFSYS_HIDDEN_API; - bool rocprofsys_init_tooling_hidden(void) ROCPROFSYS_HIDDEN_API; + bool rocprofsys_init_tooling_hidden(bool postinit = false) ROCPROFSYS_HIDDEN_API; void rocprofsys_init_hidden(const char*, bool, const char*) ROCPROFSYS_HIDDEN_API; void rocprofsys_finalize_hidden(void) ROCPROFSYS_HIDDEN_API; void rocprofsys_reset_preload_hidden(void) ROCPROFSYS_HIDDEN_API; diff --git a/source/lib/rocprof-sys/library.cpp b/source/lib/rocprof-sys/library.cpp index 55199200c4..e90594264c 100644 --- a/source/lib/rocprof-sys/library.cpp +++ b/source/lib/rocprof-sys/library.cpp @@ -404,16 +404,42 @@ rocprofsys_init_library_hidden() ROCPROFSYS_CONDITIONAL_BASIC_PRINT_F(_debug_init, "\n"); } +// Initialize RCCL if: +// - postinit=true - so the code doesn't hang at the initialization stage +// - get_state() >= State::Init - so the code doesn't throw an exception +// - rccl_initialized=false - so we don't try to initialize RCCL twice +// - get_use_rcclp()=true - only if the environment is configured to use RCCL +static void +rccl_setup(bool postinit) +{ + // Flag used to avoid initializing RCCL twice + static bool rccl_initialized = false; + + if(postinit && (get_state() >= State::Init) && !rccl_initialized && get_use_rcclp()) + { + ROCPROFSYS_VERBOSE_F(1, "Setting up RCCLP...\n"); + rcclp::setup(); + rccl_initialized = true; + } +} + +static void +rocprofsys_init_library_hidden_with_rccl(bool postinit) +{ + rocprofsys_init_library_hidden(); + rccl_setup(postinit); +} + //======================================================================================// extern "C" bool -rocprofsys_init_tooling_hidden() +rocprofsys_init_tooling_hidden(bool postinit) { if(get_env("ROCPROFSYS_MONOCHROME", false, false)) tim::log::monochrome() = true; if(!tim::get_env("ROCPROFSYS_INIT_TOOLING", true)) { - rocprofsys_init_library_hidden(); + rocprofsys_init_library_hidden_with_rccl(postinit); return false; } @@ -430,7 +456,11 @@ rocprofsys_init_tooling_hidden() ROCPROFSYS_CONDITIONAL_BASIC_PRINT_F(_debug_init, "State is %s...\n", std::to_string(get_state()).c_str()); - if(get_state() != State::PreInit || get_state() == State::Init || _once) return false; + if(get_state() != State::PreInit || get_state() == State::Init || _once) + { + rccl_setup(postinit); + return false; + } _once = true; ROCPROFSYS_SCOPED_THREAD_STATE(ThreadState::Internal); @@ -451,7 +481,7 @@ rocprofsys_init_tooling_hidden() ROCPROFSYS_CONDITIONAL_BASIC_PRINT_F(_debug_init, "Calling rocprofsys_init_library()...\n"); - rocprofsys_init_library_hidden(); + rocprofsys_init_library_hidden_with_rccl(postinit); ROCPROFSYS_DEBUG_F("\n"); @@ -549,23 +579,6 @@ rocprofsys_init_tooling_hidden() ompt::setup(); } -#if defined(ROCPROFSYS_USE_ROCM) && ROCPROFSYS_USE_ROCM > 0 - // Force rocprofiler_configure if it hasn't been called through __hip_module_ctor. - // rocprofiler_configure needs to be called before rcclp::setup to decide - // whether we want to use gotcha wrappers for rccl or rocpofiler based tracing. - if(get_use_rocm()) - { - ROCPROFSYS_VERBOSE_F(1, "Setting up ROCm...\n"); - rocprofiler_sdk::setup(); - } -#endif - - if(get_use_rcclp()) - { - ROCPROFSYS_VERBOSE_F(1, "Setting up RCCLP...\n"); - rcclp::setup(); - } - if(get_use_perfetto()) { ROCPROFSYS_VERBOSE_F(1, "Starting Perfetto...\n"); diff --git a/source/lib/rocprof-sys/library/rocprofiler-sdk.cpp b/source/lib/rocprof-sys/library/rocprofiler-sdk.cpp index 862e976605..78f0f29bd1 100644 --- a/source/lib/rocprof-sys/library/rocprofiler-sdk.cpp +++ b/source/lib/rocprof-sys/library/rocprofiler-sdk.cpp @@ -1301,15 +1301,13 @@ rocprofiler_configure(uint32_t version, const char* runtime_version, uint32_t pr _first = false; } - // If ROCPROFSYS_PRELOAD or ROCPROFSYS_INIT_TOOLING is not set, - // the tooling will not be initialized so we cannot enable - // profiling with rocprofiler - if(!tim::get_env("ROCPROFSYS_PRELOAD", true) || - !tim::get_env("ROCPROFSYS_INIT_TOOLING", true)) - return nullptr; - + if(!tim::get_env("ROCPROFSYS_INIT_TOOLING", true)) return nullptr; if(!tim::settings::enabled()) return nullptr; + if(!rocprofsys::config::settings_are_configured() && + rocprofsys::get_state() < rocprofsys::State::Active) + rocprofsys_init_tooling_hidden(); + if(!rocprofsys::config::get_use_rocm()) { return nullptr;