diff --git a/projects/rocprofiler-systems/source/lib/binary/analysis.cpp b/projects/rocprofiler-systems/source/lib/binary/analysis.cpp index d579a32397..f914035c40 100644 --- a/projects/rocprofiler-systems/source/lib/binary/analysis.cpp +++ b/projects/rocprofiler-systems/source/lib/binary/analysis.cpp @@ -49,7 +49,6 @@ #include #include #include -#include #include #include "logger/debug.hpp" diff --git a/projects/rocprofiler-systems/source/lib/binary/symbol.cpp b/projects/rocprofiler-systems/source/lib/binary/symbol.cpp index 4e283cfaa2..ae9bd5a39a 100644 --- a/projects/rocprofiler-systems/source/lib/binary/symbol.cpp +++ b/projects/rocprofiler-systems/source/lib/binary/symbol.cpp @@ -22,6 +22,8 @@ #include "core/config.hpp" +#include + #if !defined(TIMEMORY_USE_BFD) # error "BFD support not enabled" #endif @@ -119,7 +121,8 @@ symbol::operator()(const std::vector& _filters) const return (sf::satisfies_filter(_filters, sf::FUNCTION_FILTER, rocprofsys::utility::demangle(func)) && (sf::satisfies_filter(_filters, sf::SOURCE_FILTER, file) || - sf::satisfies_filter(_filters, sf::SOURCE_FILTER, join(':', file, line)))); + sf::satisfies_filter(_filters, sf::SOURCE_FILTER, + fmt::format("{}:{}", file, line)))); } symbol& @@ -288,7 +291,7 @@ symbol::get_inline_symbols(const std::vector& _filters) const rocprofsys::utility::demangle(itr.func)) && (sf::satisfies_filter(_filters, sf::SOURCE_FILTER, itr.file) || sf::satisfies_filter(_filters, sf::SOURCE_FILTER, - join(':', itr.file, itr.line)))) + fmt::format("{}:{}", itr.file, itr.line)))) { if constexpr(concepts::is_unqualified_same::value) { @@ -325,7 +328,7 @@ symbol::get_debug_line_info(const std::vector& _filters) const { if(sf::satisfies_filter(_filters, sf::SOURCE_FILTER, itr.file) || sf::satisfies_filter(_filters, sf::SOURCE_FILTER, - join(':', itr.file, itr.line))) + fmt::format("{}:{}", itr.file, itr.line))) { if constexpr(concepts::is_unqualified_same::value) { diff --git a/projects/rocprofiler-systems/source/lib/core/argparse.cpp b/projects/rocprofiler-systems/source/lib/core/argparse.cpp index b4ea4c41d1..f19e2ee309 100644 --- a/projects/rocprofiler-systems/source/lib/core/argparse.cpp +++ b/projects/rocprofiler-systems/source/lib/core/argparse.cpp @@ -30,21 +30,20 @@ #include #include -#include #include "logger/debug.hpp" +#include + namespace rocprofsys { namespace argparse { namespace { -namespace filepath = ::tim::filepath; -namespace path = rocprofsys::common::path; -using array_config_t = ::timemory::join::array_config; +namespace filepath = ::tim::filepath; +namespace path = rocprofsys::common::path; using rocprofsys::common::remove_env; -using ::timemory::join::join; auto get_clock_id_choices() @@ -305,7 +304,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .dtype("filepath") .action([&](parser_t& p) { update_env(_data, "ROCPROFSYS_CONFIG_FILE", - join(array_config_t{ ":" }, p.get("config"))); + fmt::format("{}", fmt::join(p.get("config"), ":"))); }); _data.processed_environs.emplace("config"); @@ -501,10 +500,9 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .min_count(1) .dtype("period-spec(s)") .action([&](parser_t& p) { - update_env( - _data, "ROCPROFSYS_TRACE_PERIODS", - join(array_config_t{ " ", "", "" }, p.get("periods")), - update_mode::WEAK); + update_env(_data, "ROCPROFSYS_TRACE_PERIODS", + fmt::format("{}", fmt::join(p.get("periods"), " ")), + update_mode::WEAK); }); _data.processed_environs.emplace("periods"); @@ -732,9 +730,9 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .min_count(1) .dtype("period-spec(s)") .action([&](parser_t& p) { - update_env(_data, "ROCPROFSYS_TRACE_PERIODS", - join(array_config_t{ ",", "", "" }, - p.get("trace-periods"))); + update_env( + _data, "ROCPROFSYS_TRACE_PERIODS", + fmt::format("{}", fmt::join(p.get("trace-periods"), ","))); }); _data.processed_environs.emplace("trace_periods"); @@ -887,7 +885,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .required({ "host" }) .action([&](parser_t& p) { update_env(_data, "ROCPROFSYS_SAMPLING_CPUS", - join(array_config_t{ "," }, p.get("cpus"))); + fmt::format("{}", fmt::join(p.get("cpus"), ","))); }); _data.processed_environs.emplace("cpus"); @@ -903,7 +901,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .required({ "device" }) .action([&](parser_t& p) { update_env(_data, "ROCPROFSYS_SAMPLING_GPUS", - join(array_config_t{ "," }, p.get("gpus"))); + fmt::format("{}", fmt::join(p.get("gpus"), ","))); }); _data.processed_environs.emplace("gpus"); @@ -942,7 +940,8 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .action([&](parser_t& p) { update_env( _data, "ROCPROFSYS_SAMPLING_TIDS", - join(array_config_t{ ", " }, p.get>("tids"))); + fmt::format("{}", + fmt::join(p.get>("tids"), ", "))); }); _data.processed_environs.emplace("tids"); @@ -1013,7 +1012,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) if(!_v.empty()) { update_env(_data, "ROCPROFSYS_SAMPLING_CPUTIME_TIDS", - join(array_config_t{ "," }, _v)); + fmt::format("{}", fmt::join(_v, ","))); } }); @@ -1041,7 +1040,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) if(!_v.empty()) { update_env(_data, "ROCPROFSYS_SAMPLING_REALTIME_TIDS", - join(array_config_t{ "," }, _v)); + fmt::format("{}", fmt::join(_v, ","))); } }); @@ -1061,10 +1060,10 @@ add_core_arguments(parser_t& _parser, parser_data& _data) { if(p.exists("sampling-overflow-event") && _v.front() != p.get("sampling-overflow-event")) - throw exception(join( - "", "'--sample-overflow ", _v.front(), - " ...' conflicts with '--sampling-overflow-event ", - p.get("sampling-overflow-event"), "' option")); + throw exception(fmt::format( + "'--sample-overflow {} ...' conflicts with " + "'--sampling-overflow-event {}' option", + _v.front(), p.get("sampling-overflow-event"))); update_env(_data, "ROCPROFSYS_SAMPLING_OVERFLOW_EVENT", _v.front()); _v.pop_front(); } @@ -1076,7 +1075,7 @@ add_core_arguments(parser_t& _parser, parser_data& _data) if(!_v.empty()) { update_env(_data, "ROCPROFSYS_SAMPLING_OVERFLOW_TIDS", - join(array_config_t{ "," }, _v)); + fmt::format("{}", fmt::join(_v, ","))); } }); @@ -1100,7 +1099,8 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .min_count(1) .dtype("[EVENT ...]") .action([&](parser_t& p) { - auto _events = join(array_config_t{ "," }, p.get("cpu-events")); + auto _events = + fmt::format("{}", fmt::join(p.get("cpu-events"), ",")); update_env(_data, "ROCPROFSYS_PAPI_EVENTS", _events); }); @@ -1117,7 +1117,8 @@ add_core_arguments(parser_t& _parser, parser_data& _data) .min_count(1) .dtype("[EVENT ...]") .action([&](parser_t& p) { - auto _events = join(array_config_t{ "," }, p.get("gpu-events")); + auto _events = + fmt::format("{}", fmt::join(p.get("gpu-events"), ",")); update_env(_data, "ROCPROFSYS_ROCM_EVENTS", _events); }); @@ -1196,10 +1197,9 @@ add_group_arguments(parser_t& _parser, const std::string& _group_name, parser_da if(_arg) { _arg->action([&_data, itr, _name](parser_t& p) { - using namespace timemory::join; - auto _value = join(array_config{ " ", "", "" }, p.get(_name)); + auto _value = fmt::format("{}", fmt::join(p.get(_name), " ")); if(_value.empty()) _value = p.get(_name); - if(_value.empty()) _value = join("", std::boolalpha, p.get(_name)); + if(_value.empty()) _value = fmt::format("{}", p.get(_name)); if(_value.empty()) throw exception("Error! no value for " + _name); update_env(_data, itr->get_env_name(), _value); @@ -1210,9 +1210,8 @@ add_group_arguments(parser_t& _parser, const std::string& _group_name, parser_da LOG_WARNING("Option {} ({}) is not enabled", _name, itr->get_env_name()); _parser.add_argument({ _opt_name }, itr->get_description()) .action([&](parser_t& p) { - using namespace timemory::join; auto _value = - join(array_config{ " ", "", "" }, p.get(_name)); + fmt::format("{}", fmt::join(p.get(_name), " ")); if(_value.empty()) throw exception("Error! no value for " + _name); diff --git a/projects/rocprofiler-systems/source/lib/core/categories.hpp b/projects/rocprofiler-systems/source/lib/core/categories.hpp index 05ad8906d5..8366930374 100644 --- a/projects/rocprofiler-systems/source/lib/core/categories.hpp +++ b/projects/rocprofiler-systems/source/lib/core/categories.hpp @@ -22,7 +22,6 @@ #pragma once -#include "common/join.hpp" #include "defines.hpp" #include "rocprofiler-systems/categories.h" // in rocprof-sys-user diff --git a/projects/rocprofiler-systems/source/lib/core/common.hpp b/projects/rocprofiler-systems/source/lib/core/common.hpp index 9759328bc1..c0828a82c5 100644 --- a/projects/rocprofiler-systems/source/lib/core/common.hpp +++ b/projects/rocprofiler-systems/source/lib/core/common.hpp @@ -22,7 +22,6 @@ #pragma once -#include "common/join.hpp" #include "core/categories.hpp" #include "core/concepts.hpp" #include "core/defines.hpp" @@ -125,8 +124,3 @@ struct construct_on_thread int64_t index = threading::get_id(); }; } // namespace rocprofsys - -// same sort of functionality as python's " ".join([...]) -#if !defined(JOIN) -# define JOIN(...) ::rocprofsys::common::join(__VA_ARGS__) -#endif diff --git a/projects/rocprofiler-systems/source/lib/core/config.cpp b/projects/rocprofiler-systems/source/lib/core/config.cpp index 87ae1dfa51..cc61c57cc0 100644 --- a/projects/rocprofiler-systems/source/lib/core/config.cpp +++ b/projects/rocprofiler-systems/source/lib/core/config.cpp @@ -51,12 +51,13 @@ #include #include #include -#include #include #include #include "logger/debug.hpp" +#include + #include #include #include @@ -432,7 +433,7 @@ configure_settings(bool _init) for(const auto& itr : constraint::get_valid_clock_ids()) { _clock_choices.emplace_back( - join("", "(", join('|', itr.name, itr.value, itr.raw_name), ")")); + fmt::format("({}|{}|{})", itr.name, itr.value, itr.raw_name)); } ROCPROFSYS_CONFIG_SETTING(std::string, "ROCPROFSYS_TRACE_PERIODS", @@ -1558,8 +1559,6 @@ print_banner(std::ostream& _os) std::stringstream _version_info{}; _version_info << "rocprof-sys v" << ROCPROFSYS_VERSION_STRING; - namespace join = ::timemory::join; - // assemble the list of properties auto _generate_properties = [](std::initializer_list>&& _data) { @@ -1570,7 +1569,7 @@ print_banner(std::ostream& _os) if(!itr.second.empty()) _property_info.emplace_back( itr.first.empty() ? itr.second - : join::join(": ", itr.first, itr.second)); + : fmt::format("{}: {}", itr.first, itr.second)); } return _property_info; }; @@ -1584,7 +1583,7 @@ print_banner(std::ostream& _os) // () if(!_properties.empty()) - _version_info << join::join(join::array_config{ ", ", " (", ")" }, _properties); + _version_info << fmt::format(" ({})", fmt::join(_properties, ", ")); _os << _banner << "\n"; _os << _version_info.str() << "\n"; @@ -2216,8 +2215,8 @@ get_perfetto_output_filename() if(!_val.empty() && _val.at(0) != '/') { - auto _result = - settings::format(JOIN('/', "%env{PWD}%", _val), get_config()->get_tag()); + auto _result = settings::format(fmt::format("{}/{}", getenv("PWD"), _val), + get_config()->get_tag()); LOG_DEBUG("Path is relative, prepending PWD: '{}'", _result); return _result; } @@ -2472,7 +2471,8 @@ get_database_absolute_path(std::string_view database_name, std::string_view suff setenv("ROCPROFSYS_DATABASE_DIR", _dir.c_str(), 1); if(!_val.empty() && _val.at(0) != '/') - return settings::format(JOIN('/', "%env{PWD}%", _val), get_config()->get_tag()); + return settings::format(fmt::format("{}/{}", getenv("PWD"), _val), + get_config()->get_tag()); return _val; } @@ -2530,8 +2530,8 @@ get_perfetto_output_filename_with_suffix(std::string_view suffix) if(!_val.empty() && _val.at(0) != '/') { - auto _result = - settings::format(JOIN('/', "%env{PWD}%", _val), get_config()->get_tag()); + auto _result = settings::format(fmt::format("{}/{}", getenv("PWD"), _val), + get_config()->get_tag()); LOG_DEBUG("Path is relative, prepending PWD: '{}'", _result); return _result; } @@ -2747,7 +2747,7 @@ get_tmp_file(std::string _basename, std::string _ext) _cfg.use_suffix = true; _cfg.suffix = "%pid%"; _cfg.explicit_path = get_tmpdir(); - _cfg.subdirectory = JOIN('/', settings::output_path(), "%ppid%", ""); + _cfg.subdirectory = fmt::format("{}/{}", settings::output_path(), "%ppid%"); auto _fname = settings::compose_output_filename(std::move(_basename), std::move(_ext), _cfg); @@ -2782,10 +2782,9 @@ get_causal_backend() } catch(std::runtime_error& _e) { auto _mode = static_cast&>(*_v->second).get(); - throw std::runtime_error(fmt::format( - "[{}] invalid causal backend {}. Choices: {}", __FUNCTION__, _mode, - timemory::join::join(timemory::join::array_config{ ", ", "", "" }, - _v->second->get_choices()))); + throw std::runtime_error( + fmt::format("[{}] invalid causal backend {}. Choices: {}", __FUNCTION__, + _mode, fmt::join(_v->second->get_choices(), ", "))); } return CausalBackend::Auto; } @@ -2813,10 +2812,9 @@ get_causal_mode() } catch(std::runtime_error& _e) { auto _mode = static_cast&>(*_v->second).get(); - throw std::runtime_error(fmt::format( - "[{}] invalid causal mode {}. Choices: {}", __FUNCTION__, _mode, - timemory::join::join(timemory::join::array_config{ ", ", "", "" }, - _v->second->get_choices()))); + throw std::runtime_error( + fmt::format("[{}] invalid causal mode {}. Choices: {}", __FUNCTION__, + _mode, fmt::join(_v->second->get_choices(), ", "))); } return CausalMode::Function; }(); @@ -2871,7 +2869,7 @@ format_causal_scopes(std::vector _value, const std::string& _tag) { itr = std::regex_replace( itr, _main_re, - join("", "$1", "(", get_exe_name(), "|", get_exe_realpath(), ")", "$3")); + fmt::format("$1({}|{})$3", get_exe_name(), get_exe_realpath())); } // trim leading and trailing spaces since we didn't delimit spaces if(std::regex_search(itr, _space_re)) diff --git a/projects/rocprofiler-systems/source/lib/core/constraint.cpp b/projects/rocprofiler-systems/source/lib/core/constraint.cpp index 1f8cd5eb2b..e2e153e347 100644 --- a/projects/rocprofiler-systems/source/lib/core/constraint.cpp +++ b/projects/rocprofiler-systems/source/lib/core/constraint.cpp @@ -30,6 +30,8 @@ #include "logger/debug.hpp" +#include + #include #include #include @@ -102,10 +104,13 @@ find_clock_identifier(const Tp& _v) } } - throw std::runtime_error( - fmt::format("Unknown clock id {}: {}. Valid choices: {}", _descript, - timemory::join::join("", _v).c_str(), - timemory::join::join("", accepted_clock_ids).c_str())); + auto _choices = std::vector{}; + _choices.reserve(accepted_clock_ids.size()); + for(const auto& itr : accepted_clock_ids) + _choices.emplace_back(itr.as_string()); + + throw std::runtime_error(fmt::format("Unknown clock id {}: {}. Valid choices: {}", + _descript, _v, fmt::join(_choices, ""))); } void diff --git a/projects/rocprofiler-systems/source/lib/core/dynamic_library.cpp b/projects/rocprofiler-systems/source/lib/core/dynamic_library.cpp index 29393b9ac7..bb9948ce14 100644 --- a/projects/rocprofiler-systems/source/lib/core/dynamic_library.cpp +++ b/projects/rocprofiler-systems/source/lib/core/dynamic_library.cpp @@ -66,11 +66,11 @@ find_library_path(const std::string& _name, const std::vector& _env for(auto& itr : _paths) { - auto _v = JOIN('/', itr, _name); + auto _v = fmt::format("{}/{}", itr, _name); if(filepath::exists(_v)) return _v; for(const auto& litr : _path_suffixes) { - _v = JOIN('/', itr, litr, _name); + _v = fmt::format("{}/{}/{}", itr, litr, _name); if(filepath::exists(_v)) return _v; } } diff --git a/projects/rocprofiler-systems/source/lib/core/mproc.cpp b/projects/rocprofiler-systems/source/lib/core/mproc.cpp index 9a7574c62b..8e53351b07 100644 --- a/projects/rocprofiler-systems/source/lib/core/mproc.cpp +++ b/projects/rocprofiler-systems/source/lib/core/mproc.cpp @@ -43,7 +43,7 @@ get_concurrent_processes(int _ppid) std::set _children = {}; if(_ppid > 0) { - auto _inp = JOIN('/', "/proc", _ppid, "task", _ppid, "children"); + auto _inp = fmt::format("/proc/{}/task/{}/children", _ppid, _ppid); std::ifstream _ifs{ _inp }; if(!_ifs) { diff --git a/projects/rocprofiler-systems/source/lib/core/perfetto.cpp b/projects/rocprofiler-systems/source/lib/core/perfetto.cpp index dd4ae1114a..8da0f32ce4 100644 --- a/projects/rocprofiler-systems/source/lib/core/perfetto.cpp +++ b/projects/rocprofiler-systems/source/lib/core/perfetto.cpp @@ -285,7 +285,7 @@ post_process(tim::manager* _timemory_manager, bool& _perfetto_output_error) if(!_script_dir.empty()) { - _script_path = rocprofsys::common::join("/", _script_dir, _script_path); + _script_path = fmt::format("{}/{}", _script_dir, _script_path); } // Test that the script exists diff --git a/projects/rocprofiler-systems/source/lib/core/rocprofiler-sdk.cpp b/projects/rocprofiler-systems/source/lib/core/rocprofiler-sdk.cpp index a0df719742..a2507e34df 100644 --- a/projects/rocprofiler-systems/source/lib/core/rocprofiler-sdk.cpp +++ b/projects/rocprofiler-systems/source/lib/core/rocprofiler-sdk.cpp @@ -27,6 +27,8 @@ #include "logger/debug.hpp" +#include + #if defined(ROCPROFSYS_USE_ROCM) && ROCPROFSYS_USE_ROCM > 0 # include @@ -281,11 +283,11 @@ config_settings(const std::shared_ptr& _config) if(_skip_domains.count(_v) > 0) return; - auto _op_option_name = JOIN('_', "ROCPROFSYS_ROCM", _domain_name, "OPERATIONS"); + auto _op_option_name = fmt::format("ROCPROFSYS_ROCM_{}_OPERATIONS", _domain_name); auto _eop_option_name = - JOIN('_', "ROCPROFSYS_ROCM", _domain_name, "OPERATIONS_EXCLUDE"); + fmt::format("ROCPROFSYS_ROCM_{}_OPERATIONS_EXCLUDE", _domain_name); auto _bt_option_name = - JOIN('_', "ROCPROFSYS_ROCM", _domain_name, "OPERATIONS_ANNOTATE_BACKTRACE"); + fmt::format("ROCPROFSYS_ROCM_{}_OPERATIONS_ANNOTATE_BACKTRACE", _domain_name); auto _op_choices = std::vector{}; for(auto itr : _domain.operations) @@ -343,10 +345,9 @@ config_settings(const std::shared_ptr& _config) std::sort(_domain_choices.begin(), _domain_choices.end()); - namespace join = ::timemory::join; auto _domain_description = - JOIN("", "Specification of ROCm domains to trace/profile. Choices: ", - join::join(join::array_config{ ", ", "", "" }, _domain_choices)); + fmt::format("Specification of ROCm domains to trace/profile. Choices: {}", + fmt::join(_domain_choices, ", ")); auto _domain_defaults = std::string{ "hip_runtime_api,marker_api,kernel_dispatch," "memory_copy,scratch_memory" }; diff --git a/projects/rocprofiler-systems/source/lib/core/trace_cache/perfetto_processor.cpp b/projects/rocprofiler-systems/source/lib/core/trace_cache/perfetto_processor.cpp index 6303824aa8..6394ed1484 100644 --- a/projects/rocprofiler-systems/source/lib/core/trace_cache/perfetto_processor.cpp +++ b/projects/rocprofiler-systems/source/lib/core/trace_cache/perfetto_processor.cpp @@ -123,7 +123,7 @@ setup_amd_smi_tracks(const uint32_t _device_id, bool is_busy_enabled, if(amd_smi_gfx_track::exists(_device_id)) return; auto make_track_name = [&](const char* metric) { - return JOIN(" ", "GPU", JOIN("", '[', _device_id, ']'), metric, "(S)"); + return fmt::format("GPU [{}] {} (S)", _device_id, metric); }; if(is_busy_enabled) @@ -328,7 +328,7 @@ perfetto_processor_t::start_session() int temp_fd = -1; if(config::get_use_tmp_files()) { - auto _base = JOIN("-", "cached-perfetto-trace", std::to_string(m_process_id)); + auto _base = fmt::format("cached-perfetto-trace-{}", m_process_id); m_tmp_file = config::get_tmp_file(_base, "proto"); m_tmp_file->open(O_RDWR | O_CREAT | O_TRUNC, 0600); temp_fd = m_tmp_file->fd; @@ -484,7 +484,8 @@ perfetto_processor_t::handle([[maybe_unused]] const kernel_dispatch_sample& _kds { #if ROCPROFSYS_USE_ROCM > 0 static auto _track_desc = [](uint64_t _device_id_v, uint64_t _queue_id_v) { - return JOIN("", "GPU Kernel Dispatch [", _device_id_v, "] Queue ", _queue_id_v); + return fmt::format("GPU Kernel Dispatch [{}] Queue {}", _device_id_v, + _queue_id_v); }; auto kernel_symbol = m_metadata.get_kernel_symbol(_kds.kernel_id); @@ -511,24 +512,20 @@ perfetto_processor_t::handle([[maybe_unused]] const kernel_dispatch_sample& _kds if(!m_use_annotations) return; annotate_perfetto( - ctx, - { { "begin_ns", _beg_ts }, - { "end_ns", _end_ts }, - { "corr_id", _corr_id }, - { "stream_id", _stream_handle }, - { "queue", _queue_id_handle }, - { "dispatch_id", _kds.dispatch_id }, - { "kernel_id", _kds.kernel_id }, - { "private_segment_size", _kds.private_segment_size }, - { "group_segment_size", _kds.group_segment_size }, - { "workgroup_size", JOIN("", "(", - JOIN(',', _kds.workgroup_size_x, - _kds.workgroup_size_y, _kds.workgroup_size_z), - ")") }, - { "grid_size", - JOIN("", "(", - JOIN(',', _kds.grid_size_x, _kds.grid_size_y, _kds.grid_size_z), - ")") } }); + ctx, { { "begin_ns", _beg_ts }, + { "end_ns", _end_ts }, + { "corr_id", _corr_id }, + { "stream_id", _stream_handle }, + { "queue", _queue_id_handle }, + { "dispatch_id", _kds.dispatch_id }, + { "kernel_id", _kds.kernel_id }, + { "private_segment_size", _kds.private_segment_size }, + { "group_segment_size", _kds.group_segment_size }, + { "workgroup_size", + fmt::format("({},{},{})", _kds.workgroup_size_x, + _kds.workgroup_size_y, _kds.workgroup_size_z) }, + { "grid_size", fmt::format("({},{},{})", _kds.grid_size_x, + _kds.grid_size_y, _kds.grid_size_z) } }); }; tracing::push_perfetto(category::rocm_kernel_dispatch{}, kernel_name.c_str(), _track, @@ -566,8 +563,8 @@ perfetto_processor_t::handle([[maybe_unused]] const scratch_memory_sample& _sms) if(!counter_track::exists(_agent_device_id)) { - auto _track_desc_alloc_size = JOIN("", "GPU Scratch Memory [", _agent_device_id, - "] Thread ", _thread_id_sequent); + auto _track_desc_alloc_size = fmt::format("GPU Scratch Memory [{}] Thread {}", + _agent_device_id, _thread_id_sequent); counter_track::emplace(_agent_device_id, _track_desc_alloc_size, "bytes"); } @@ -579,7 +576,7 @@ perfetto_processor_t::handle([[maybe_unused]] const scratch_memory_sample& _sms) # endif auto _track_desc_events = [&]() { - return JOIN("", "GPU Scratch Memory Events Thread ", _thread_id_sequent); + return fmt::format("GPU Scratch Memory Events Thread {}", _thread_id_sequent); }; const auto _track = @@ -626,8 +623,8 @@ perfetto_processor_t::handle([[maybe_unused]] const memory_copy_sample& _mcs) auto _track_desc = [](int32_t _device_id_v, rocprofiler_thread_id_t _tid) { const auto& _tid_v = thread_info::get(_tid, SystemTID); - return JOIN("", "GPU Memory Copy to Agent [", _device_id_v, "] Thread ", - _tid_v->index_data->sequent_value); + return fmt::format("GPU Memory Copy to Agent [{}] Thread {}", _device_id_v, + _tid_v->index_data->sequent_value); }; const auto _track = tracing::get_perfetto_track( @@ -688,8 +685,8 @@ perfetto_processor_t::handle([[maybe_unused]] const memory_allocate_sample& _mas auto _track_desc = [](int32_t _device_id_v, rocprofiler_thread_id_t _tid) { const auto& _tid_v = thread_info::get(_tid, SystemTID); - return JOIN("", "GPU Memory Allocation to Agent [", _device_id_v, "] Thread ", - _tid_v->index_data->sequent_value); + return fmt::format("GPU Memory Allocation to Agent [{}] Thread {}", + _device_id_v, _tid_v->index_data->sequent_value); }; auto _agent_logical_node_id = @@ -1095,16 +1092,14 @@ perfetto_processor_t::handle([[maybe_unused]] const amd_smi_sample& _amd_smi) if(_idx.has_value()) { // Per-XCP format - track_name = JOIN( - " ", "GPU", JOIN("", '[', _device_id, ']'), metric_name, - JOIN("", "XCP_", _idx.value(), ": [", (i < 10 ? "0" : ""), i, ']'), - "(S)"); + track_name = fmt::format("GPU [{}] {} XCP_{}: [{:02}] (S)", _device_id, + metric_name, _idx.value(), i); } else { // Device-level format - track_name = JOIN(" ", "GPU", JOIN("", '[', _device_id, ']'), metric_name, - JOIN("", "[", (i < 10 ? "0" : ""), i, ']'), "(S)"); + track_name = + fmt::format("GPU [{}] {} [{:02}] (S)", _device_id, metric_name, i); } auto generate_track_key = [](uint32_t _dev_idx, size_t _xcp_idx, @@ -1149,9 +1144,8 @@ perfetto_processor_t::handle([[maybe_unused]] const amd_smi_sample& _amd_smi) const auto value = data[i]; if(value == std::numeric_limits::max()) continue; - std::string track_name = - JOIN(" ", "GPU", JOIN("", '[', _device_id, ']'), - trait::name::value, JOIN("", "[", i, ']'), "(S)"); + std::string track_name = fmt::format("GPU [{}] {} [{:02}] (S)", _device_id, + trait::name::value, i); auto unique_key = (_device_id << 8) | i; @@ -1213,7 +1207,7 @@ perfetto_processor_t::handle([[maybe_unused]] const amd_smi_sample& _amd_smi) if(is_xgmi_enabled) { auto make_track_name = [&](const char* metric) { - return JOIN(" ", "GPU", JOIN("", '[', _device_id, ']'), metric, "(S)"); + return fmt::format("GPU [{}] {} (S)", _device_id, metric); }; if(!amd_smi_xgmi_link_width_track::exists(_device_id)) @@ -1245,7 +1239,7 @@ perfetto_processor_t::handle([[maybe_unused]] const amd_smi_sample& _amd_smi) if(is_pcie_enabled) { auto make_track_name = [&](const char* metric) { - return JOIN(" ", "GPU", JOIN("", '[', _device_id, ']'), metric, "(S)"); + return fmt::format("GPU [{}] {} (S)", _device_id, metric); }; if(!amd_smi_pcie_link_width_track::exists(_device_id)) diff --git a/projects/rocprofiler-systems/source/lib/core/trace_cache/rocpd_processor.cpp b/projects/rocprofiler-systems/source/lib/core/trace_cache/rocpd_processor.cpp index cded11c3a8..3d6b469b91 100644 --- a/projects/rocprofiler-systems/source/lib/core/trace_cache/rocpd_processor.cpp +++ b/projects/rocprofiler-systems/source/lib/core/trace_cache/rocpd_processor.cpp @@ -171,7 +171,7 @@ rocpd_processor_t::handle([[maybe_unused]] const scratch_memory_sample& _sms) auto [memory_operation, memory_type] = parse_memory_operation_name(_name); - auto extdata_json_str = JOIN("", "{\"flags\": ", _sms.flags, "}"); + auto extdata_json_str = fmt::format("{{\"flags\": {}}}", _sms.flags); m_data_processor->insert_memory_alloc( n_info.id, process.pid, thread_primary_key, agent_primary_key, diff --git a/projects/rocprofiler-systems/source/lib/core/utility.hpp b/projects/rocprofiler-systems/source/lib/core/utility.hpp index 4fd05a1be6..8bd42adb09 100644 --- a/projects/rocprofiler-systems/source/lib/core/utility.hpp +++ b/projects/rocprofiler-systems/source/lib/core/utility.hpp @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -216,8 +215,13 @@ get_regex_or(const ContainerT& _container, const std::string& _fal if(_container.empty()) return _fallback; - namespace join = timemory::join; - return join::join(join::array_config{ "|", "(", ")" }, _container); + auto _ss = std::stringstream{}; + auto _idx = size_t{ 0 }; + _ss << "("; + for(const auto& itr : _container) + _ss << (_idx++ > 0 ? "|" : "") << itr; + _ss << ")"; + return _ss.str(); } template