Shared Library Constructor (rocprofv3 deadlock fix) (#599)
* Moved tests/apps to tests/bin * Renamed cmake project in tests/bin * Update samples - Use ROCPROFILER_DEFAULT_FAIL_REGEX - tweaks to stdout messages * Update tests - Use ROCPROFILER_DEFAULT_FAIL_REGEX * Add tests/lib - libraries with HIP code * Update PTL submodule - remove atexit delete of thread_id_map * Update cmake/rocprofiler_options.cmake - Set ROCPROFILER_DEFAULT_FAIL_REGEX * Update common lib: env + logging - improved customization of logging settings - default to disabling logging to files - install failure handler for rocprofv3 - set_env support in environment.* * Add lib/rocprofiler-sdk/shared_library.cpp - shared library constructor * Update lib/rocprofiler-sdk-tool/tool.cpp - destructor thread safety - convert callback_name_info and buffered_name_info to pointers - install failure handler for logging * Add tests/bin/hip-in-libraries - hip-in-libraries is an exe which uses two shared libraries where each shared library contains HIP kernels - used for testing deadlocking within __hipRegisterFatBinary * Update bin/rocprofv3 - reorganized the env variables - use exec to launch command - set ROCPROFILER_LIBRARY_CTOR=1 * Add tests/rocprofv3/tracing-hip-in-libraries - uses hip-in-libraries exe for exe which uses shared libraries to launch HIP kernels * Update bin/rocprofv3 - fix counter collection (no exec) * Update lib/rocprofiler-sdk-tool/tool.cpp - replace "Kernel-Name" with "Kernel_Name" * Update lib/rocprofiler-sdk/registration.cpp Use RTLD_LOCAL instead of RTLD_GLOBAL for env libraries * Update tests/rocprofv3 - replace "Kernel-Name" with "Kernel_Name" * Update tests - vector-ops (bin) stream syncs + runs with 4 queues per device - improve counter-collection/input1 validation - rocprofv3/tracing-hip-in-libraries does not do sys-trace - improved validation script for tracing-hip-in-libraries - updated dispatch_callback in json-tool.cpp following reworking of prototypes for counter collection * Update samples/counter_collection - updated dispatch_callback(s) and record_callback(s) following reworking of prototypes * Update bin/rocprofv3 - reorganized help menu - added options for sub-HSA tables - added --hip-runtime-trace - changed --hip-trace to include --hip-compiler-trace * Update lib/rocprofiler-sdk-tool - improved kernel filtering - removed arch_vgpr, accum_vgpr, sgpr code (in rocprofiler-sdk) - fixed issue with counter-collection w/o tracing - added support for fine grained HSA API tracing - removed directly linking to HSA-runtime * Update lib/rocprofiler-sdk/agent.cpp - rocp_agents != hsa_agents is non-fatal when ROCPROFILER_BUILD_CI=OFF (CMake option) * GPR (vector and scalar) info in kernel symbol data - rocprofiler_callback_tracing_code_object_kernel_symbol_register_data_t contains general purpose register info * Header include order fix - Include repo headers first - Third party library headers next - standard library headers last * Update dispatch profiling public API - introduce rocprofiler_profile_counting_dispatch_data_t - change signature of rocprofiler_profile_counting_dispatch_callback_t and rocprofiler_profile_counting_record_callback_t - provide rocprofiler_user_data_t pointer in dispatch callback - provide rocprofiler_user_data_t value (from dispatch cb) in record callback * Update tests/bin/CMakeLists.txt - fix add_subdirectory(hip-in-libraries) order * Update VERSION - bump to 0.2.0 in prep for AFAR
此提交包含在:
@@ -67,8 +67,9 @@ set_target_properties(rocprofiler-object-library PROPERTIES POSITION_INDEPENDENT
|
||||
add_library(rocprofiler-shared-library SHARED)
|
||||
add_library(rocprofiler::rocprofiler-shared-library ALIAS rocprofiler-shared-library)
|
||||
|
||||
target_sources(rocprofiler-shared-library
|
||||
PRIVATE $<TARGET_OBJECTS:rocprofiler::rocprofiler-object-library>)
|
||||
target_sources(
|
||||
rocprofiler-shared-library
|
||||
PRIVATE $<TARGET_OBJECTS:rocprofiler::rocprofiler-object-library> shared_library.cpp)
|
||||
target_link_libraries(
|
||||
rocprofiler-shared-library
|
||||
INTERFACE rocprofiler::rocprofiler-headers
|
||||
|
||||
@@ -48,6 +48,14 @@
|
||||
|
||||
namespace fs = rocprofiler::common::filesystem;
|
||||
|
||||
#if defined(ROCPROFILER_CI)
|
||||
# define ROCP_CI_LOG_IF(NON_CI_LEVEL, ...) LOG_IF(FATAL, __VA_ARGS__)
|
||||
# define ROCP_CI_LOG(NON_CI_LEVEL, ...) LOG(FATAL)
|
||||
#else
|
||||
# define ROCP_CI_LOG_IF(NON_CI_LEVEL, ...) LOG_IF(NON_CI_LEVEL, __VA_ARGS__)
|
||||
# define ROCP_CI_LOG(NON_CI_LEVEL, ...) LOG(NON_CI_LEVEL)
|
||||
#endif
|
||||
|
||||
namespace rocprofiler
|
||||
{
|
||||
namespace agent
|
||||
@@ -697,7 +705,7 @@ construct_agent_cache(::HsaApiTable* table)
|
||||
},
|
||||
&hsa_agents);
|
||||
|
||||
LOG_IF(FATAL, rocp_agents.size() != hsa_agents.size())
|
||||
ROCP_CI_LOG_IF(ERROR, rocp_agents.size() != hsa_agents.size())
|
||||
<< "Found " << rocp_agents.size() << " rocprofiler agents and " << hsa_agents.size()
|
||||
<< " HSA agents";
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "lib/common/container/small_vector.hpp"
|
||||
#include "lib/common/synchronized.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/agent.hpp"
|
||||
#include "lib/rocprofiler-sdk/aql/helpers.hpp"
|
||||
#include "lib/rocprofiler-sdk/aql/packet_construct.hpp"
|
||||
@@ -32,6 +33,7 @@
|
||||
#include "lib/rocprofiler-sdk/hsa/queue_controller.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
namespace rocprofiler
|
||||
@@ -255,6 +257,7 @@ queue_cb(const std::shared_ptr<counter_callback_info>& info,
|
||||
const hsa::Queue& queue,
|
||||
const hsa::rocprofiler_packet& pkt,
|
||||
uint64_t kernel_id,
|
||||
rocprofiler_user_data_t* user_data,
|
||||
const hsa::Queue::queue_info_session_t::external_corr_id_map_t& extern_corr_ids,
|
||||
const context::correlation_id* correlation_id)
|
||||
{
|
||||
@@ -272,14 +275,25 @@ queue_cb(const std::shared_ptr<counter_callback_info>& info,
|
||||
}
|
||||
}
|
||||
|
||||
rocprofiler_profile_config_id_t req_profile = {.handle = 0};
|
||||
info->user_cb(queue.get_id(),
|
||||
queue.get_agent().get_rocp_agent(),
|
||||
_corr_id_v,
|
||||
&pkt.kernel_dispatch,
|
||||
kernel_id,
|
||||
info->callback_args,
|
||||
&req_profile);
|
||||
auto req_profile = rocprofiler_profile_config_id_t{.handle = 0};
|
||||
auto dispatch_data =
|
||||
common::init_public_api_struct(rocprofiler_profile_counting_dispatch_data_t{});
|
||||
|
||||
dispatch_data.kernel_id = kernel_id;
|
||||
dispatch_data.agent_id = CHECK_NOTNULL(queue.get_agent().get_rocp_agent())->id;
|
||||
dispatch_data.queue_id = queue.get_id();
|
||||
dispatch_data.correlation_id = _corr_id_v;
|
||||
dispatch_data.private_segment_size = pkt.kernel_dispatch.private_segment_size;
|
||||
dispatch_data.group_segment_size = pkt.kernel_dispatch.group_segment_size;
|
||||
dispatch_data.workgroup_size = {pkt.kernel_dispatch.workgroup_size_x,
|
||||
pkt.kernel_dispatch.workgroup_size_y,
|
||||
pkt.kernel_dispatch.workgroup_size_z};
|
||||
dispatch_data.grid_size = {pkt.kernel_dispatch.grid_size_x,
|
||||
pkt.kernel_dispatch.grid_size_y,
|
||||
pkt.kernel_dispatch.grid_size_z};
|
||||
|
||||
info->user_cb(dispatch_data, &req_profile, user_data, info->callback_args);
|
||||
|
||||
if(req_profile.handle == 0) return nullptr;
|
||||
|
||||
auto prof_config = get_controller().get_profile_cfg(req_profile);
|
||||
@@ -407,13 +421,27 @@ completed_cb(const std::shared_ptr<counter_callback_info>& info,
|
||||
if(!out.empty())
|
||||
{
|
||||
CHECK(info->record_callback);
|
||||
info->record_callback(queue.get_id(),
|
||||
queue.get_agent().get_rocp_agent()->id,
|
||||
_corr_id_v,
|
||||
session.kernel_id,
|
||||
info->record_callback_args,
|
||||
out.size(),
|
||||
out.data());
|
||||
|
||||
auto dispatch_data =
|
||||
common::init_public_api_struct(rocprofiler_profile_counting_dispatch_data_t{});
|
||||
|
||||
const auto& kernel_dispatch_pkt = session.kernel_pkt.kernel_dispatch;
|
||||
|
||||
dispatch_data.kernel_id = session.kernel_id;
|
||||
dispatch_data.agent_id = CHECK_NOTNULL(queue.get_agent().get_rocp_agent())->id;
|
||||
dispatch_data.queue_id = queue.get_id();
|
||||
dispatch_data.correlation_id = _corr_id_v;
|
||||
dispatch_data.private_segment_size = kernel_dispatch_pkt.private_segment_size;
|
||||
dispatch_data.group_segment_size = kernel_dispatch_pkt.group_segment_size;
|
||||
dispatch_data.workgroup_size = {kernel_dispatch_pkt.workgroup_size_x,
|
||||
kernel_dispatch_pkt.workgroup_size_y,
|
||||
kernel_dispatch_pkt.workgroup_size_z};
|
||||
dispatch_data.grid_size = {kernel_dispatch_pkt.grid_size_x,
|
||||
kernel_dispatch_pkt.grid_size_y,
|
||||
kernel_dispatch_pkt.grid_size_z};
|
||||
|
||||
info->record_callback(
|
||||
dispatch_data, out.data(), out.size(), session.user_data, info->record_callback_args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -436,9 +464,11 @@ start_context(const context::context* ctx)
|
||||
[=](const hsa::Queue& q,
|
||||
const hsa::rocprofiler_packet& kern_pkt,
|
||||
uint64_t kernel_id,
|
||||
rocprofiler_user_data_t* user_data,
|
||||
const hsa::Queue::queue_info_session_t::external_corr_id_map_t& extern_corr_ids,
|
||||
const context::correlation_id* correlation_id) {
|
||||
return queue_cb(cb, q, kern_pkt, kernel_id, extern_corr_ids, correlation_id);
|
||||
return queue_cb(
|
||||
cb, q, kern_pkt, kernel_id, user_data, extern_corr_ids, correlation_id);
|
||||
},
|
||||
// Completion CB
|
||||
[=](const hsa::Queue& q,
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <rocprofiler-sdk/agent.h>
|
||||
#include <rocprofiler-sdk/dispatch_profile.h>
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
|
||||
#include "lib/rocprofiler-sdk/aql/helpers.hpp"
|
||||
#include "lib/rocprofiler-sdk/aql/packet_construct.hpp"
|
||||
@@ -80,7 +81,6 @@ struct counter_callback_info
|
||||
// HSA Queue ClientID. This is an ID we get when we insert a callback into the
|
||||
// HSA queue interceptor. This ID can be used to disable the callback.
|
||||
rocprofiler::hsa::ClientID queue_id{-1};
|
||||
|
||||
// Buffer to use for storing counter data. Used if callback is not set.
|
||||
std::optional<rocprofiler_buffer_id_t> buffer;
|
||||
|
||||
@@ -130,6 +130,7 @@ queue_cb(const std::shared_ptr<counter_callback_info>& info,
|
||||
const hsa::Queue& queue,
|
||||
const hsa::rocprofiler_packet& pkt,
|
||||
uint64_t kernel_id,
|
||||
rocprofiler_user_data_t* user_data,
|
||||
const hsa::Queue::queue_info_session_t::external_corr_id_map_t& extern_corr_ids,
|
||||
const context::correlation_id* correlation_id);
|
||||
|
||||
|
||||
@@ -20,10 +20,23 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <sstream>
|
||||
#include <tuple>
|
||||
#include "lib/rocprofiler-sdk/counters/core.hpp"
|
||||
#include "lib/common/static_object.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/agent.hpp"
|
||||
#include "lib/rocprofiler-sdk/buffer.hpp"
|
||||
#include "lib/rocprofiler-sdk/context/context.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/id_decode.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/metrics.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/agent_cache.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/queue.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/queue_controller.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
|
||||
#include <rocprofiler-sdk/dispatch_profile.h>
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/registration.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <gtest/gtest.h>
|
||||
@@ -31,21 +44,10 @@
|
||||
#include <hsa/hsa_api_trace.h>
|
||||
#include <hsa/hsa_ext_amd.h>
|
||||
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include "lib/common/static_object.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/agent.hpp"
|
||||
#include "lib/rocprofiler-sdk/buffer.hpp"
|
||||
#include "lib/rocprofiler-sdk/context/context.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/core.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/id_decode.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/metrics.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/agent_cache.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/queue.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/queue_controller.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
#include "rocprofiler-sdk/registration.h"
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <sstream>
|
||||
#include <tuple>
|
||||
|
||||
using namespace rocprofiler::counters;
|
||||
using namespace rocprofiler;
|
||||
@@ -204,13 +206,10 @@ buffered_callback(rocprofiler_context_id_t,
|
||||
}
|
||||
|
||||
void
|
||||
null_dispatch_callback(rocprofiler_queue_id_t,
|
||||
const rocprofiler_agent_t*,
|
||||
rocprofiler_correlation_id_t,
|
||||
const hsa_kernel_dispatch_packet_t*,
|
||||
uint64_t,
|
||||
void*,
|
||||
rocprofiler_profile_config_id_t*)
|
||||
null_dispatch_callback(rocprofiler_profile_counting_dispatch_data_t,
|
||||
rocprofiler_profile_config_id_t*,
|
||||
rocprofiler_user_data_t*,
|
||||
void*)
|
||||
{}
|
||||
|
||||
void
|
||||
@@ -223,13 +222,11 @@ null_buffered_callback(rocprofiler_context_id_t,
|
||||
{}
|
||||
|
||||
void
|
||||
null_record_callback(rocprofiler_queue_id_t,
|
||||
rocprofiler_agent_id_t,
|
||||
rocprofiler_correlation_id_t,
|
||||
uint64_t,
|
||||
void*,
|
||||
null_record_callback(rocprofiler_profile_counting_dispatch_data_t,
|
||||
rocprofiler_record_counter_t*,
|
||||
size_t,
|
||||
rocprofiler_record_counter_t*)
|
||||
rocprofiler_user_data_t,
|
||||
void*)
|
||||
{}
|
||||
|
||||
} // namespace
|
||||
@@ -326,10 +323,10 @@ public:
|
||||
, _agent(a)
|
||||
, _id(id)
|
||||
{}
|
||||
virtual const AgentCache& get_agent() const override final { return _agent; };
|
||||
virtual rocprofiler_queue_id_t get_id() const override final { return _id; };
|
||||
const AgentCache& get_agent() const final { return _agent; };
|
||||
rocprofiler_queue_id_t get_id() const final { return _id; };
|
||||
|
||||
~FakeQueue() {}
|
||||
~FakeQueue() override = default;
|
||||
|
||||
private:
|
||||
const AgentCache& _agent;
|
||||
@@ -339,39 +336,60 @@ private:
|
||||
} // namespace hsa
|
||||
} // namespace rocprofiler
|
||||
|
||||
bool
|
||||
operator==(rocprofiler_dim3_t lhs, rocprofiler_dim3_t rhs)
|
||||
{
|
||||
return std::tie(lhs.x, lhs.y, lhs.z) == std::tie(rhs.x, rhs.y, rhs.z);
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(rocprofiler_agent_id_t lhs, rocprofiler_agent_id_t rhs)
|
||||
{
|
||||
return (lhs.handle == rhs.handle);
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
struct expected_dispatch
|
||||
{
|
||||
// To pass back
|
||||
rocprofiler_profile_config_id_t id;
|
||||
|
||||
rocprofiler_queue_id_t queue_id;
|
||||
const rocprofiler_agent_t* agent;
|
||||
rocprofiler_correlation_id_t correlation_id;
|
||||
hsa_kernel_dispatch_packet_t* dispatch_packet;
|
||||
uint64_t kernel_id;
|
||||
rocprofiler_profile_config_id_t* config;
|
||||
rocprofiler_profile_config_id_t id = {};
|
||||
rocprofiler_queue_id_t queue_id = {.handle = 0};
|
||||
rocprofiler_agent_id_t agent_id = {.handle = 0};
|
||||
uint64_t kernel_id = 0;
|
||||
rocprofiler_correlation_id_t correlation_id = {.internal = 0, .external = {.value = 0}};
|
||||
rocprofiler_dim3_t workgroup_size = {0, 0, 0};
|
||||
rocprofiler_dim3_t grid_size = {0, 0, 0};
|
||||
rocprofiler_profile_config_id_t* config = nullptr;
|
||||
};
|
||||
|
||||
void
|
||||
user_dispatch_cb(rocprofiler_queue_id_t queue_id,
|
||||
const rocprofiler_agent_t* agent,
|
||||
rocprofiler_correlation_id_t correlation_id,
|
||||
const hsa_kernel_dispatch_packet_t* dispatch_packet,
|
||||
uint64_t kernel_id,
|
||||
void* callback_data_args,
|
||||
rocprofiler_profile_config_id_t* config)
|
||||
user_dispatch_cb(rocprofiler_profile_counting_dispatch_data_t dispatch_data,
|
||||
rocprofiler_profile_config_id_t* config,
|
||||
rocprofiler_user_data_t* user_data,
|
||||
void* callback_data_args)
|
||||
{
|
||||
expected_dispatch& expected = *static_cast<expected_dispatch*>(callback_data_args);
|
||||
ASSERT_EQ(expected.agent, agent);
|
||||
ASSERT_EQ(expected.queue_id.handle, queue_id.handle);
|
||||
ASSERT_EQ(expected.correlation_id.internal, correlation_id.internal);
|
||||
ASSERT_EQ(expected.correlation_id.external.ptr, correlation_id.external.ptr);
|
||||
ASSERT_EQ(expected.correlation_id.external.value, correlation_id.external.value);
|
||||
ASSERT_EQ(expected.dispatch_packet, dispatch_packet);
|
||||
ASSERT_EQ(expected.kernel_id, kernel_id);
|
||||
|
||||
auto agent_id = dispatch_data.agent_id;
|
||||
auto queue_id = dispatch_data.queue_id;
|
||||
auto correlation_id = dispatch_data.correlation_id;
|
||||
auto kernel_id = dispatch_data.kernel_id;
|
||||
|
||||
EXPECT_EQ(sizeof(rocprofiler_profile_counting_dispatch_data_t), dispatch_data.size);
|
||||
EXPECT_EQ(expected.kernel_id, kernel_id);
|
||||
EXPECT_EQ(expected.agent_id, agent_id);
|
||||
EXPECT_EQ(expected.queue_id.handle, queue_id.handle);
|
||||
EXPECT_EQ(expected.correlation_id.internal, correlation_id.internal);
|
||||
EXPECT_EQ(expected.correlation_id.external.ptr, correlation_id.external.ptr);
|
||||
EXPECT_EQ(expected.correlation_id.external.value, correlation_id.external.value);
|
||||
EXPECT_EQ(expected.workgroup_size, dispatch_data.workgroup_size);
|
||||
EXPECT_EQ(expected.grid_size, dispatch_data.grid_size);
|
||||
|
||||
ASSERT_NE(config, nullptr);
|
||||
config->handle = expected.id.handle;
|
||||
|
||||
(void) user_data;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -440,17 +458,22 @@ TEST(core, check_callbacks)
|
||||
hsa::rocprofiler_packet pkt;
|
||||
pkt.ext_amd_aql_pm4.header = count++;
|
||||
|
||||
expected.correlation_id = {.internal = corr_id.internal,
|
||||
expected.correlation_id = {.internal = corr_id.internal,
|
||||
.external = context::null_user_data};
|
||||
expected.dispatch_packet = &pkt.kernel_dispatch;
|
||||
expected.kernel_id = count++;
|
||||
expected.queue_id = qid;
|
||||
expected.agent = fq.get_agent().get_rocp_agent();
|
||||
expected.workgroup_size = {pkt.kernel_dispatch.workgroup_size_x,
|
||||
pkt.kernel_dispatch.workgroup_size_y,
|
||||
pkt.kernel_dispatch.workgroup_size_z};
|
||||
expected.grid_size = {pkt.kernel_dispatch.grid_size_x,
|
||||
pkt.kernel_dispatch.grid_size_y,
|
||||
pkt.kernel_dispatch.grid_size_z};
|
||||
expected.kernel_id = count++;
|
||||
expected.queue_id = qid;
|
||||
expected.agent_id = fq.get_agent().get_rocp_agent()->id;
|
||||
|
||||
hsa::Queue::queue_info_session_t::external_corr_id_map_t extern_ids = {};
|
||||
|
||||
auto ret_pkt =
|
||||
counters::queue_cb(cb_info, fq, pkt, expected.kernel_id, extern_ids, &corr_id);
|
||||
auto user_data = rocprofiler_user_data_t{.value = corr_id.internal};
|
||||
auto ret_pkt = counters::queue_cb(
|
||||
cb_info, fq, pkt, expected.kernel_id, &user_data, extern_ids, &corr_id);
|
||||
|
||||
ASSERT_TRUE(ret_pkt) << fmt::format("Expected a packet to be generated for - {}",
|
||||
metric.name());
|
||||
|
||||
@@ -20,14 +20,6 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <hsa/hsa.h>
|
||||
#include <hsa/hsa_api_trace.h>
|
||||
#include <hsa/hsa_ext_amd.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include "lib/common/static_object.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/agent.hpp"
|
||||
@@ -42,7 +34,15 @@
|
||||
#include "lib/rocprofiler-sdk/hsa/queue.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/queue_controller.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
#include "rocprofiler-sdk/registration.h"
|
||||
|
||||
#include <rocprofiler-sdk/registration.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <hsa/hsa.h>
|
||||
#include <hsa/hsa_api_trace.h>
|
||||
#include <hsa/hsa_ext_amd.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
@@ -20,16 +20,6 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <sstream>
|
||||
#include <tuple>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include "lib/common/static_object.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/buffer.hpp"
|
||||
@@ -37,7 +27,18 @@
|
||||
#include "lib/rocprofiler-sdk/counters/id_decode.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/metrics.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
#include "rocprofiler-sdk/registration.h"
|
||||
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/registration.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <sstream>
|
||||
#include <tuple>
|
||||
|
||||
using namespace rocprofiler::counters;
|
||||
|
||||
@@ -125,13 +126,10 @@ buffered_callback(rocprofiler_context_id_t,
|
||||
{}
|
||||
|
||||
void
|
||||
dispatch_callback(rocprofiler_queue_id_t,
|
||||
const rocprofiler_agent_t*,
|
||||
rocprofiler_correlation_id_t,
|
||||
const hsa_kernel_dispatch_packet_t*,
|
||||
uint64_t,
|
||||
void*,
|
||||
rocprofiler_profile_config_id_t*)
|
||||
dispatch_callback(rocprofiler_profile_counting_dispatch_data_t,
|
||||
rocprofiler_profile_config_id_t*,
|
||||
rocprofiler_user_data_t*,
|
||||
void*)
|
||||
{}
|
||||
|
||||
rocprofiler_context_id_t&
|
||||
|
||||
@@ -166,12 +166,131 @@ get_names()
|
||||
|
||||
namespace
|
||||
{
|
||||
using hsa_loader_table_t = hsa_ven_amd_loader_1_01_pfn_t;
|
||||
using context_t = context::context;
|
||||
using user_data_t = rocprofiler_user_data_t;
|
||||
using context_array_t = context::context_array_t;
|
||||
using context_user_data_map_t = std::unordered_map<const context_t*, user_data_t>;
|
||||
using name_array_t = std::vector<std::pair<size_t, std::unique_ptr<std::string>>>;
|
||||
using hsa_loader_table_t = hsa_ven_amd_loader_1_01_pfn_t;
|
||||
using context_t = context::context;
|
||||
using user_data_t = rocprofiler_user_data_t;
|
||||
using context_array_t = context::context_array_t;
|
||||
using context_user_data_map_t = std::unordered_map<const context_t*, user_data_t>;
|
||||
using name_array_t = std::vector<std::pair<size_t, std::unique_ptr<std::string>>>;
|
||||
using amd_compute_pgm_rsrc_three32_t = uint32_t;
|
||||
|
||||
struct kernel_descriptor_t
|
||||
{
|
||||
uint8_t reserved0[16];
|
||||
int64_t kernel_code_entry_byte_offset;
|
||||
uint8_t reserved1[20];
|
||||
uint32_t compute_pgm_rsrc3;
|
||||
uint32_t compute_pgm_rsrc1;
|
||||
uint32_t compute_pgm_rsrc2;
|
||||
uint16_t kernel_code_properties;
|
||||
uint8_t reserved2[6];
|
||||
};
|
||||
|
||||
// AMD Compute Program Resource Register Three.
|
||||
enum amd_compute_gfx9_pgm_rsrc_three_t
|
||||
{
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_ACCUM_OFFSET, 0, 5),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_TG_SPLIT, 16, 1)
|
||||
};
|
||||
|
||||
enum amd_compute_gfx10_gfx11_pgm_rsrc_three_t
|
||||
{
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_SHARED_VGPR_COUNT, 0, 4),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_INST_PREF_SIZE, 4, 6),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_TRAP_ON_START, 10, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_TRAP_ON_END, 11, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_COMPUTE_PGM_RSRC_THREE_IMAGE_OP, 31, 1)
|
||||
};
|
||||
|
||||
// Kernel code properties.
|
||||
enum amd_kernel_code_property_t
|
||||
{
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER,
|
||||
0,
|
||||
1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR, 1, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR, 2, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR,
|
||||
3,
|
||||
1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID, 4, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT, 5, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE,
|
||||
6,
|
||||
1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_RESERVED0, 7, 3),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
|
||||
10,
|
||||
1), // GFX10+
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK, 11, 1),
|
||||
AMD_HSA_BITS_CREATE_ENUM_ENTRIES(AMD_KERNEL_CODE_PROPERTY_RESERVED1, 12, 4),
|
||||
};
|
||||
|
||||
uint32_t
|
||||
arch_vgpr_count(std::string_view name, kernel_descriptor_t kernel_code)
|
||||
{
|
||||
if(name == "gfx90a" || name.find("gfx94") == 0)
|
||||
return (AMD_HSA_BITS_GET(kernel_code.compute_pgm_rsrc3,
|
||||
AMD_COMPUTE_PGM_RSRC_THREE_ACCUM_OFFSET) +
|
||||
1) *
|
||||
4;
|
||||
|
||||
return (AMD_HSA_BITS_GET(kernel_code.compute_pgm_rsrc1,
|
||||
AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT) +
|
||||
1) *
|
||||
(AMD_HSA_BITS_GET(kernel_code.kernel_code_properties,
|
||||
AMD_KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)
|
||||
? 8
|
||||
: 4);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
accum_vgpr_count(std::string_view name, kernel_descriptor_t kernel_code)
|
||||
{
|
||||
if(name == "gfx908")
|
||||
return arch_vgpr_count(name, kernel_code);
|
||||
else if(name == "gfx90a" || name.find("gfx94") == 0)
|
||||
return (AMD_HSA_BITS_GET(kernel_code.compute_pgm_rsrc1,
|
||||
AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT) +
|
||||
1) *
|
||||
(8 - arch_vgpr_count(name, kernel_code));
|
||||
|
||||
LOG(WARNING) << "Missing support for accum_vgpr_count for " << name;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
sgpr_count(std::string_view name, kernel_descriptor_t kernel_code)
|
||||
{
|
||||
// GFX10 and later always allocate 128 sgprs.
|
||||
constexpr uint32_t gfx10_sgprs = 128;
|
||||
|
||||
auto begp = name.find_first_of("0123456789");
|
||||
if(!name.empty() && begp != std::string_view::npos)
|
||||
{
|
||||
auto endp = name.find_first_not_of("0123456789", begp);
|
||||
auto lenp = (endp - begp) + 1;
|
||||
auto gfxip_str = name.substr(begp, lenp);
|
||||
auto gfxip_n = int32_t{0};
|
||||
if(!gfxip_str.empty()) gfxip_n = std::stoi(std::string{gfxip_str});
|
||||
|
||||
if(gfxip_n >= 1000)
|
||||
{
|
||||
return gfx10_sgprs;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (AMD_HSA_BITS_GET(kernel_code.compute_pgm_rsrc1,
|
||||
AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT) /
|
||||
2 +
|
||||
1) *
|
||||
16;
|
||||
}
|
||||
}
|
||||
|
||||
LOG(WARNING) << "Missing support for sgpr_count for " << name;
|
||||
return 0;
|
||||
}
|
||||
|
||||
name_array_t*
|
||||
get_string_array()
|
||||
@@ -212,6 +331,41 @@ get_loader_table()
|
||||
return _v;
|
||||
}
|
||||
|
||||
auto*&
|
||||
get_status_string_function()
|
||||
{
|
||||
static decltype(::hsa_status_string)* _v = nullptr;
|
||||
return _v;
|
||||
}
|
||||
|
||||
std::string_view
|
||||
get_status_string(hsa_status_t _status)
|
||||
{
|
||||
const char* _msg = nullptr;
|
||||
if(get_status_string_function() &&
|
||||
get_status_string_function()(_status, &_msg) == HSA_STATUS_SUCCESS && _msg)
|
||||
return std::string_view{_msg};
|
||||
|
||||
return std::string_view{"(unknown HSA error)"};
|
||||
}
|
||||
|
||||
const kernel_descriptor_t*
|
||||
get_kernel_descriptor(uint64_t kernel_object)
|
||||
{
|
||||
const kernel_descriptor_t* kernel_code = nullptr;
|
||||
if(get_loader_table().hsa_ven_amd_loader_query_host_address == nullptr) return kernel_code;
|
||||
hsa_status_t status = get_loader_table().hsa_ven_amd_loader_query_host_address(
|
||||
reinterpret_cast<const void*>(kernel_object), // NOLINT(performance-no-int-to-ptr)
|
||||
reinterpret_cast<const void**>(&kernel_code));
|
||||
if(status == HSA_STATUS_SUCCESS) return kernel_code;
|
||||
|
||||
LOG(WARNING) << "hsa_ven_amd_loader_query_host_address(kernel_object=" << kernel_object
|
||||
<< ") returned " << status << ": " << get_status_string(status);
|
||||
|
||||
// NOLINTNEXTLINE(performance-no-int-to-ptr)
|
||||
return reinterpret_cast<kernel_descriptor_t*>(kernel_object);
|
||||
}
|
||||
|
||||
struct kernel_symbol
|
||||
{
|
||||
using kernel_symbol_data_t =
|
||||
@@ -441,6 +595,19 @@ executable_iterate_agent_symbols_load_callback(hsa_executable_t executabl
|
||||
ROCP_HSA_CORE_GET_EXE_SYMBOL_INFO(HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE,
|
||||
&data.private_segment_size);
|
||||
|
||||
// This works for gfx9 but may not for Navi arch
|
||||
const auto* kernel_descript = get_kernel_descriptor(data.kernel_object);
|
||||
if(CHECK_NOTNULL(code_obj_v) && CHECK_NOTNULL(kernel_descript))
|
||||
{
|
||||
const auto* rocp_agent = agent::get_agent(code_obj_v->rocp_data.rocp_agent);
|
||||
if(CHECK_NOTNULL(rocp_agent))
|
||||
{
|
||||
data.arch_vgpr_count = arch_vgpr_count(rocp_agent->name, *kernel_descript);
|
||||
data.accum_vgpr_count = accum_vgpr_count(rocp_agent->name, *kernel_descript);
|
||||
data.sgpr_count = sgpr_count(rocp_agent->name, *kernel_descript);
|
||||
}
|
||||
}
|
||||
|
||||
// if we have reached this point (i.e. there were no HSA errors returned within macro) then we
|
||||
// generate a unique kernel symbol id
|
||||
data.kernel_id = ++get_kernel_symbol_id();
|
||||
@@ -905,10 +1072,13 @@ code_object_init(HsaApiTable* table)
|
||||
{
|
||||
auto& core_table = *table->core_;
|
||||
|
||||
get_status_string_function() = core_table.hsa_status_string_fn;
|
||||
|
||||
auto _status = core_table.hsa_system_get_major_extension_table_fn(
|
||||
HSA_EXTENSION_AMD_LOADER, 1, sizeof(hsa_loader_table_t), &get_loader_table());
|
||||
|
||||
LOG_IF(ERROR, _status != HSA_STATUS_SUCCESS) << "hsa_system_get_major_extension_table failed";
|
||||
LOG_IF(ERROR, _status != HSA_STATUS_SUCCESS)
|
||||
<< "hsa_system_get_major_extension_table failed: " << get_status_string(_status);
|
||||
|
||||
if(_status == HSA_STATUS_SUCCESS)
|
||||
{
|
||||
|
||||
@@ -253,8 +253,9 @@ WriteInterceptor(const void* packets,
|
||||
return;
|
||||
}
|
||||
|
||||
auto thr_id = common::get_tid();
|
||||
auto* corr_id = context::get_latest_correlation_id();
|
||||
auto thr_id = common::get_tid();
|
||||
auto* corr_id = context::get_latest_correlation_id();
|
||||
auto user_data = rocprofiler_user_data_t{.value = 0};
|
||||
|
||||
// use thread-local value to reuse allocation
|
||||
auto extern_corr_ids = Queue::queue_info_session_t::external_corr_id_map_t{};
|
||||
@@ -300,8 +301,8 @@ WriteInterceptor(const void* packets,
|
||||
queue.signal_callback([&](const auto& map) {
|
||||
for(const auto& [client_id, cb_pair] : map)
|
||||
{
|
||||
if(auto maybe_pkt =
|
||||
cb_pair.first(queue, kernel_pkt, kernel_id, extern_corr_ids, corr_id))
|
||||
if(auto maybe_pkt = cb_pair.first(
|
||||
queue, kernel_pkt, kernel_id, &user_data, extern_corr_ids, corr_id))
|
||||
{
|
||||
inst_pkt.push_back(std::make_pair(std::move(maybe_pkt), client_id));
|
||||
}
|
||||
@@ -381,6 +382,7 @@ WriteInterceptor(const void* packets,
|
||||
.tid = thr_id,
|
||||
.kernel_id = kernel_id,
|
||||
.queue_id = queue.get_id(),
|
||||
.user_data = user_data,
|
||||
.hsa_agent = queue.get_agent().get_hsa_agent(),
|
||||
.rocp_agent = queue.get_agent().get_rocp_agent(),
|
||||
.correlation_id = corr_id,
|
||||
|
||||
@@ -122,6 +122,7 @@ public:
|
||||
rocprofiler_thread_id_t tid = common::get_tid();
|
||||
rocprofiler_kernel_id_t kernel_id = 0;
|
||||
rocprofiler_queue_id_t queue_id = {};
|
||||
rocprofiler_user_data_t user_data = {.value = 0};
|
||||
hsa_agent_t hsa_agent = {};
|
||||
const rocprofiler_agent_t* rocp_agent = nullptr;
|
||||
context::correlation_id* correlation_id = nullptr;
|
||||
@@ -137,6 +138,7 @@ public:
|
||||
const Queue&,
|
||||
const rocprofiler_packet&,
|
||||
uint64_t,
|
||||
rocprofiler_user_data_t*,
|
||||
const queue_info_session_t::external_corr_id_map_t&,
|
||||
const context::correlation_id*)>;
|
||||
// Signals the completion of the kernel packet.
|
||||
@@ -220,4 +222,4 @@ Queue::signal_callback(FuncT&& func) const
|
||||
}
|
||||
|
||||
} // namespace hsa
|
||||
} // namespace rocprofiler
|
||||
} // namespace rocprofiler
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <glog/logging.h>
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include "lib/common/synchronized.hpp"
|
||||
@@ -31,7 +31,8 @@
|
||||
#include "lib/rocprofiler-sdk/counters/evaluate_ast.hpp"
|
||||
#include "lib/rocprofiler-sdk/counters/metrics.hpp"
|
||||
#include "lib/rocprofiler-sdk/hsa/agent_cache.hpp"
|
||||
#include "rocprofiler-sdk/fwd.h"
|
||||
|
||||
#include <glog/logging.h>
|
||||
|
||||
extern "C" {
|
||||
/**
|
||||
|
||||
@@ -235,14 +235,15 @@ find_clients()
|
||||
{
|
||||
for(const auto& itr : env)
|
||||
{
|
||||
LOG(INFO) << "searching " << itr << " for rocprofiler_configure";
|
||||
LOG(INFO) << "[env] searching " << itr << " for rocprofiler_configure";
|
||||
|
||||
void* handle = dlopen(itr.c_str(), RTLD_NOLOAD | RTLD_LAZY);
|
||||
|
||||
if(!handle)
|
||||
{
|
||||
LOG(INFO) << itr << " is not already loaded, doing a global lazy dlopen...";
|
||||
handle = dlopen(itr.c_str(), RTLD_GLOBAL | RTLD_LAZY);
|
||||
LOG(WARNING) << "[env] " << itr
|
||||
<< " is not already loaded, doing a local lazy dlopen...";
|
||||
handle = dlopen(itr.c_str(), RTLD_LOCAL | RTLD_LAZY);
|
||||
}
|
||||
|
||||
if(!handle)
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2023 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.
|
||||
|
||||
#include "lib/common/environment.hpp"
|
||||
#include "lib/common/logging.hpp"
|
||||
#include "lib/common/static_object.hpp"
|
||||
#include "lib/rocprofiler-sdk/allocator.hpp"
|
||||
#include "lib/rocprofiler-sdk/registration.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace rocprofiler
|
||||
{
|
||||
namespace shared_library
|
||||
{
|
||||
namespace
|
||||
{
|
||||
struct lifetime
|
||||
{
|
||||
lifetime();
|
||||
~lifetime();
|
||||
};
|
||||
|
||||
lifetime::lifetime()
|
||||
{
|
||||
registration::init_logging();
|
||||
|
||||
if(common::get_env("ROCPROFILER_LIBRARY_CTOR", false))
|
||||
{
|
||||
LOG(INFO) << "Initializing rocprofiler-sdk library...";
|
||||
registration::initialize();
|
||||
LOG(INFO) << "rocprofiler-sdk library initialized";
|
||||
}
|
||||
}
|
||||
|
||||
lifetime::~lifetime()
|
||||
{
|
||||
if(common::get_env("ROCPROFILER_LIBRARY_DTOR", false))
|
||||
{
|
||||
LOG(INFO) << "Finalizing rocprofiler-sdk library...";
|
||||
registration::finalize();
|
||||
LOG(INFO) << "rocprofiler-sdk library finalized";
|
||||
}
|
||||
}
|
||||
|
||||
auto*&
|
||||
get_lifetime()
|
||||
{
|
||||
static auto* _v = common::static_object<lifetime>::construct();
|
||||
return _v;
|
||||
}
|
||||
} // namespace
|
||||
} // namespace shared_library
|
||||
|
||||
auto rocprofiler_sdk_shlib_lifetime = shared_library::get_lifetime();
|
||||
|
||||
void
|
||||
rocprofiler_sdk_shlib_ctor() ROCPROFILER_ATTRIBUTE(constructor(101));
|
||||
|
||||
void
|
||||
rocprofiler_sdk_shlib_ctor()
|
||||
{
|
||||
(void) shared_library::get_lifetime();
|
||||
}
|
||||
} // namespace rocprofiler
|
||||
@@ -22,11 +22,11 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/registration.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
#include "lib/common/defines.hpp"
|
||||
#include "rocprofiler-sdk/fwd.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
@@ -20,10 +20,14 @@
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <hsa/hsa.h>
|
||||
#include <rocprofiler-sdk-roctx/api_trace.h>
|
||||
#include <rocprofiler-sdk-roctx/roctx.h>
|
||||
#include <rocprofiler-sdk-roctx/types.h>
|
||||
#include <rocprofiler-sdk/buffer.h>
|
||||
#include <rocprofiler-sdk/callback_tracing.h>
|
||||
#include <rocprofiler-sdk/context.h>
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
#include <rocprofiler-sdk/marker/api_id.h>
|
||||
#include <rocprofiler-sdk/registration.h>
|
||||
#include <rocprofiler-sdk/rocprofiler.h>
|
||||
|
||||
@@ -33,13 +37,9 @@
|
||||
#include "lib/common/units.hpp"
|
||||
#include "lib/common/utility.hpp"
|
||||
#include "lib/rocprofiler-sdk/tests/common.hpp"
|
||||
#include "rocprofiler-sdk-roctx/api_trace.h"
|
||||
#include "rocprofiler-sdk-roctx/types.h"
|
||||
#include "rocprofiler-sdk/callback_tracing.h"
|
||||
#include "rocprofiler-sdk/context.h"
|
||||
#include "rocprofiler-sdk/marker/api_id.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <hsa/hsa.h>
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
|
||||
新增問題並參考
封鎖使用者