From 76d2b4c2adee3bad56f8fe1bf45d13f7aa9c2f75 Mon Sep 17 00:00:00 2001 From: "Jonathan R. Madsen" Date: Wed, 3 Aug 2022 12:13:00 -0500 Subject: [PATCH] Advanced category for configuration options (#125) Adds advanced category - advanced category hides less relevant configuration options - omnitrace-avail has new '--advanced' option which shows these flags - increase verbosity level to print issue with reading ppid children - OMNITRACE_ROCTRACER_HSA_ACTIVITY defaults to ON - OMNITRACE_ROCTRACER_HSA_API defaults to ON [ROCm/rocprofiler-systems commit: afa3df8523b995a0a213d6425debe6b7396b5c38] --- .../source/bin/omnitrace-avail/avail.cpp | 13 +- .../source/bin/omnitrace-avail/common.cpp | 1 + .../source/bin/omnitrace-avail/common.hpp | 1 + .../source/bin/tests/CMakeLists.txt | 3 +- .../source/lib/omnitrace/library/config.cpp | 141 +++++++++++++----- .../source/lib/omnitrace/library/mproc.cpp | 2 +- 6 files changed, 119 insertions(+), 42 deletions(-) diff --git a/projects/rocprofiler-systems/source/bin/omnitrace-avail/avail.cpp b/projects/rocprofiler-systems/source/bin/omnitrace-avail/avail.cpp index 0f3706a7ca..1c53788efd 100644 --- a/projects/rocprofiler-systems/source/bin/omnitrace-avail/avail.cpp +++ b/projects/rocprofiler-systems/source/bin/omnitrace-avail/avail.cpp @@ -181,6 +181,11 @@ main(int argc, char** argv) .action([](parser_t& p) { verbose_level = (p.get_count("verbose") == 0) ? 1 : p.get("verbose"); }); + parser + .add_argument({ "--advanced" }, + "Print advanced settings not relevant to most use cases") + .max_count(1) + .action([](parser_t& p) { print_advanced = p.get("advanced"); }); parser.add_argument({ "-a", "--all" }, "Print all available info") .max_count(1) .action([&](parser_t& p) { @@ -489,6 +494,10 @@ main(int argc, char** argv) category_regex_keys.emplace_back(_pos_regex); } + if(category_view.count("advanced") > 0 || + category_view.count("settings::advanced") > 0) + print_advanced = true; + if(category_view.empty()) category_view = _category_options; if(!include_components && !include_settings && !include_hw_counters) @@ -786,14 +795,14 @@ write_settings_info(std::ostream& os, const array_t& opts, { str_set_t _categories{}; for(const auto& citr : sitr->second->get_categories()) - { _categories.emplace(TIMEMORY_JOIN("::", "settings", citr)); - } bool _found = false; for(const auto& citr : _categories) { if(category_view.count(citr) > 0) _found = true; } + if(!print_advanced && _categories.count("settings::advanced") > 0) + _not_in_category_view.emplace(_name); if(!_found) { _not_in_category_view.emplace(_name); diff --git a/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.cpp b/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.cpp index e61df01b7a..45b343113e 100644 --- a/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.cpp +++ b/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.cpp @@ -42,6 +42,7 @@ bool case_insensitive = false; bool regex_hl = false; bool expand_keys = false; bool force_config = false; +bool print_advanced = false; int32_t max_width = 0; int32_t num_cols = 0; int32_t min_width = 40; diff --git a/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.hpp b/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.hpp index ca31b28d53..ab57cad95f 100644 --- a/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.hpp +++ b/projects/rocprofiler-systems/source/bin/omnitrace-avail/common.hpp @@ -95,6 +95,7 @@ extern bool case_insensitive; extern bool regex_hl; extern bool expand_keys; extern bool force_config; +extern bool print_advanced; extern int32_t max_width; extern int32_t num_cols; extern int32_t min_width; diff --git a/projects/rocprofiler-systems/source/bin/tests/CMakeLists.txt b/projects/rocprofiler-systems/source/bin/tests/CMakeLists.txt index 33f65e41d9..5ec702c93f 100644 --- a/projects/rocprofiler-systems/source/bin/tests/CMakeLists.txt +++ b/projects/rocprofiler-systems/source/bin/tests/CMakeLists.txt @@ -242,7 +242,7 @@ omnitrace_add_bin_test( omnitrace_add_bin_test( NAME omnitrace-avail-category-filter-timemory TARGET omnitrace-avail - ARGS --categories settings::timemory --brief + ARGS --categories settings::timemory --brief --advanced LABELS "omnitrace-avail" TIMEOUT 45 PASS_REGEX @@ -262,6 +262,7 @@ omnitrace_add_bin_test( ~PROCESS_SAMPLING --csv --brief + --advanced LABELS "omnitrace-avail" TIMEOUT 45 PASS_REGEX "ENVIRONMENT VARIABLE,[ \n]+OMNITRACE_USE_PID,[ \n]+" diff --git a/projects/rocprofiler-systems/source/lib/omnitrace/library/config.cpp b/projects/rocprofiler-systems/source/lib/omnitrace/library/config.cpp index 7d82292f7d..1bc193fabb 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace/library/config.cpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace/library/config.cpp @@ -213,16 +213,16 @@ configure_settings(bool _init) std::string, "OMNITRACE_MODE", "Data collection mode. Used to set default values for OMNITRACE_USE_* options. " "Typically set by omnitrace binary instrumenter.", - std::string{ "trace" }, "backend"); + std::string{ "trace" }, "backend", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_CI", "Enable some runtime validation checks (typically enabled " "for continuous integration)", - false, "debugging"); + false, "debugging", "advanced"); OMNITRACE_CONFIG_EXT_SETTING(int, "OMNITRACE_DL_VERBOSE", "Verbosity within the omnitrace-dl library", 0, - "debugging", "libomnitrace-dl"); + "debugging", "libomnitrace-dl", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_USE_PERFETTO", "Enable perfetto backend", _default_perfetto_v, "backend", "perfetto"); @@ -256,7 +256,7 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_USE_THREAD_SAMPLING", "[DEPRECATED] Renamed to OMNITRACE_USE_PROCESS_SAMPLING", true, "backend", "sampling", "process_sampling", - "deprecated"); + "deprecated", "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_USE_PROCESS_SAMPLING", @@ -280,7 +280,7 @@ configure_settings(bool _init) OMNITRACE_CONFIG_CL_SETTING( bool, "OMNITRACE_KOKKOS_KERNEL_LOGGER", "Enables kernel logging", false, - "--omnitrace-kokkos-kernel-logger", "kokkos", "debugging"); + "--omnitrace-kokkos-kernel-logger", "kokkos", "debugging", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_USE_OMPT", "Enable support for OpenMP-Tools", false, "openmp", "ompt", @@ -288,12 +288,12 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_USE_CODE_COVERAGE", "Enable support for code coverage", false, "coverage", - "backend"); + "backend", "advanced"); OMNITRACE_CONFIG_SETTING(size_t, "OMNITRACE_INSTRUMENTATION_INTERVAL", "Instrumentation only takes measurements once every N " "function calls (not statistical)", - size_t{ 1 }, "instrumentation", "data_sampling"); + size_t{ 1 }, "instrumentation", "data_sampling", "advanced"); OMNITRACE_CONFIG_SETTING( double, "OMNITRACE_SAMPLING_FREQ", @@ -322,7 +322,7 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_ROCM_SMI_DEVICES", "[DEPRECATED] Renamed to OMNITRACE_SAMPLING_GPUS", std::string{ "all" }, "rocm_smi", "rocm", "process_sampling", - "deprecated"); + "deprecated", "advanced"); OMNITRACE_CONFIG_SETTING( std::string, "OMNITRACE_SAMPLING_GPUS", @@ -351,12 +351,12 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_TRACE_THREAD_LOCKS", "Enable tracing calls to pthread_mutex_lock, " "pthread_mutex_unlock, pthread_mutex_trylock", - false, "backend", "parallelism", "gotcha"); + false, "backend", "parallelism", "gotcha", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_TRACE_THREAD_RW_LOCKS", "Enable tracing calls to pthread_rwlock_* functions. May " "cause deadlocks with ROCm-enabled OpenMPI.", - false, "backend", "parallelism", "gotcha"); + false, "backend", "parallelism", "gotcha", "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_SAMPLING_KEEP_INTERNAL", @@ -364,21 +364,21 @@ configure_settings(bool _init) "from internal routines in omnitrace. E.g. when ON, the call-stack will show " "functions like omnitrace_push_trace. If disabled, omnitrace will attempt to " "filter out internal routines from the sampling call-stacks", - true, "sampling", "data"); + true, "sampling", "data", "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_SAMPLING_REALTIME", "Enable sampling frequency via a wall-clock timer on child threads. This may " "result in typically idle child threads consuming an unnecessary large amount of " "CPU time. The main thread always has this enabled.", - false, "sampling"); + false, "sampling", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_SAMPLING_CPUTIME", "Enable sampling frequency via a timer that measures both " "CPU time used by the current process, " "and CPU time expended on behalf of the process by the " "system. This is recommended.", - true, "timemory", "sampling"); + true, "timemory", "sampling", "advanced"); auto _sigrt_range = SIGRTMAX - SIGRTMIN; @@ -388,38 +388,42 @@ configure_settings(bool _init) "Modify this value only if the target process is also using SIGRTMIN. E.g. " "the signal used is SIGRTMIN + . Value must be <= " } + std::to_string(_sigrt_range), - 0, "sampling"); + 0, "sampling", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_FLAT_SAMPLING", "Ignore hierarchy in all statistical sampling entries", _config->get_flat_profile(), "timemory", "sampling", - "data_layout"); + "data_layout", "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_TIMELINE_SAMPLING", "Create unique entries for every sample when statistical sampling is enabled", - _config->get_timeline_profile(), "timemory", "sampling", "data_layout"); + _config->get_timeline_profile(), "timemory", "sampling", "data_layout", + "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_ROCTRACER_FLAT_PROFILE", "Ignore hierarchy in all kernels entries with timemory backend", - _config->get_flat_profile(), "timemory", "roctracer", "data_layout", "rocm"); + _config->get_flat_profile(), "timemory", "roctracer", "data_layout", "rocm", + "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_ROCTRACER_TIMELINE_PROFILE", "Create unique entries for every kernel with timemory backend", - _config->get_timeline_profile(), "timemory", "roctracer", "data_layout", "rocm"); + _config->get_timeline_profile(), "timemory", "roctracer", "data_layout", "rocm", + "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_ROCTRACER_HSA_ACTIVITY", - "Enable HSA activity tracing support", false, "roctracer", - "rocm"); + "Enable HSA activity tracing support", true, "roctracer", + "rocm", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_ROCTRACER_HSA_API", - "Enable HSA API tracing support", false, "roctracer", - "rocm"); + "Enable HSA API tracing support", true, "roctracer", "rocm", + "advanced"); OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_ROCTRACER_HSA_API_TYPES", - "HSA API type to collect", "", "roctracer", "rocm"); + "HSA API type to collect", "", "roctracer", "rocm", + "advanced"); OMNITRACE_CONFIG_SETTING( std::string, "OMNITRACE_ROCM_EVENTS", @@ -430,26 +434,26 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_CRITICAL_TRACE_DEBUG", "Enable debugging for critical trace", _omnitrace_debug, - "debugging", "critical_trace"); + "debugging", "critical_trace", "advanced"); OMNITRACE_CONFIG_SETTING( bool, "OMNITRACE_CRITICAL_TRACE_SERIALIZE_NAMES", "Include names in serialization of critical trace (mainly for debugging)", - _omnitrace_debug, "debugging", "critical_trace"); + _omnitrace_debug, "debugging", "critical_trace", "advanced"); OMNITRACE_CONFIG_SETTING(size_t, "OMNITRACE_PERFETTO_SHMEM_SIZE_HINT_KB", "Hint for shared-memory buffer size in perfetto (in KB)", - size_t{ 4096 }, "perfetto", "data"); + size_t{ 4096 }, "perfetto", "data", "advanced"); OMNITRACE_CONFIG_SETTING(size_t, "OMNITRACE_PERFETTO_BUFFER_SIZE_KB", "Size of perfetto buffer (in KB)", size_t{ 1024000 }, - "perfetto", "data"); + "perfetto", "data", "advanced"); OMNITRACE_CONFIG_SETTING(bool, "OMNITRACE_PERFETTO_COMBINE_TRACES", "Combine Perfetto traces. If not explicitly set, it will " "default to the value of OMNITRACE_COLLAPSE_PROCESSES", - _config->get("collapse_processes"), "perfetto", - "data"); + _config->get("collapse_processes"), "perfetto", "data", + "advanced"); OMNITRACE_CONFIG_SETTING( std::string, "OMNITRACE_PERFETTO_FILL_POLICY", @@ -460,29 +464,30 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_PERFETTO_CATEGORIES", "Categories to collect within perfetto", "", "perfetto", - "data") + "data", "advanced") ->set_choices(get_available_perfetto_categories>()); OMNITRACE_CONFIG_EXT_SETTING(int64_t, "OMNITRACE_CRITICAL_TRACE_COUNT", "Number of critical trace to export (0 == all)", int64_t{ 0 }, "data", "critical_trace", - "omnitrace-critical-trace", "perfetto"); + "omnitrace-critical-trace", "perfetto", "advanced"); OMNITRACE_CONFIG_SETTING(uint64_t, "OMNITRACE_CRITICAL_TRACE_BUFFER_COUNT", "Number of critical trace records to store in thread-local " "memory before submitting to shared buffer", - uint64_t{ 2000 }, "data", "critical_trace"); + uint64_t{ 2000 }, "data", "critical_trace", "advanced"); OMNITRACE_CONFIG_SETTING( uint64_t, "OMNITRACE_CRITICAL_TRACE_NUM_THREADS", "Number of threads to use when generating the critical trace", std::min(8, std::thread::hardware_concurrency()), "parallelism", - "critical_trace"); + "critical_trace", "advanced"); OMNITRACE_CONFIG_EXT_SETTING( int64_t, "OMNITRACE_CRITICAL_TRACE_PER_ROW", "How many critical traces per row in perfetto (0 == all in one row)", - int64_t{ 0 }, "io", "critical_trace", "omnitrace-critical-trace", "perfetto"); + int64_t{ 0 }, "io", "critical_trace", "omnitrace-critical-trace", "perfetto", + "advanced"); OMNITRACE_CONFIG_SETTING( std::string, "OMNITRACE_TIMEMORY_COMPONENTS", @@ -491,11 +496,11 @@ configure_settings(bool _init) OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_OUTPUT_FILE", "[DEPRECATED] See OMNITRACE_PERFETTO_FILE", std::string{}, - "perfetto", "io", "filename", "deprecated"); + "perfetto", "io", "filename", "deprecated", "advanced"); OMNITRACE_CONFIG_SETTING(std::string, "OMNITRACE_PERFETTO_FILE", "Perfetto filename", std::string{ "perfetto-trace.proto" }, "perfetto", "io", - "filename"); + "filename", "advanced"); // set the defaults _config->get_flamegraph_output() = false; @@ -533,6 +538,63 @@ configure_settings(bool _init) _add_omnitrace_category(_config->find("OMNITRACE_OUTPUT_PREFIX")); _add_omnitrace_category(_config->find("OMNITRACE_OUTPUT_PATH")); + auto _add_advanced_category = [](const std::string& _name) { + auto itr = _config->find(_name); + if(itr != _config->end()) + { + auto _categories = itr->second->get_categories(); + _categories.emplace("advanced"); + itr->second->set_categories(_categories); + } + else + { + if(_config->get("OMNITRACE_CI")) + { + OMNITRACE_THROW("Error! Setting '%s' not found!", _name.c_str()); + } + } + }; + + _add_advanced_category("OMNITRACE_CPU_AFFINITY"); + _add_advanced_category("OMNITRACE_COUT_OUTPUT"); + _add_advanced_category("OMNITRACE_FILE_OUTPUT"); + _add_advanced_category("OMNITRACE_JSON_OUTPUT"); + _add_advanced_category("OMNITRACE_TREE_OUTPUT"); + _add_advanced_category("OMNITRACE_TEXT_OUTPUT"); + _add_advanced_category("OMNITRACE_DIFF_OUTPUT"); + _add_advanced_category("OMNITRACE_DEBUG"); + _add_advanced_category("OMNITRACE_ENABLE_SIGNAL_HANDLER"); + _add_advanced_category("OMNITRACE_FLAT_PROFILE"); + _add_advanced_category("OMNITRACE_INPUT_EXTENSIONS"); + _add_advanced_category("OMNITRACE_INPUT_PATH"); + _add_advanced_category("OMNITRACE_INPUT_PREFIX"); + _add_advanced_category("OMNITRACE_MAX_DEPTH"); + _add_advanced_category("OMNITRACE_MAX_WIDTH"); + _add_advanced_category("OMNITRACE_MEMORY_PRECISION"); + _add_advanced_category("OMNITRACE_MEMORY_SCIENTIFIC"); + _add_advanced_category("OMNITRACE_MEMORY_UNITS"); + _add_advanced_category("OMNITRACE_MEMORY_WIDTH"); + _add_advanced_category("OMNITRACE_NETWORK_INTERFACE"); + _add_advanced_category("OMNITRACE_NODE_COUNT"); + _add_advanced_category("OMNITRACE_PAPI_FAIL_ON_ERROR"); + _add_advanced_category("OMNITRACE_PAPI_OVERFLOW"); + _add_advanced_category("OMNITRACE_PAPI_MULTIPLEXING"); + _add_advanced_category("OMNITRACE_PAPI_QUIET"); + _add_advanced_category("OMNITRACE_PAPI_THREADING"); + _add_advanced_category("OMNITRACE_PRECISION"); + _add_advanced_category("OMNITRACE_SCIENTIFIC"); + _add_advanced_category("OMNITRACE_STRICT_CONFIG"); + _add_advanced_category("OMNITRACE_TIMELINE_PROFILE"); + _add_advanced_category("OMNITRACE_SCIENTIFIC"); + _add_advanced_category("OMNITRACE_TIME_FORMAT"); + _add_advanced_category("OMNITRACE_TIMING_PRECISION"); + _add_advanced_category("OMNITRACE_TIMING_SCIENTIFIC"); + _add_advanced_category("OMNITRACE_TIMING_UNITS"); + _add_advanced_category("OMNITRACE_TIMING_WIDTH"); + _add_advanced_category("OMNITRACE_WIDTH"); + _add_advanced_category("OMNITRACE_COLLAPSE_THREADS"); + _add_advanced_category("OMNITRACE_COLLAPSE_PROCESSES"); + #if defined(TIMEMORY_USE_PAPI) int _paranoid = 2; { @@ -611,8 +673,11 @@ configure_settings(bool _init) getline(_in, _s); _iss << _s << "\n"; } - OMNITRACE_BASIC_PRINT("config file '%s':\n%s\n", itr.c_str(), - _iss.str().c_str()); + if(!_iss.str().empty()) + { + OMNITRACE_BASIC_PRINT("config file '%s':\n%s\n", itr.c_str(), + _iss.str().c_str()); + } } } diff --git a/projects/rocprofiler-systems/source/lib/omnitrace/library/mproc.cpp b/projects/rocprofiler-systems/source/lib/omnitrace/library/mproc.cpp index 7e4362a6db..83af7f1ae9 100644 --- a/projects/rocprofiler-systems/source/lib/omnitrace/library/mproc.cpp +++ b/projects/rocprofiler-systems/source/lib/omnitrace/library/mproc.cpp @@ -44,7 +44,7 @@ get_concurrent_processes(int _ppid) std::ifstream _ifs{ _inp }; if(!_ifs) { - OMNITRACE_VERBOSE_F(0, "Warning! File '%s' cannot be read\n", _inp.c_str()); + OMNITRACE_VERBOSE_F(2, "Warning! File '%s' cannot be read\n", _inp.c_str()); return _children; }