From 6973eb4d8af47f5894fc14b0273a4f08e1146839 Mon Sep 17 00:00:00 2001 From: Giovanni LB Date: Mon, 10 Jul 2023 18:37:56 -0300 Subject: [PATCH] SWDEV-410293: ATT API rework Change-Id: I379e8cfd5abb182eaf56d18c2b1a5dac3e44e6e8 [ROCm/rocprofiler commit: c94d4c3e814d2f915d748d00164a5640d146614e] --- .../include/rocprofiler/v2/rocprofiler.h | 29 +++++----- projects/rocprofiler/plugin/att/att.py | 16 ++++-- projects/rocprofiler/plugin/att/drawing.py | 11 +++- projects/rocprofiler/src/tools/tool.cpp | 56 +++++++------------ .../featuretests/profiler/profiler_gtest.cpp | 6 +- 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/projects/rocprofiler/include/rocprofiler/v2/rocprofiler.h b/projects/rocprofiler/include/rocprofiler/v2/rocprofiler.h index bddabf2772..4fc5d2e4b2 100644 --- a/projects/rocprofiler/include/rocprofiler/v2/rocprofiler.h +++ b/projects/rocprofiler/include/rocprofiler/v2/rocprofiler.h @@ -1707,19 +1707,22 @@ typedef const char* rocprofiler_hsa_function_name_t; * ATT parameters to be used by for collection */ typedef enum { - ROCPROFILER_ATT_COMPUTE_UNIT_TARGET = 0, - ROCPROFILER_ATT_VM_ID_MASK = 1, - ROCPROFILER_ATT_MASK = 2, - ROCPROFILER_ATT_TOKEN_MASK = 3, - ROCPROFILER_ATT_TOKEN_MASK2 = 4, - ROCPROFILER_ATT_SE_MASK = 5, - ROCPROFILER_ATT_SAMPLE_RATE = 6, - ROCPROFILER_ATT_BUFFER_SIZE = 7, //! ATT collection max data size. - ROCPROFILER_ATT_PERF_MASK = 240, - ROCPROFILER_ATT_PERF_CTRL = 241, - ROCPROFILER_ATT_PERFCOUNTER = 242, - ROCPROFILER_ATT_PERFCOUNTER_NAME = 243, - ROCPROFILER_ATT_MAXVALUE + ROCPROFILER_ATT_COMPUTE_UNIT = 0, //! Select the target compute unit (wgp) for profiling. + ROCPROFILER_ATT_VMID_MASK = 1, //! VMID Mask. + ROCPROFILER_ATT_SE_MASK = 5, //! Shader engine mask for selection. + ROCPROFILER_ATT_SIMD_SELECT = 8, //! Set SIMD Mask (GFX9) or SIMD ID for collection (Navi) + ROCPROFILER_ATT_OCCUPANCY = 9, //! Set true for occupancy collection only. + ROCPROFILER_ATT_BUFFER_SIZE = 10, //! ATT collection max data size, in MB. Shared among shader engines. + ROCPROFILER_ATT_PERF_MASK = 240, //! Mask of which compute units to generate perfcounters. GFX9 only. + ROCPROFILER_ATT_PERF_CTRL = 241, //! Select collection period for perfcounters. GFX9 only. + ROCPROFILER_ATT_PERFCOUNTER = 242, //! Select perfcounter ID (SQ block) for collection. GFX9 only. + ROCPROFILER_ATT_PERFCOUNTER_NAME = 243, //! Select perfcounter name (SQ block) for collection. GFX9 only. + ROCPROFILER_ATT_MAXVALUE, + + ROCPROFILER_ATT_MASK = 2, //! Deprecated + ROCPROFILER_ATT_TOKEN_MASK = 3, //! Deprecated + ROCPROFILER_ATT_TOKEN_MASK2 = 4, //! Deprecated + ROCPROFILER_ATT_SAMPLE_RATE = 6 //! Deprecated } rocprofiler_att_parameter_name_t; diff --git a/projects/rocprofiler/plugin/att/att.py b/projects/rocprofiler/plugin/att/att.py index b3d0332f42..3d35ed011f 100755 --- a/projects/rocprofiler/plugin/att/att.py +++ b/projects/rocprofiler/plugin/att/att.py @@ -439,6 +439,7 @@ if __name__ == "__main__": OCCUPANCY = [] GFXV = [] analysed_filenames = [] + occupancy_filenames = [] shader_engine_data_dict = {} for name in filenames: @@ -453,14 +454,17 @@ if __name__ == "__main__": hitcount_map = np.zeros((len(code)), dtype=np.int32) for name in filenames: SIMD, perfevents, occupancy, gfxv = shader_engine_data_dict[name] - getWaves_stitch(SIMD, code, jumps, gfxv, latency_map, hitcount_map) - if len(SIMD) == 0: - print("Error parsing ", name) + if len(occupancy) > 0: + OCCUPANCY.append( occupancy ) + occupancy_filenames.append( name ) + if np.sum([0]+[len(s.instructions) for s in SIMD]) == 0: + print("No waves from", name) continue + getWaves_stitch(SIMD, code, jumps, gfxv, latency_map, hitcount_map) + analysed_filenames.append(name) EVENTS.append(perfevents) DBFILES.append( persist(name, SIMD) ) - OCCUPANCY.append( occupancy ) GFXV.append(gfxv) gc.collect() @@ -488,7 +492,7 @@ if __name__ == "__main__": TIMELINES = comm.gather(TIMELINES, root=0) gather_latency_map = comm.gather(latency_map, root=0) gather_hitcount_map = comm.gather(hitcount_map, root=0) - gathered_filenames = comm.gather(analysed_filenames, root=0) + gathered_filenames = comm.gather(occupancy_filenames, root=0) if mpi_root: latency_map *= 0 @@ -513,7 +517,7 @@ if __name__ == "__main__": EVENTS = [] else: apply_min_event(min_event_time, OCCUPANCY, EVENTS, DBFILES, TIMELINES) - gathered_filenames = analysed_filenames + gathered_filenames = occupancy_filenames if mpi_root: for k in range(len(code)): diff --git a/projects/rocprofiler/plugin/att/drawing.py b/projects/rocprofiler/plugin/att/drawing.py index a5702410fc..f9549f6fbe 100644 --- a/projects/rocprofiler/plugin/att/drawing.py +++ b/projects/rocprofiler/plugin/att/drawing.py @@ -155,6 +155,12 @@ def draw_wave_states(selections, normalize, TIMELINES): def draw_occupancy(selections, normalize, OCCUPANCY, shadernames): plt.figure(figsize=(15,4)) names = [] + if len(OCCUPANCY) == 1: # If single SE, do occupancy per CU/WGP + OCCUPANCY = [[u for u in OCCUPANCY[0] if u&0xFF==k] for k in range(16)] + shadernames = ['CU'+str(k) for k in range(16) if len(OCCUPANCY[k]) > 0] + OCCUPANCY = [occ for occ in OCCUPANCY if len(occ) > 0] + + maxtime = 1 for name, occ in zip(shadernames, OCCUPANCY): occ_values = [0] occ_times = [0] @@ -166,10 +172,9 @@ def draw_occupancy(selections, normalize, OCCUPANCY, shadernames): occ_values.append(occ_values[-1] + value - current_occ[cu]) current_occ[cu] = value try: - name = 'SE'+name.split('.att')[0].split('_se')[-1] + names.append('SE'+name.split('.att')[0].split('_se')[-1]) except: - pass - names.append(name) + names.append(name) NUM_DOTS = 1500 maxtime = np.max(occ_times) diff --git a/projects/rocprofiler/src/tools/tool.cpp b/projects/rocprofiler/src/tools/tool.cpp index 49e5fee6f9..ec1cf83c20 100644 --- a/projects/rocprofiler/src/tools/tool.cpp +++ b/projects/rocprofiler/src/tools/tool.cpp @@ -274,21 +274,26 @@ att_parsed_input_t GetATTParams() { // List of parameters the user can set. Maxvalue is unused. std::unordered_map ATT_PARAM_NAMES{}; - ATT_PARAM_NAMES["att: TARGET_CU"] = ROCPROFILER_ATT_COMPUTE_UNIT_TARGET; + ATT_PARAM_NAMES["TARGET_CU"] = ROCPROFILER_ATT_COMPUTE_UNIT; ATT_PARAM_NAMES["SE_MASK"] = ROCPROFILER_ATT_SE_MASK; - ATT_PARAM_NAMES["SIMD_MASK"] = ROCPROFILER_ATT_MAXVALUE; - ATT_PARAM_NAMES["BUFFER_SIZE"] = ROCPROFILER_ATT_BUFFER_SIZE; + ATT_PARAM_NAMES["VMID_MASK"] = ROCPROFILER_ATT_VMID_MASK; + ATT_PARAM_NAMES["SIMD_SELECT"] = ROCPROFILER_ATT_SIMD_SELECT; + ATT_PARAM_NAMES["PERFCOUNTER_ID"] = ROCPROFILER_ATT_PERFCOUNTER; ATT_PARAM_NAMES["PERFCOUNTER"] = ROCPROFILER_ATT_PERFCOUNTER_NAME; - ATT_PARAM_NAMES["PERFCOUNTERS_COL_PERIOD"] = ROCPROFILER_ATT_MAXVALUE; + ATT_PARAM_NAMES["PERFCOUNTER_MASK"] = ROCPROFILER_ATT_PERF_MASK; + ATT_PARAM_NAMES["PERFCOUNTERS_CTRL"] = ROCPROFILER_ATT_PERF_CTRL; + ATT_PARAM_NAMES["OCCUPANCY"] = ROCPROFILER_ATT_OCCUPANCY; + ATT_PARAM_NAMES["KERNEL"] = ROCPROFILER_ATT_MAXVALUE; - ATT_PARAM_NAMES["REDUCED_MEMORY"] = ROCPROFILER_ATT_MAXVALUE; + ATT_PARAM_NAMES["BUFFER_SIZE"] = ROCPROFILER_ATT_BUFFER_SIZE; // Default values used for token generation. - std::unordered_map default_params = {{"ATT_MASK", 0x3F01}, - {"TOKEN_MASK", 0x344B}, - {"TOKEN_MASK2", 0xFFFFFFF}, - {"SE_MASK", 0x111111}}; + std::unordered_map default_params = { + {"SE_MASK", 0x111111}, // One every 4 SEs, by default + {"SIMD_SELECT", 0x3}, // 0x3 works for both gfx9 and Navi + {"BUFFER_SIZE", 0x40000000} // 2^30 == 1GB + }; std::ifstream trace_file(path); if (!trace_file.is_open()) { @@ -310,10 +315,15 @@ att_parsed_input_t GetATTParams() { if (pos == std::string::npos) continue; param_name = line.substr(0, pos); - line = line.substr(pos + 1); + for (auto& c : param_name) c = (char)toupper(c); // So we don't have to worry about lowercase inputs + line = line.substr(pos+1); } - if (param_name == "att: TARGET_CU") started_att_counters = true; + if (param_name.find("ATT") != std::string::npos && + param_name.find("TARGET_CU") != std::string::npos) { + started_att_counters = true; // Means we'll do ATT + param_name = "TARGET_CU"; // To cover different variations + } if (!started_att_counters) continue; if (param_name == "KERNEL") { @@ -344,25 +354,6 @@ att_parsed_input_t GetATTParams() { continue; } - if (param_name == "PERFCOUNTERS_COL_PERIOD") { - default_params["TOKEN_MASK"] |= 0x4000; - param_value = ((param_value & 0x1F) << 8) | 0xFFFF00FF; - parameters.push_back(std::make_pair(ROCPROFILER_ATT_PERF_CTRL, param_value)); - continue; - } else if (param_name == "SIMD_MASK") { - default_params["ATT_MASK"] &= ~0xF00; - default_params["ATT_MASK"] |= (param_value << 8) & 0xF00; - continue; - } else if (param_name == "att: TARGET_CU") { - default_params["ATT_MASK"] &= ~0xF; - default_params["ATT_MASK"] |= param_value & 0xF; - } else if (param_name == "PERFCOUNTER_ID") { - param_value = param_value | (param_value ? (0xF << 24) : 0); - } else if (param_name == "REDUCED_MEMORY") { - default_params["TOKEN_MASK2"] = 0; - continue; - } - if (ATT_PARAM_NAMES.find(param_name) != ATT_PARAM_NAMES.end()) { parameters.push_back(std::make_pair(ATT_PARAM_NAMES[param_name], param_value)); try { @@ -375,14 +366,9 @@ att_parsed_input_t GetATTParams() { for (auto& name : ATT_PARAM_NAMES) printf("%s\n", name.first.c_str()); } } - trace_file.close(); if (!started_att_counters) return {{}, {}, {}, {}}; - ATT_PARAM_NAMES["ATT_MASK"] = ROCPROFILER_ATT_MASK; - ATT_PARAM_NAMES["TOKEN_MASK"] = ROCPROFILER_ATT_TOKEN_MASK; - ATT_PARAM_NAMES["TOKEN_MASK2"] = ROCPROFILER_ATT_TOKEN_MASK2; - for (auto& param : default_params) parameters.push_back(std::make_pair(ATT_PARAM_NAMES[param.first], param.second)); diff --git a/projects/rocprofiler/tests-v2/featuretests/profiler/profiler_gtest.cpp b/projects/rocprofiler/tests-v2/featuretests/profiler/profiler_gtest.cpp index aa3c5c44b2..76cb2a52bb 100644 --- a/projects/rocprofiler/tests-v2/featuretests/profiler/profiler_gtest.cpp +++ b/projects/rocprofiler/tests-v2/featuretests/profiler/profiler_gtest.cpp @@ -567,7 +567,6 @@ TEST_F(LoadUnloadTest, WhenLoadingSecondTimeThenToolLoadsUnloadsSuccessfully) { EXPECT_EQ(HSA_STATUS_SUCCESS, status); } - /* * ################################################### * ############ ATT Tests ################ @@ -634,7 +633,10 @@ TEST_F(ATTCollection, WhenRunningATTItCollectsTraceData) { // Att trace collection parameters rocprofiler_session_id_t session_id; std::vector parameters; - parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_COMPUTE_UNIT_TARGET, 0}); + parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_COMPUTE_UNIT, 0}); + parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_SE_MASK, 0xF}); + //parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_SIMD_SELECT, 0x3}); // Replace below tests once aqlprofile passes + //parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_BUFFER_SIZE, 0x1000000}); // Replace below tests once aqlprofile passes parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_MASK, 0x0F00}); parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_TOKEN_MASK, 0x344B}); parameters.emplace_back(rocprofiler_att_parameter_t{ROCPROFILER_ATT_TOKEN_MASK2, 0xFFFF});