diff --git a/source/lib/output/generateJSON.cpp b/source/lib/output/generateJSON.cpp index 23574d40c1..2f6f046c06 100644 --- a/source/lib/output/generateJSON.cpp +++ b/source/lib/output/generateJSON.cpp @@ -137,12 +137,12 @@ write_json(json_output& json_ar, auto _extern_corr_id_strings = std::map{}; if(cfg.kernel_rename) { - for(auto itr : tool_metadata.external_corr_ids.get()) + for(const auto& itr : tool_metadata.kernel_rename_map.get()) { - if(itr > 0) + if(!itr.first.empty()) { - const auto* _str = tool_metadata.get_string_entry(itr); - if(_str) _extern_corr_id_strings.emplace(itr, *_str); + const auto* _str = common::get_string_entry(itr.first); + if(_str) _extern_corr_id_strings.emplace(itr.second, *_str); } } } diff --git a/source/lib/output/metadata.cpp b/source/lib/output/metadata.cpp index 06e054f840..23e1dbe720 100644 --- a/source/lib/output/metadata.cpp +++ b/source/lib/output/metadata.cpp @@ -496,6 +496,17 @@ metadata::add_runtime_initialization(rocprofiler_runtime_initialization_operatio runtime_op); } +uint64_t +metadata::add_kernel_rename_val(std::string_view rename_string, uint64_t internal_corr_id) +{ + return kernel_rename_map.wlock( + [](auto& _data, std::string_view _str, uint64_t _val) { + return _data.emplace(_str, _val).first->second; + }, + rename_string, + internal_corr_id); +} + bool metadata::is_runtime_initialized(rocprofiler_runtime_initialization_operation_t runtime_op) const { @@ -534,9 +545,17 @@ metadata::get_marker_message(uint64_t corr_id) const std::string_view metadata::get_kernel_name(uint64_t kernel_id, uint64_t rename_id) const { - if(rename_id > 0) + auto string_entry = kernel_rename_map.rlock( + [](auto& _data, uint64_t _val) { + for(const auto& itr : _data) + if(itr.second == _val) return itr.first; + return std::string_view{}; + }, + rename_id); + if(!string_entry.empty()) { - if(const auto* _name = common::get_string_entry(rename_id)) return std::string_view{*_name}; + if(const auto* _name = common::get_string_entry(string_entry)) + return std::string_view{*_name}; } const auto* _kernel_data = get_kernel_symbol(kernel_id); diff --git a/source/lib/output/metadata.hpp b/source/lib/output/metadata.hpp index 5402eba224..560eb8d1f8 100644 --- a/source/lib/output/metadata.hpp +++ b/source/lib/output/metadata.hpp @@ -93,6 +93,7 @@ using synced_obj = common::Synchronized; using pc_sampling_stats_t = rocprofiler_tool_pc_sampling_stats; using runtime_initialization_set_t = std::unordered_set; +using kernel_rename_map_t = std::unordered_map; enum class agent_indexing { @@ -139,6 +140,7 @@ struct metadata synced_map external_corr_ids = {}; synced_map host_functions = {}; synced_map code_object_load = {}; + synced_map kernel_rename_map = {}; att_filenames_map_t att_filenames = {}; synced_obj pc_sampling_stats = {}; synced_obj runtime_initialization_set = {}; @@ -183,13 +185,14 @@ struct metadata template Tp get_marker_messages(Tp&&); - bool add_marker_message(uint64_t corr_id, std::string&& msg); - bool add_code_object(code_object_info obj); - bool add_kernel_symbol(kernel_symbol_info&& sym); - bool add_host_function(host_function_info&& func); - bool add_string_entry(size_t key, std::string_view str); - bool add_external_correlation_id(uint64_t); - bool add_runtime_initialization(rocprofiler_runtime_initialization_operation_t); + bool add_marker_message(uint64_t corr_id, std::string&& msg); + bool add_code_object(code_object_info obj); + bool add_kernel_symbol(kernel_symbol_info&& sym); + bool add_host_function(host_function_info&& func); + bool add_string_entry(size_t key, std::string_view str); + bool add_external_correlation_id(uint64_t); + bool add_runtime_initialization(rocprofiler_runtime_initialization_operation_t); + uint64_t add_kernel_rename_val(std::string_view, uint64_t); void set_process_id(pid_t _pid, pid_t _ppid = 0, diff --git a/source/lib/rocprofiler-sdk-tool/tool.cpp b/source/lib/rocprofiler-sdk-tool/tool.cpp index 4cafbc1af9..e6bc2c072f 100644 --- a/source/lib/rocprofiler-sdk-tool/tool.cpp +++ b/source/lib/rocprofiler-sdk-tool/tool.cpp @@ -569,19 +569,24 @@ kernel_rename_callback(rocprofiler_callback_tracing_record_t record, { auto* marker_data = static_cast(record.payload); + auto add_message = [](std::string_view val) { + auto _hash_v = common::add_string_entry(val); + return std::string_view{*common::get_string_entry(_hash_v)}; + }; if(record.operation == ROCPROFILER_MARKER_CORE_API_ID_roctxMarkA && record.phase == ROCPROFILER_CALLBACK_PHASE_EXIT && marker_data->args.roctxMarkA.message) { - thread_dispatch_rename->emplace( - common::add_string_entry(marker_data->args.roctxMarkA.message)); + thread_dispatch_rename->emplace(tool_metadata->add_kernel_rename_val( + add_message(marker_data->args.roctxMarkA.message), record.correlation_id.internal)); } else if(record.operation == ROCPROFILER_MARKER_CORE_API_ID_roctxRangePushA && record.phase == ROCPROFILER_CALLBACK_PHASE_EXIT && marker_data->args.roctxRangePushA.message) { - thread_dispatch_rename->emplace( - common::add_string_entry(marker_data->args.roctxRangePushA.message)); + thread_dispatch_rename->emplace(tool_metadata->add_kernel_rename_val( + add_message(marker_data->args.roctxRangePushA.message), + record.correlation_id.internal)); } else if(record.operation == ROCPROFILER_MARKER_CORE_API_ID_roctxRangePop && record.phase == ROCPROFILER_CALLBACK_PHASE_ENTER)