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
Esse commit está contido em:
1 pai
665c546e65
commit
7b6d3c70bd
85 files changed
+2497
-856
No files matched your search
@@ -22,7 +22,8 @@
|
||||
|
||||
#include "helper.hpp"
|
||||
#include "config.hpp"
|
||||
#include "rocprofiler-sdk/fwd.h"
|
||||
|
||||
#include <rocprofiler-sdk/fwd.h>
|
||||
|
||||
#include <glog/logging.h>
|
||||
|
||||
@@ -33,198 +34,6 @@
|
||||
#include <unordered_set>
|
||||
#include <utility>
|
||||
|
||||
namespace
|
||||
{
|
||||
using amd_compute_pgm_rsrc_three32_t = uint32_t;
|
||||
|
||||
// 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),
|
||||
};
|
||||
|
||||
std::unordered_map<rocprofiler_address_t, const char*> kernel_descriptor_name_map;
|
||||
|
||||
std::mutex kernel_properties_correlation_mutex;
|
||||
std::unordered_map<uint64_t, rocprofiler_tool_kernel_properties_t>
|
||||
kernel_properties_correlation_map;
|
||||
|
||||
uint32_t
|
||||
arch_vgpr_count(const std::string_view& name, const kernel_descriptor_t& kernel_code)
|
||||
{
|
||||
std::string info_name(name.data(), name.size());
|
||||
if(strcmp(name.data(), "gfx90a") == 0 || strncmp(name.data(), "gfx94", 5) == 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(const std::string_view& name, const kernel_descriptor_t& kernel_code)
|
||||
{
|
||||
std::string info_name(name.data(), name.size());
|
||||
if(strcmp(info_name.c_str(), "gfx908") == 0) return arch_vgpr_count(name, kernel_code);
|
||||
if(strcmp(info_name.c_str(), "gfx90a") == 0 || strncmp(info_name.c_str(), "gfx94", 5) == 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);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
sgpr_count(const std::string_view& name, const kernel_descriptor_t& kernel_code)
|
||||
{
|
||||
// GFX10 and later always allocate 128 sgprs.
|
||||
|
||||
// TODO(srnagara): Recheck the extraction of gfxip from gpu name
|
||||
|
||||
const char* name_data = name.data();
|
||||
const size_t gfxip_label_len = std::min(name.size() - 2, size_t{63});
|
||||
if(gfxip_label_len > 0 && strnlen(name_data, gfxip_label_len + 1) >= gfxip_label_len)
|
||||
{
|
||||
auto gfxip = std::vector<char>{};
|
||||
gfxip.resize(gfxip_label_len + 1, '\0');
|
||||
memcpy(gfxip.data(), name_data, gfxip_label_len);
|
||||
// TODO(srnagara): Check if it is hardcoded
|
||||
if(std::stoi(&gfxip.at(3)) >= 10) return 128;
|
||||
return (AMD_HSA_BITS_GET(kernel_code.compute_pgm_rsrc1,
|
||||
AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT) /
|
||||
2 +
|
||||
1) *
|
||||
16;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const auto&
|
||||
GetLoaderTable()
|
||||
{
|
||||
static const auto _v = []() {
|
||||
using hsa_loader_table_t = hsa_ven_amd_loader_1_01_pfn_t;
|
||||
auto _tbl = hsa_loader_table_t{};
|
||||
memset(&_tbl, 0, sizeof(hsa_loader_table_t));
|
||||
hsa_system_get_major_extension_table(
|
||||
HSA_EXTENSION_AMD_LOADER, 1, sizeof(hsa_loader_table_t), &_tbl);
|
||||
return _tbl;
|
||||
}();
|
||||
return _v;
|
||||
}
|
||||
|
||||
const kernel_descriptor_t*
|
||||
GetKernelCode(uint64_t kernel_object)
|
||||
{
|
||||
const kernel_descriptor_t* kernel_code = nullptr;
|
||||
if(GetLoaderTable().hsa_ven_amd_loader_query_host_address == nullptr) return kernel_code;
|
||||
hsa_status_t status = GetLoaderTable().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(HSA_STATUS_SUCCESS != status)
|
||||
{
|
||||
kernel_code = reinterpret_cast<kernel_descriptor_t*>( // NOLINT(performance-no-int-to-ptr)
|
||||
kernel_object);
|
||||
}
|
||||
return kernel_code;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void
|
||||
SetKernelProperties(uint64_t correlation_id, rocprofiler_tool_kernel_properties_t kernel_properties)
|
||||
{
|
||||
std::lock_guard<std::mutex> kernel_properties_correlation_map_lock(
|
||||
kernel_properties_correlation_mutex);
|
||||
kernel_properties_correlation_map[correlation_id] = std::move(kernel_properties);
|
||||
}
|
||||
|
||||
rocprofiler_tool_kernel_properties_t
|
||||
GetKernelProperties(uint64_t correlation_id)
|
||||
{
|
||||
std::lock_guard<std::mutex> kernel_properties_correlation_map_lock(
|
||||
kernel_properties_correlation_mutex);
|
||||
auto it = kernel_properties_correlation_map.find(correlation_id);
|
||||
if(it == kernel_properties_correlation_map.end())
|
||||
{
|
||||
std::cout << "kernel properties not found" << std::endl;
|
||||
abort();
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
void
|
||||
populate_kernel_properties_data(rocprofiler_tool_kernel_properties_t* kernel_properties,
|
||||
const hsa_kernel_dispatch_packet_t* dispatch_packet)
|
||||
{
|
||||
const uint64_t kernel_object = dispatch_packet->kernel_object;
|
||||
|
||||
const kernel_descriptor_t* kernel_code = GetKernelCode(kernel_object);
|
||||
uint64_t grid_size =
|
||||
dispatch_packet->grid_size_x * dispatch_packet->grid_size_y * dispatch_packet->grid_size_z;
|
||||
if(grid_size > UINT32_MAX) abort();
|
||||
kernel_properties->grid_size = grid_size;
|
||||
uint64_t workgroup_size = dispatch_packet->workgroup_size_x *
|
||||
dispatch_packet->workgroup_size_y * dispatch_packet->workgroup_size_z;
|
||||
if(workgroup_size > UINT32_MAX) abort();
|
||||
kernel_properties->workgroup_size = (uint32_t) workgroup_size;
|
||||
kernel_properties->lds_size = dispatch_packet->group_segment_size;
|
||||
kernel_properties->scratch_size = dispatch_packet->private_segment_size;
|
||||
kernel_properties->arch_vgpr_count =
|
||||
arch_vgpr_count(kernel_properties->gpu_agent.name, *kernel_code);
|
||||
kernel_properties->accum_vgpr_count =
|
||||
accum_vgpr_count(kernel_properties->gpu_agent.name, *kernel_code);
|
||||
kernel_properties->sgpr_count = sgpr_count(kernel_properties->gpu_agent.name, *kernel_code);
|
||||
kernel_properties->wave_size =
|
||||
AMD_HSA_BITS_GET(kernel_code->kernel_code_properties,
|
||||
AMD_KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)
|
||||
? 32
|
||||
: 64;
|
||||
kernel_properties->signal_handle = dispatch_packet->completion_signal.handle;
|
||||
}
|
||||
|
||||
rocprofiler_tool_buffer_name_info_t
|
||||
get_buffer_id_names()
|
||||
{
|
||||
|
||||
Reference in new issue
Bloquear um usuário