rocm_smi_lib: Fix [linux BM] [AMDSMI] Memory Bandwidth

Implements APIs for 'gpu_metrics_v1_3' utilization averages

Code changes related to the following:
  * rsmi_dev_activity_metric_get()
  * rsmi_dev_activity_avg_mm_get()
  * CLI shows "Avg.Memory Bandwidth" under "--showmemuse"

Change-Id: I8e4600f350a7c18499abf022534db2b875f09d5f
Signed-off-by: Oliveira, Daniel <daniel.oliveira@amd.com>
Αυτή η υποβολή περιλαμβάνεται σε:
Oliveira, Daniel
2023-09-19 13:44:20 -05:00
υποβλήθηκε από Daniel Oliveira
γονέας b99867eb80
υποβολή e0483f2ee2
5 αρχεία άλλαξαν με 202 προσθήκες και 7 διαγραφές
+114 -1
Προβολή Αρχείου
@@ -3295,7 +3295,7 @@ rsmi_utilization_count_get(uint32_t dv_ind,
val_ui32 = gpu_metrics.gfx_activity_acc;
break;
case RSMI_COARSE_GRAIN_MEM_ACTIVITY:
val_ui32 = gpu_metrics.mem_actvity_acc;
val_ui32 = gpu_metrics.mem_activity_acc;
break;
default:
return RSMI_STATUS_INVALID_ARGS;
@@ -3312,6 +3312,119 @@ rsmi_utilization_count_get(uint32_t dv_ind,
CATCH
}
rsmi_status_t
rsmi_dev_activity_metric_get(uint32_t dv_ind,
rsmi_activity_metric_t activity_metric_type,
rsmi_activity_metric_counter_t* activity_metric_counter) {
TRY
std::ostringstream ostrstream;
ostrstream << __PRETTY_FUNCTION__ << "| ======= start =======";
LOG_TRACE(ostrstream);
if (!activity_metric_counter) {
ostrstream << __PRETTY_FUNCTION__
<< " | ======= end ======= "
<< " | Fail "
<< " | Device #: " << dv_ind
<< " | Metric Type: " << activity_metric_type
<< " | Cause: rsmi_activity_metric_counter_t was a null ptr reference"
<< " | Returning = "
<< getRSMIStatusString(RSMI_STATUS_INVALID_ARGS) << " |";
LOG_ERROR(ostrstream);
return rsmi_status_t::RSMI_STATUS_INVALID_ARGS;
}
auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS);
rsmi_gpu_metrics_t gpu_metrics;
status_code = rsmi_dev_gpu_metrics_info_get(dv_ind, &gpu_metrics);
if (status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) {
ostrstream << __PRETTY_FUNCTION__
<< " | ======= end ======= "
<< " | Fail "
<< " | Device #: " << dv_ind
<< " | Metric Type: " << activity_metric_type
<< " | Cause: rsmi_dev_gpu_metrics_info_get returned "
<< getRSMIStatusString(status_code)
<< " | Returning = "
<< status_code << " |";
LOG_ERROR(ostrstream);
return status_code;
}
if (activity_metric_type & rsmi_activity_metric_t::RSMI_ACTIVITY_GFX) {
activity_metric_counter->average_gfx_activity = gpu_metrics.average_gfx_activity;
ostrstream << __PRETTY_FUNCTION__
<< " | For GFX: " << activity_metric_counter->average_gfx_activity;
LOG_INFO(ostrstream);
}
if (activity_metric_type & rsmi_activity_metric_t::RSMI_ACTIVITY_UMC) {
activity_metric_counter->average_umc_activity = gpu_metrics.average_umc_activity;
ostrstream << __PRETTY_FUNCTION__
<< " | For UMC: " << activity_metric_counter->average_umc_activity;
LOG_INFO(ostrstream);
}
if (activity_metric_type & rsmi_activity_metric_t::RSMI_ACTIVITY_MM) {
activity_metric_counter->average_mm_activity = gpu_metrics.average_mm_activity;
ostrstream << __PRETTY_FUNCTION__
<< " | For MM: " << activity_metric_counter->average_mm_activity;
LOG_INFO(ostrstream);
}
ostrstream << __PRETTY_FUNCTION__
<< " | ======= end ======= "
<< " | Success "
<< " | Device #: " << dv_ind
<< " | Metric Type: " << activity_metric_type
<< " | Returning = "
<< getRSMIStatusString(status_code) << " |";
LOG_INFO(ostrstream);
return status_code;
CATCH
}
rsmi_status_t
rsmi_dev_activity_avg_mm_get(uint32_t dv_ind, uint16_t* avg_activity) {
TRY
std::ostringstream ostrstream;
ostrstream << __PRETTY_FUNCTION__ << "| ======= start =======";
LOG_TRACE(ostrstream);
if (!avg_activity) {
ostrstream << __PRETTY_FUNCTION__
<< " | ======= end ======= "
<< " | Fail "
<< " | Device #: " << dv_ind
<< " | Metric Type: " << rsmi_activity_metric_t::RSMI_ACTIVITY_MM
<< " | Cause: avg_activity was a null ptr reference"
<< " | Returning = "
<< getRSMIStatusString(RSMI_STATUS_INVALID_ARGS) << " |";
LOG_ERROR(ostrstream);
return rsmi_status_t::RSMI_STATUS_INVALID_ARGS;
}
auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS);
auto avg_mm_activity(uint16_t(0));
rsmi_activity_metric_counter_t activity_metric_counter;
status_code = rsmi_dev_activity_metric_get(dv_ind, rsmi_activity_metric_t::RSMI_ACTIVITY_MM, &activity_metric_counter);
avg_activity = &activity_metric_counter.average_mm_activity;
ostrstream << __PRETTY_FUNCTION__
<< " | ======= end ======= "
<< " | Success "
<< " | Device #: " << dv_ind
<< " | Metric Type: " << rsmi_activity_metric_t::RSMI_ACTIVITY_MM
<< " | Returning = "
<< getRSMIStatusString(status_code) << " |";
LOG_INFO(ostrstream);
return status_code;
CATCH
}
rsmi_status_t
rsmi_dev_vbios_version_get(uint32_t dv_ind, char *vbios, uint32_t len) {
TRY
@@ -288,8 +288,8 @@ void log_gpu_metrics(const metrics_table_header_t *gpu_metrics_table_header,
rsmi_gpu_metrics->gfx_activity_acc,
"rsmi_gpu_metrics->gfx_activity_acc")
<< print_unsigned_hex_and_int(
rsmi_gpu_metrics->mem_actvity_acc,
"rsmi_gpu_metrics->mem_actvity_acc");
rsmi_gpu_metrics->mem_activity_acc,
"rsmi_gpu_metrics->mem_activity_acc");
for (int i=0; i < RSMI_NUM_HBM_INSTANCES; i++) {
ss << print_unsigned_hex_and_int(
rsmi_gpu_metrics->temperature_hbm[i],
@@ -414,7 +414,7 @@ static rsmi_status_t GetGPUMetricsFormat1(uint32_t dv_ind,
// These fields didn't exist in v0
data->gfx_activity_acc = 0;
data->mem_actvity_acc = 0;
data->mem_activity_acc = 0;
(void)memset(data->temperature_hbm, 0,
RSMI_NUM_HBM_INSTANCES * sizeof(uint16_t));
} // else handle other conversions to format 1