SWDEV-410293: ATT API rework
Change-Id: I379e8cfd5abb182eaf56d18c2b1a5dac3e44e6e8
[ROCm/rocprofiler commit: c94d4c3e81]
Этот коммит содержится в:
коммит произвёл
Giovanni Baraldi
родитель
93d0d6c872
Коммит
6973eb4d8a
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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)):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -274,21 +274,26 @@ att_parsed_input_t GetATTParams() {
|
||||
// List of parameters the user can set. Maxvalue is unused.
|
||||
std::unordered_map<std::string, rocprofiler_att_parameter_name_t> 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<std::string, uint32_t> default_params = {{"ATT_MASK", 0x3F01},
|
||||
{"TOKEN_MASK", 0x344B},
|
||||
{"TOKEN_MASK2", 0xFFFFFFF},
|
||||
{"SE_MASK", 0x111111}};
|
||||
std::unordered_map<std::string, uint32_t> 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));
|
||||
|
||||
|
||||
@@ -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<rocprofiler_att_parameter_t> 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});
|
||||
|
||||
Ссылка в новой задаче
Block a user