Show VCN and JPEG busy values where VCN/JPEG activity is not supported. (#232)

On AMD-SMI, in rocm 7.0, vcn_activity and jpeg_activity will not be reported when XCP (partition) stats, vcn_busy and jpeg_busy, are available. This causes the activity tracking to fail. The fix is to read the busy values when activity values are not supported.

For issue: SWDEV-536439

---------

Co-authored-by: David Galiffi <David.Galiffi@amd.com>
This commit is contained in:
Sajina PK
2025-06-19 16:23:30 -04:00
committed by GitHub
szülő 20efb9641f
commit e3741f678b
3 fájl változott, egészen pontosan 183 új sor hozzáadva és 74 régi sor törölve
+34 -37
Fájl megtekintése
@@ -73,6 +73,17 @@ check_amdsmi_error(amdsmi_status_t _code, const char* _file, int _line)
_msg);
}
// Ensures initialization happens only once
std::once_flag amdsmi_once;
// Tracks whether AMD SMI is initialized
bool&
_amdsmi_is_initialized()
{
static bool initialized = false;
return initialized;
}
bool
amdsmi_init()
{
@@ -82,10 +93,12 @@ amdsmi_init()
// Currently, only AMDSMI_INIT_AMD_GPUS is supported
ROCPROFSYS_AMD_SMI_CALL(::amdsmi_init(AMDSMI_INIT_AMD_GPUS));
get_processor_handles();
_amdsmi_is_initialized() = true; // Mark as initialized
} catch(std::exception& _e)
{
ROCPROFSYS_BASIC_VERBOSE(1, "Exception thrown initializing amd-smi: %s\n",
_e.what());
_amdsmi_is_initialized() = false; // Mark as not initialized
return false;
}
return true;
@@ -143,7 +156,9 @@ bool
initialize_amdsmi()
{
#if ROCPROFSYS_USE_ROCM > 0
return (amdsmi_init()) ? true : false;
// Ensure initialization happens only once
std::call_once(amdsmi_once, amdsmi_init);
return _amdsmi_is_initialized();
#else
return false;
#endif
@@ -252,45 +267,27 @@ get_processor_handles()
processors::processors_list.push_back(processor);
amdsmi_gpu_metrics_t gpu_metrics;
bool vcn_supported = false;
bool jpeg_supported = false;
bool v_busy_supported = false;
bool j_busy_supported = false;
ret = amdsmi_get_gpu_metrics_info(processor, &gpu_metrics);
if(ret == AMDSMI_STATUS_SUCCESS)
bool vcn_supported = false, jpeg_supported = false;
bool v_busy_supported = false, j_busy_supported = false;
// AMD SMI will not report VCN_activity and JPEG_activity, if VCN_busy or
// JPEG_busy fields are available.
if(amdsmi_get_gpu_metrics_info(processor, &gpu_metrics) ==
AMDSMI_STATUS_SUCCESS)
{
for(const auto& vcn_activity : gpu_metrics.vcn_activity)
{
if(vcn_activity != UINT16_MAX)
{
vcn_supported = true;
break;
}
}
for(const auto& jpeg_activity : gpu_metrics.jpeg_activity)
{
if(jpeg_activity != UINT16_MAX)
{
jpeg_supported = true;
break;
}
}
// Helper lambda to check if any value in the array is valid
auto has_valid = [](const auto& arr) {
return std::any_of(std::begin(arr), std::end(arr),
[](auto val) { return val != UINT16_MAX; });
};
vcn_supported = has_valid(gpu_metrics.vcn_activity);
jpeg_supported = has_valid(gpu_metrics.jpeg_activity);
// Check if VCN and JPEG busy metrics are available
for(const auto& xcp : gpu_metrics.xcp_stats)
{
if(!v_busy_supported)
{
v_busy_supported =
std::any_of(std::begin(xcp.vcn_busy), std::end(xcp.vcn_busy),
[](uint16_t val) { return val != UINT16_MAX; });
}
if(!j_busy_supported)
{
j_busy_supported = std::any_of(
std::begin(xcp.jpeg_busy), std::end(xcp.jpeg_busy),
[](uint16_t val) { return val != UINT16_MAX; });
}
if(!v_busy_supported && has_valid(xcp.vcn_busy))
v_busy_supported = true;
if(!j_busy_supported && has_valid(xcp.jpeg_busy))
j_busy_supported = true;
if(v_busy_supported && j_busy_supported) break;
}
}