diff --git a/projects/amdsmi/CHANGELOG.md b/projects/amdsmi/CHANGELOG.md index 6bd1fa596a..96cbd5a07c 100644 --- a/projects/amdsmi/CHANGELOG.md +++ b/projects/amdsmi/CHANGELOG.md @@ -4,6 +4,20 @@ Full documentation for amd_smi_lib is available at [https://rocm.docs.amd.com/pr ***All information listed below is for reference and subject to change.*** +## amd_smi_lib for ROCm 6.5.0 + +### Added + +- **Added support for GPU metrics 1.8**. + - Added new fields for `amdsmi_gpu_xcp_metrics_t` including: + - Adding the following metrics to allow new calculations for violation status: + - Per XCP metrics `gfx_below_host_limit_ppt_acc[XCP][MAX_XCC]` - GFX Clock Host limit Package Power Tracking violation counts + - Per XCP metrics `gfx_below_host_limit_thm_acc[XCP][MAX_XCC]` - GFX Clock Host limit Thermal (TVIOL) violation counts + - Per XCP metrics `gfx_low_utilization_acc[XCP][MAX_XCC]` - violation counts for how did low utilization caused the GPU to be below application clocks. + - Per XCP metrics `gfx_below_host_limit_total_acc[XCP][MAX_XCC]`- violation counts for how long GPU was held below application clocks any limiter (see above new violation metrics). + - Increasing available JPEG engines to 40. + Current ASICs may not support all 40. These will be indicated as UINT16_MAX or N/A in CLI. + ## amd_smi_lib for ROCm 6.4.0 ### Added diff --git a/projects/amdsmi/example/amd_smi_drm_example.cc b/projects/amdsmi/example/amd_smi_drm_example.cc index 52c22f5590..847cada398 100644 --- a/projects/amdsmi/example/amd_smi_drm_example.cc +++ b/projects/amdsmi/example/amd_smi_drm_example.cc @@ -1256,6 +1256,79 @@ int main() { idx++; } + /*New scp stats v1.8*/ + idx = 0; + idy = 0; + std::cout << "\txcp_stats.gfx_below_host_limit_ppt_acc: " << "\n"; + for (auto& row : smu.xcp_stats) { + std::cout << "\t XCP [" << idx << "] : ["; + for (auto& col : row.gfx_below_host_limit_ppt_acc) { + if ((idy + 1) != static_cast(std::size(row.gfx_below_host_limit_ppt_acc))) { + std::cout << col << ", "; + } else { + std::cout << col; + } + idy++; + } + std::cout << "]\n"; + idy = 0; + idx++; + } + + idx = 0; + idy = 0; + std::cout << "\txcp_stats.gfx_below_host_limit_thm_acc: " << "\n"; + for (auto& row : smu.xcp_stats) { + std::cout << "\t XCP [" << idx << "] : ["; + for (auto& col : row.gfx_below_host_limit_thm_acc) { + if ((idy + 1) != static_cast(std::size(row.gfx_below_host_limit_thm_acc))) { + std::cout << col << ", "; + } else { + std::cout << col; + } + idy++; + } + std::cout << "]\n"; + idy = 0; + idx++; + } + + idx = 0; + idy = 0; + std::cout << "\txcp_stats.gfx_low_utilization_acc: " << "\n"; + for (auto& row : smu.xcp_stats) { + std::cout << "\t XCP [" << idx << "] : ["; + for (auto& col : row.gfx_low_utilization_acc) { + if ((idy + 1) != static_cast(std::size(row.gfx_low_utilization_acc))) { + std::cout << col << ", "; + } else { + std::cout << col; + } + idy++; + } + std::cout << "]\n"; + idy = 0; + idx++; + } + + idx = 0; + idy = 0; + std::cout << "\txcp_stats.gfx_below_host_limit_total_acc: " << "\n"; + for (auto& row : smu.xcp_stats) { + std::cout << "\t XCP [" << idx << "] : ["; + for (auto& col : row.gfx_below_host_limit_total_acc) { + if ((idy + 1) != static_cast(std::size(row.gfx_below_host_limit_total_acc))) { + std::cout << col << ", "; + } else { + std::cout << col; + } + idy++; + } + std::cout << "]\n"; + idy = 0; + idx++; + } + std::cout << "\n\n"; std::cout << "\t ** -> Checking metrics with constant changes ** " << "\n"; constexpr uint16_t kMAX_ITER_TEST = 10; diff --git a/projects/amdsmi/include/amd_smi/amdsmi.h b/projects/amdsmi/include/amd_smi/amdsmi.h index 6f04c0ee9e..efe1e184a3 100644 --- a/projects/amdsmi/include/amd_smi/amdsmi.h +++ b/projects/amdsmi/include/amd_smi/amdsmi.h @@ -152,6 +152,12 @@ typedef enum { */ #define AMDSMI_MAX_NUM_JPEG 32 +/** + * @brief new for gpu metrics v1.8, document presents NUM_JPEG_ENG_V1 + * but will change to AMDSMI_MAX_NUM_JPEG_ENG_V1 for continuity + */ +#define AMDSMI_MAX_NUM_JPEG_ENG_V1 40 + /** * @brief This should match AMDSMI_MAX_NUM_XCC; * XCC - Accelerated Compute Core, the collection of compute units, @@ -1688,9 +1694,9 @@ typedef struct { * @brief v1.6 additions * The max uint32_t will be used if that information is N/A */ - uint32_t gfx_busy_inst[AMDSMI_MAX_NUM_XCC]; //!< Utilization Instantaneous in % - uint16_t jpeg_busy[AMDSMI_MAX_NUM_JPEG]; //!< Utilization Instantaneous in % - uint16_t vcn_busy[AMDSMI_MAX_NUM_VCN]; //!< Utilization Instantaneous in % + uint32_t gfx_busy_inst[AMDSMI_MAX_NUM_XCC]; //!< Utilization Instantaneous in % + uint16_t jpeg_busy[AMDSMI_MAX_NUM_JPEG_ENG_V1]; //!< Utilization Instantaneous in % (UPDATED: to 40 in v1.8) + uint16_t vcn_busy[AMDSMI_MAX_NUM_VCN]; //!< Utilization Instantaneous in % uint64_t gfx_busy_acc[AMDSMI_MAX_NUM_XCC]; //!< Utilization Accumulated in % @@ -1699,6 +1705,17 @@ typedef struct { */ /* Total App Clock Counter Accumulated */ uint64_t gfx_below_host_limit_acc[AMDSMI_MAX_NUM_XCC]; //!< Total App Clock Counter Accumulated + + /** + * @brief v1.8 additions + */ + /* Total App Clock Counter Accumulated */ + uint64_t gfx_below_host_limit_ppt_acc[AMDSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_thm_acc[AMDSMI_MAX_NUM_XCC]; + uint64_t gfx_low_utilization_acc[AMDSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_total_acc[AMDSMI_MAX_NUM_XCC]; + + } amdsmi_gpu_xcp_metrics_t; /** @@ -1889,7 +1906,7 @@ typedef struct { uint32_t pcie_lc_perf_other_end_recovery; //!< PCIE other end recovery counter - /* + /** * @brief v1.7 additions */ uint64_t vram_max_bandwidth; //!< VRAM max bandwidth at max memory clock (GB/s) diff --git a/projects/amdsmi/py-interface/amdsmi_interface.py b/projects/amdsmi/py-interface/amdsmi_interface.py index 6e4dbe132e..b12ee72fa5 100644 --- a/projects/amdsmi/py-interface/amdsmi_interface.py +++ b/projects/amdsmi/py-interface/amdsmi_interface.py @@ -4200,6 +4200,10 @@ def amdsmi_get_gpu_metrics_info( "xcp_stats.vcn_busy": list(gpu_metrics.xcp_stats), "xcp_stats.gfx_busy_acc": list(gpu_metrics.xcp_stats), "xcp_stats.gfx_below_host_limit_acc": list(gpu_metrics.xcp_stats), + "xcp_stats.gfx_below_host_limit_ppt_acc": list(gpu_metrics.xcp_stats), + "xcp_stats.gfx_below_host_limit_thm_acc": list(gpu_metrics.xcp_stats), + "xcp_stats.gfx_low_utilization_acc": list(gpu_metrics.xcp_stats), + "xcp_stats.gfx_below_host_limit_total_acc": list(gpu_metrics.xcp_stats), "pcie_lc_perf_other_end_recovery": _validate_if_max_uint(gpu_metrics.pcie_lc_perf_other_end_recovery, MaxUIntegerTypes.UINT32_T), "vram_max_bandwidth": _validate_if_max_uint(gpu_metrics.vram_max_bandwidth, MaxUIntegerTypes.UINT64_T), "xgmi_link_status": _validate_if_max_uint(list(gpu_metrics.xgmi_link_status), MaxUIntegerTypes.UINT16_T), @@ -4231,15 +4235,40 @@ def amdsmi_get_gpu_metrics_info( for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_busy_acc']): xcp_detail = [] for val in xcp_metrics.gfx_busy_acc: - xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T, isActivity=True)) + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) gpu_metrics_output["xcp_stats.gfx_busy_acc"][xcp_index] = xcp_detail if 'xcp_stats.gfx_below_host_limit_acc' in gpu_metrics_output: for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_below_host_limit_acc']): xcp_detail = [] for val in xcp_metrics.gfx_below_host_limit_acc: - xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T, isActivity=True)) + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) gpu_metrics_output['xcp_stats.gfx_below_host_limit_acc'][xcp_index] = xcp_detail + # new for gpu metrics v1.8 + if 'xcp_stats.gfx_below_host_limit_ppt_acc' in gpu_metrics_output: + for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_below_host_limit_ppt_acc']): + xcp_detail = [] + for val in xcp_metrics.gfx_below_host_limit_ppt_acc: + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) + gpu_metrics_output['xcp_stats.gfx_below_host_limit_ppt_acc'][xcp_index] = xcp_detail + if 'xcp_stats.gfx_below_host_limit_thm_acc' in gpu_metrics_output: + for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_below_host_limit_thm_acc']): + xcp_detail = [] + for val in xcp_metrics.gfx_below_host_limit_thm_acc: + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) + gpu_metrics_output['xcp_stats.gfx_below_host_limit_thm_acc'][xcp_index] = xcp_detail + if 'xcp_stats.gfx_low_utilization_acc' in gpu_metrics_output: + for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_low_utilization_acc']): + xcp_detail = [] + for val in xcp_metrics.gfx_low_utilization_acc: + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) + gpu_metrics_output['xcp_stats.gfx_low_utilization_acc'][xcp_index] = xcp_detail + if 'xcp_stats.gfx_below_host_limit_total_acc' in gpu_metrics_output: + for xcp_index, xcp_metrics in enumerate(gpu_metrics_output['xcp_stats.gfx_below_host_limit_total_acc']): + xcp_detail = [] + for val in xcp_metrics.gfx_below_host_limit_total_acc: + xcp_detail.append(_validate_if_max_uint(val, MaxUIntegerTypes.UINT64_T)) + gpu_metrics_output['xcp_stats.gfx_below_host_limit_total_acc'][xcp_index] = xcp_detail return gpu_metrics_output diff --git a/projects/amdsmi/py-interface/amdsmi_wrapper.py b/projects/amdsmi/py-interface/amdsmi_wrapper.py index 08febae9ba..be427c1312 100644 --- a/projects/amdsmi/py-interface/amdsmi_wrapper.py +++ b/projects/amdsmi/py-interface/amdsmi_wrapper.py @@ -1849,10 +1849,14 @@ class struct_amdsmi_gpu_xcp_metrics_t(Structure): struct_amdsmi_gpu_xcp_metrics_t._pack_ = 1 # source:False struct_amdsmi_gpu_xcp_metrics_t._fields_ = [ ('gfx_busy_inst', ctypes.c_uint32 * 8), - ('jpeg_busy', ctypes.c_uint16 * 32), + ('jpeg_busy', ctypes.c_uint16 * 40), ('vcn_busy', ctypes.c_uint16 * 4), ('gfx_busy_acc', ctypes.c_uint64 * 8), ('gfx_below_host_limit_acc', ctypes.c_uint64 * 8), + ('gfx_below_host_limit_ppt_acc', ctypes.c_uint64 * 8), + ('gfx_below_host_limit_thm_acc', ctypes.c_uint64 * 8), + ('gfx_low_utilization_acc', ctypes.c_uint64 * 8), + ('gfx_below_host_limit_total_acc', ctypes.c_uint64 * 8), ] amdsmi_gpu_xcp_metrics_t = struct_amdsmi_gpu_xcp_metrics_t diff --git a/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi.h b/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi.h index 53a4852e5b..1535a320e9 100644 --- a/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi.h +++ b/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi.h @@ -1068,6 +1068,11 @@ typedef struct metrics_table_header_t metrics_table_header_t; */ #define RSMI_MAX_NUM_JPEG_ENGS 32 +/** + * @brief This should match kRSMI_MAX_NUM_JPEG_ENG_V1 + */ +#define RSMI_MAX_NUM_JPEG_ENG_V1 40 + /** * @brief This should match kRSMI_MAX_NUM_CLKS */ @@ -1115,7 +1120,7 @@ struct amdgpu_xcp_metrics_t { */ /* Utilization Instantaneous (%) */ uint32_t gfx_busy_inst[RSMI_MAX_NUM_XCC]; - uint16_t jpeg_busy[RSMI_MAX_NUM_JPEG_ENGS]; + uint16_t jpeg_busy[RSMI_MAX_NUM_JPEG_ENG_V1]; uint16_t vcn_busy[RSMI_MAX_NUM_VCNS]; /* Utilization Accumulated (%) */ @@ -1126,6 +1131,14 @@ struct amdgpu_xcp_metrics_t { */ /* Total App Clock Counter Accumulated */ uint64_t gfx_below_host_limit_acc[RSMI_MAX_NUM_XCC]; + + /** + * v1.8 additions + */ + uint64_t gfx_below_host_limit_ppt_acc[RSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_thm_acc[RSMI_MAX_NUM_XCC]; + uint64_t gfx_low_utilization_acc[RSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_total_acc[RSMI_MAX_NUM_XCC]; }; typedef struct { diff --git a/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h b/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h index 70d31c5347..d9325cf9ff 100644 --- a/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h +++ b/projects/amdsmi/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h @@ -54,10 +54,11 @@ constexpr uint32_t kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_1 = 1; constexpr uint32_t kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_2 = 2; constexpr uint32_t kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_3 = 3; constexpr uint32_t kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_4 = 4; +constexpr uint32_t kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_8 = 8; constexpr uint32_t kRSMI_LATEST_GPU_METRICS_API_CONTENT_MAJOR_VER = kRSMI_GPU_METRICS_API_CONTENT_MAJOR_VER_1; -constexpr uint32_t kRSMI_LATEST_GPU_METRICS_API_CONTENT_MINON_VER - = kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_4; +constexpr uint32_t kRSMI_LATEST_GPU_METRICS_API_CONTENT_MINOR_VER + = kRSMI_GPU_METRICS_API_CONTENT_MINOR_VER_8; // Note: This *must* match NUM_HBM_INSTANCES @@ -78,6 +79,10 @@ constexpr uint32_t kRSMI_MAX_NUM_VCNS = 4; // Note: This *must* match NUM_JPEG_ENG constexpr uint32_t kRSMI_MAX_JPEG_ENGINES = 32; +// Note: Updated for amdgpu_xcp_metrics_v1_2. +// Document provides NUM_JPEG_ENG_V1 but will rename to kRSMI_MAX_NUM_JPEG_ENG_V1 +constexpr uint32_t kRSMI_MAX_NUM_JPEG_ENG_V1 = 40; + // Note: This *must* match MAX_XCC constexpr uint32_t kRSMI_MAX_NUM_XCC = 8; @@ -90,6 +95,15 @@ struct AMDGpuMetricsHeader_v1_t { uint8_t m_format_revision; uint8_t m_content_revision; }; +struct amdgpu_xcp_metrics { + /* Utilization Instantaneous (%) */ + uint32_t gfx_busy_inst[kRSMI_MAX_NUM_XCC]; + uint16_t jpeg_busy[kRSMI_MAX_JPEG_ENGINES]; + uint16_t vcn_busy[kRSMI_MAX_NUM_VCNS]; + + /* Utilization Accumulated (%) */ + uint64_t gfx_busy_acc[kRSMI_MAX_NUM_XCC]; +}; struct amdgpu_xcp_metrics_v1_1 { /* Utilization Instantaneous (%) */ @@ -104,14 +118,21 @@ struct amdgpu_xcp_metrics_v1_1 { uint64_t gfx_below_host_limit_acc[kRSMI_MAX_NUM_XCC]; }; -struct amdgpu_xcp_metrics { +/* new for gpu metrics v1.8 */ +struct amdgpu_xcp_metrics_v1_2 { /* Utilization Instantaneous (%) */ uint32_t gfx_busy_inst[kRSMI_MAX_NUM_XCC]; - uint16_t jpeg_busy[kRSMI_MAX_JPEG_ENGINES]; + uint16_t jpeg_busy[kRSMI_MAX_NUM_JPEG_ENG_V1]; uint16_t vcn_busy[kRSMI_MAX_NUM_VCNS]; /* Utilization Accumulated (%) */ uint64_t gfx_busy_acc[kRSMI_MAX_NUM_XCC]; + + /* Total App Clock Counter Accumulated */ + uint64_t gfx_below_host_limit_ppt_acc[kRSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_thm_acc[kRSMI_MAX_NUM_XCC]; + uint64_t gfx_low_utilization_acc[kRSMI_MAX_NUM_XCC]; + uint64_t gfx_below_host_limit_total_acc[kRSMI_MAX_NUM_XCC]; }; struct AMDGpuMetricsBase_t { @@ -667,7 +688,107 @@ struct AMDGpuMetrics_v17_t { /* PCIE other end recovery counter */ uint32_t m_pcie_lc_perf_other_end_recovery; }; -using AMGpuMetricsLatest_t = AMDGpuMetrics_v17_t; + +struct AMDGpuMetrics_v18_t { + ~AMDGpuMetrics_v18_t() = default; + struct AMDGpuMetricsHeader_v1_t m_common_header; + + /* Temperature (Celsius) */ + uint16_t m_temperature_hotspot; + uint16_t m_temperature_mem; + uint16_t m_temperature_vrsoc; + + /* Power (Watts) */ + uint16_t m_current_socket_power; + + /* Utilization (%) */ + uint16_t m_average_gfx_activity; + uint16_t m_average_umc_activity; // memory controller + + /* VRAM max bandwidthi (in GB/sec) at max memory clock */ + uint64_t m_mem_max_bandwidth; + + /* Energy (15.259uJ (2^-16) units) */ + uint64_t m_energy_accumulator; + + /* Driver attached timestamp (in ns) */ + uint64_t m_system_clock_counter; + + /* Accumulation cycle counter */ + uint32_t m_accumulation_counter; + + /* Accumulated throttler residencies */ + uint32_t m_prochot_residency_acc; + uint32_t m_ppt_residency_acc; + uint32_t m_socket_thm_residency_acc; + uint32_t m_vr_thm_residency_acc; + uint32_t m_hbm_thm_residency_acc; + + /* Clock Lock Status. Each bit corresponds to clock instance */ + uint32_t m_gfxclk_lock_status; + + /* Link width (number of lanes) and speed (in 0.1 GT/s) */ + uint16_t m_pcie_link_width; + uint16_t m_pcie_link_speed; + + /* XGMI bus width and bitrate (in Gbps) */ + uint16_t m_xgmi_link_width; + uint16_t m_xgmi_link_speed; + + /* Utilization Accumulated (%) */ + uint32_t m_gfx_activity_acc; + uint32_t m_mem_activity_acc; + + /*PCIE accumulated bandwidth (GB/sec) */ + uint64_t m_pcie_bandwidth_acc; + + /*PCIE instantaneous bandwidth (GB/sec) */ + uint64_t m_pcie_bandwidth_inst; + + /* PCIE L0 to recovery state transition accumulated count */ + uint64_t m_pcie_l0_to_recov_count_acc; + + /* PCIE replay accumulated count */ + uint64_t m_pcie_replay_count_acc; + + /* PCIE replay rollover accumulated count */ + uint64_t m_pcie_replay_rover_count_acc; + + /* PCIE NAK sent accumulated count */ + uint32_t m_pcie_nak_sent_count_acc; + + /* PCIE NAK received accumulated count */ + uint32_t m_pcie_nak_rcvd_count_acc; + + /* XGMI accumulated data transfer size(KiloBytes) */ + uint64_t m_xgmi_read_data_acc[kRSMI_MAX_NUM_XGMI_LINKS]; + uint64_t m_xgmi_write_data_acc[kRSMI_MAX_NUM_XGMI_LINKS]; + + /* XGMI link status(active/inactive) */ + uint16_t m_xgmi_link_status[kRSMI_MAX_NUM_XGMI_LINKS]; + + uint16_t m_padding; + + /* PMFW attached timestamp (10ns resolution) */ + uint64_t m_firmware_timestamp; + + /* Current clocks (Mhz) */ + uint16_t m_current_gfxclk[kRSMI_MAX_NUM_GFX_CLKS]; + uint16_t m_current_socclk[kRSMI_MAX_NUM_CLKS]; + uint16_t m_current_vclk0[kRSMI_MAX_NUM_CLKS]; + uint16_t m_current_dclk0[kRSMI_MAX_NUM_CLKS]; + uint16_t m_current_uclk; + + /* Number of current partition */ + uint16_t m_num_partition; + + /* XCP metrics stats */ + struct amdgpu_xcp_metrics_v1_2 m_xcp_stats[kRSMI_MAX_NUM_XCP]; + + /* PCIE other end recovery counter */ + uint32_t m_pcie_lc_perf_other_end_recovery; +}; +using AMGpuMetricsLatest_t = AMDGpuMetrics_v18_t; /** * This is GPU Metrics version that gets to public access. @@ -882,11 +1003,18 @@ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t kMetricJpegBusy, // v1.6 kMetricVcnBusy, // v1.6 kMetricGfxBusyAcc, // v1.6 + kMetricGfxBelowHostLimitAccumulator, // v1.7 + kMetricPcieLCPerfOtherEndRecov, // v1.6 kMetricVramMaxBandwidth, // v1.7 kMetricXgmiLinkStatus, // v1.7 - kMetricGfxBelowHostLimitAccumulator, // v1.7 + + kMetricGfxBelowHostLimitPptAcc, // v1.8 + kMetricGfxBelowHostLimitThmAcc, // v1.8 + kMetricGfxBelowHostLimitTotalAcc, // v1.8 + kMetricGfxLowUtilitizationAcc, // v1.8 + }; using AMDGpuMetricsUnitTypeTranslationTbl_t = std::map; @@ -925,6 +1053,7 @@ enum class AMDGpuMetricVersionFlags_t : AMDGpuMetricVersionFlagId_t kGpuMetricV15 = (0x1 << 5), kGpuMetricV16 = (0x1 << 6), kGpuMetricV17 = (0x1 << 7), + kGpuMetricV18 = (0x1 << 8), // Added new version flag }; using AMDGpuMetricVersionTranslationTbl_t = std::map; using GpuMetricTypePtr_t = std::shared_ptr; @@ -934,7 +1063,6 @@ class GpuMetricsBase_t { virtual ~GpuMetricsBase_t() = default; virtual size_t sizeof_metric_table() = 0; virtual GpuMetricTypePtr_t get_metrics_table() = 0; - virtual void dump_internal_metrics_table() = 0; virtual AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() = 0; virtual rsmi_status_t populate_metrics_dynamic_tbl() = 0; virtual AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() = 0; @@ -969,10 +1097,6 @@ class GpuMetricsBase_v11_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override { - return; - } - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV11; } @@ -1002,10 +1126,6 @@ class GpuMetricsBase_v12_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override { - return; - } - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV12; } @@ -1034,8 +1154,6 @@ class GpuMetricsBase_v13_t final : public GpuMetricsBase_t { return (m_gpu_metric_ptr); } - void dump_internal_metrics_table() override; - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV13; } @@ -1065,8 +1183,6 @@ class GpuMetricsBase_v14_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override; - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV14; } @@ -1096,8 +1212,6 @@ class GpuMetricsBase_v15_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override; - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV15; } @@ -1127,8 +1241,6 @@ class GpuMetricsBase_v16_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override; - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV16; } @@ -1157,8 +1269,6 @@ class GpuMetricsBase_v17_t final : public GpuMetricsBase_t { return m_gpu_metric_ptr; } - void dump_internal_metrics_table() override; - AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV17; } @@ -1171,6 +1281,34 @@ class GpuMetricsBase_v17_t final : public GpuMetricsBase_t { std::shared_ptr m_gpu_metric_ptr; }; +class GpuMetricsBase_v18_t final : public GpuMetricsBase_t { + public: + ~GpuMetricsBase_v18_t() = default; + + size_t sizeof_metric_table() override { + return sizeof(AMDGpuMetrics_v18_t); + } + + GpuMetricTypePtr_t get_metrics_table() override { + if (!m_gpu_metric_ptr) { + m_gpu_metric_ptr.reset(&m_gpu_metrics_tbl, [](AMDGpuMetrics_v18_t*){}); + } + assert(m_gpu_metric_ptr != nullptr); + return m_gpu_metric_ptr; + } + + AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { + return AMDGpuMetricVersionFlags_t::kGpuMetricV18; + } + + rsmi_status_t populate_metrics_dynamic_tbl() override; + AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() override; + + private: + AMDGpuMetrics_v18_t m_gpu_metrics_tbl; + std::shared_ptr m_gpu_metric_ptr; +}; + template rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, T& metric_value); diff --git a/projects/amdsmi/rocm_smi/src/rocm_smi_gpu_metrics.cc b/projects/amdsmi/rocm_smi/src/rocm_smi_gpu_metrics.cc index 68e2c4b2ce..8a2de8e761 100644 --- a/projects/amdsmi/rocm_smi/src/rocm_smi_gpu_metrics.cc +++ b/projects/amdsmi/rocm_smi/src/rocm_smi_gpu_metrics.cc @@ -147,6 +147,7 @@ const AMDGpuMetricVersionTranslationTbl_t amdgpu_metric_version_translation_tabl {join_metrics_version(1, 5), AMDGpuMetricVersionFlags_t::kGpuMetricV15}, {join_metrics_version(1, 6), AMDGpuMetricVersionFlags_t::kGpuMetricV16}, {join_metrics_version(1, 7), AMDGpuMetricVersionFlags_t::kGpuMetricV17}, + {join_metrics_version(1, 8), AMDGpuMetricVersionFlags_t::kGpuMetricV18}, }; /** @@ -256,22 +257,27 @@ const AMDGpuMetricsUnitTypeTranslationTbl_t amdgpu_metrics_unit_type_translation {AMDGpuMetricsUnitType_t::kMetricHBMThmResidencyAccumulator, "HBMThmResidencyAccumulator"}, /* v1.6 */ // kGpuMetricPartition - {AMDGpuMetricsUnitType_t::kGpuMetricNumPartition, "numPartition"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kGpuMetricNumPartition, "numPartition"}, /* v1.6 */ // kGpuMetricXcpStats - {AMDGpuMetricsUnitType_t::kMetricGfxBusyInst, "GfxBusyInst"}, /* v1.6 */ - {AMDGpuMetricsUnitType_t::kMetricJpegBusy, "JpegBusy"}, /* v1.6 */ - {AMDGpuMetricsUnitType_t::kMetricVcnBusy, "VcnBusy"}, /* v1.6 */ - {AMDGpuMetricsUnitType_t::kMetricGfxBusyAcc, "GfxBusyAcc"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBusyInst, "GfxBusyInst"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kMetricJpegBusy, "JpegBusy"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kMetricVcnBusy, "VcnBusy"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBusyAcc, "GfxBusyAcc"}, /* v1.6 */ // kGpuMetricLinkWidthSpeed - {AMDGpuMetricsUnitType_t::kMetricPcieLCPerfOtherEndRecov, "PcieLCPerfOtherEndRecov"}, /* v1.6 */ + {AMDGpuMetricsUnitType_t::kMetricPcieLCPerfOtherEndRecov, "PcieLCPerfOtherEndRecov"}, /* v1.6 */ - {AMDGpuMetricsUnitType_t::kMetricXgmiLinkStatus, "XgmiLinkStatus"}, /* v1.7 */ - {AMDGpuMetricsUnitType_t::kMetricVramMaxBandwidth, "VramMaxBandwidth"}, /* v1.7 */ - {AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitAccumulator, - "GfxBelowHostLimitAccumulator"}, /* v1.7 */ + {AMDGpuMetricsUnitType_t::kMetricXgmiLinkStatus, "XgmiLinkStatus"}, /* v1.7 */ + {AMDGpuMetricsUnitType_t::kMetricVramMaxBandwidth, "VramMaxBandwidth"}, /* v1.7 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitAccumulator,"GfxBelowHostLimitAccumulator"}, /* v1.7 */ + + // kGpuMetricXcpStats v1.8 + {AMDGpuMetricsUnitType_t::kMetricGfxLowUtilitizationAcc, "GfxLowUtilitizationAcc"}, /* v1.8 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitTotalAcc, "GfxBelowHostLimitTotalAcc"}, /* v1.8 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitPptAcc, "GfxBelowHostLimitPptAcc"}, /* v1.8 */ + {AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitThmAcc, "GfxBelowHostLimitThmAcc"}, /* v1.8 */ }; @@ -361,6 +367,7 @@ AMDGpuMetricFactories_t amd_gpu_metrics_factory_table {AMDGpuMetricVersionFlags_t::kGpuMetricV15, std::make_shared(GpuMetricsBase_v15_t{})}, {AMDGpuMetricVersionFlags_t::kGpuMetricV16, std::make_shared(GpuMetricsBase_v16_t{})}, {AMDGpuMetricVersionFlags_t::kGpuMetricV17, std::make_shared(GpuMetricsBase_v17_t{})}, + {AMDGpuMetricVersionFlags_t::kGpuMetricV18, std::make_shared(GpuMetricsBase_v18_t{})}, }; GpuMetricsBasePtr amdgpu_metrics_factory(AMDGpuMetricVersionFlags_t gpu_metric_version) @@ -479,388 +486,267 @@ AMDGpuDynamicMetricTblValues_t format_metric_row(const T& metric, const std::str return multi_values; } -void GpuMetricsBase_v17_t::dump_internal_metrics_table() -{ + +rsmi_status_t GpuMetricsBase_v18_t::populate_metrics_dynamic_tbl() { std::ostringstream ss; - auto idx = uint64_t(0); - auto idy = uint64_t(0); - std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; - ss << __PRETTY_FUNCTION__ - << " | ======= DEBUG ======= " - << " | Metric Version: " - << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) - << " | Size: " - << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) - << " |" - << "\n"; - ss << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" - << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" - << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" - << " current_socket_power: " << m_gpu_metrics_tbl.m_current_socket_power << "\n" - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n"; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ss << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ss); - ss << " vram_max_bandwidth: " << m_gpu_metrics_tbl.m_vram_max_bandwidth << "\n" // new for v1.7 - << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" - << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" - << " accumulation_counter: " << m_gpu_metrics_tbl.m_accumulation_counter << "\n" - << " prochot_residency_acc: " << m_gpu_metrics_tbl.m_prochot_residency_acc << "\n" - << " ppt_residency_acc: " << m_gpu_metrics_tbl.m_ppt_residency_acc << "\n" - << " socket_thm_residency_acc: " << m_gpu_metrics_tbl.m_socket_thm_residency_acc << "\n" - << " vr_thm_residency_acc: " << m_gpu_metrics_tbl.m_vr_thm_residency_acc << "\n" - << " hbm_thm_residency_acc: " << m_gpu_metrics_tbl.m_hbm_thm_residency_acc << "\n" - << " gfxclk_lock_status: " << m_gpu_metrics_tbl.m_gfxclk_lock_status << "\n" - << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" - << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" - << " xgmi_link_width: " << m_gpu_metrics_tbl.m_xgmi_link_width << "\n" - << " xgmi_link_speed: " << m_gpu_metrics_tbl.m_xgmi_link_speed << "\n" - << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" - << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n" - << " pcie_bandwidth_acc: " << m_gpu_metrics_tbl.m_pcie_bandwidth_acc << "\n" - << " pcie_bandwidth_inst: " << m_gpu_metrics_tbl.m_pcie_bandwidth_inst << "\n" - << " pcie_l0_to_recov_count_acc: " << m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc << "\n" - << " pcie_replay_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_count_acc << "\n" - << " pcie_replay_rover_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc << "\n" - << " pcie_nak_sent_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_sent_count_acc << "\n" - << " pcie_nak_rcvd_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_rcvd_count_acc << "\n" - << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n" - << " current_uclk: " << m_gpu_metrics_tbl.m_current_uclk << "\n" - << " num_partition: " << m_gpu_metrics_tbl.m_num_partition << "\n" - << " pcie_lc_perf_other_end_recovery: " - << m_gpu_metrics_tbl.m_pcie_lc_perf_other_end_recovery << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_link_status) { // new for v1.7 - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + auto m_metrics_dynamic_tbl = AMDGpuDynamicMetricsTbl_t{}; + // + // Note: Any metric treatment/changes (if any) should happen before they + // get written to internal/external tables. + // + auto run_metric_adjustments_v18 = [&]() { + ss << __PRETTY_FUNCTION__ << " | ======= start ======="; + const auto gpu_metrics_version = + translate_flag_to_metric_version(get_gpu_metrics_version_used()); + ss << __PRETTY_FUNCTION__ << " | ======= info ======= " + << " | Applying adjustments " + << " | Metric Version: " + << stringfy_metric_header_version(disjoin_metrics_version(gpu_metrics_version)) << " |"; + LOG_TRACE(ss); - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_read_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // firmware_timestamp is at 10ns resolution + ss << __PRETTY_FUNCTION__ << " | ======= Changes ======= " + << " | {m_firmware_timestamp} from: " << m_gpu_metrics_tbl.m_firmware_timestamp + << " to: " << (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + m_gpu_metrics_tbl.m_firmware_timestamp = (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + LOG_DEBUG(ss); + }; - ss << " xgmi_write_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_write_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // Temperature Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHotspot, + format_metric_row(m_gpu_metrics_tbl.m_temperature_hotspot, + "temperature_hotspot"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempMem, + format_metric_row(m_gpu_metrics_tbl.m_temperature_mem, + "temperature_mem"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrSoc, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrsoc, + "temperature_vrsoc"))); - ss << " current_gfxclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_gfxclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // Power/Energy Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrSocketPower, + format_metric_row(m_gpu_metrics_tbl.m_current_socket_power, + "curr_socket_power"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricEnergyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_energy_accumulator, + "energy_acc"))); - ss << " current_socclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_socclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // Utilization Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgGfxActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_gfx_activity, + "average_gfx_activity"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgUmcActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_umc_activity, + "average_umc_activity"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_gfx_activity_acc, + "gfx_activity_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricMemActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_mem_activity_acc, + "mem_activity_acc"))); - ss << " current_vclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_vclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // GfxLock Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricGfxClkLockStatus] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxClkLockStatus, + format_metric_row(m_gpu_metrics_tbl.m_gfxclk_lock_status, + "gfxclk_lock_status"))); - ss << " current_dclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_dclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // Timestamp Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTimestamp] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTSFirmware, + format_metric_row(m_gpu_metrics_tbl.m_firmware_timestamp, + "firmware_timestamp"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTimestamp] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTSClockCounter, + format_metric_row(m_gpu_metrics_tbl.m_system_clock_counter, + "system_clock_counter"))); - idx = 0; - idy = 0; - ss << " xcp_stats.gfx_busy_inst: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.gfx_busy_inst) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != static_cast((std::end(row.gfx_busy_inst) - std::end(row.gfx_busy_inst) - 1))) { - ss << ", "; - } - if (idx + 1 != - static_cast((std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1))) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } + // Link/Width/Speed Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkWidth, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_width, + "pcie_link_width"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkSpeed, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_speed, + "pcie_link_speed"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiLinkWidth, + format_metric_row(m_gpu_metrics_tbl.m_xgmi_link_width, + "xgmi_link_width"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiLinkSpeed, + format_metric_row(m_gpu_metrics_tbl.m_xgmi_link_speed, + "xgmi_link_speed"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_bandwidth_acc, + "pcie_bandwidth_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthInst, + format_metric_row(m_gpu_metrics_tbl.m_pcie_bandwidth_inst, + "pcie_bandwidth_inst"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieL0RecovCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc, + "pcie_l0_recov_count_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieReplayCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_replay_count_acc, + "pcie_replay_count_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieReplayRollOverCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc, + "pcie_replay_rollover_count_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieNakSentCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_nak_sent_count_acc, + "pcie_nak_sent_count_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieNakReceivedCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_nak_rcvd_count_acc, + "pcie_nak_rcvd_count_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiReadDataAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_xgmi_read_data_acc, + "[xgmi_read_data_acc]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiWriteDataAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_xgmi_write_data_acc, + "[xgmi_write_data_acc]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiLinkStatus, + format_metric_row(m_gpu_metrics_tbl.m_xgmi_link_status, + "[xgmi_link_status]"))); - idx = 0; - idy = 0; - ss << " xcp_stats.vcn_busy: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.vcn_busy) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != static_cast((std::end(row.vcn_busy) - std::end(row.vcn_busy) - 1))) { - ss << ", "; - } - if (idx + 1 != - static_cast((std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1))) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } + // CurrentClock Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrGfxClock, + format_metric_row(m_gpu_metrics_tbl.m_current_gfxclk, + "[current_gfxclk]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrSocClock, + format_metric_row(m_gpu_metrics_tbl.m_current_socclk, + "[current_socclk]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrVClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_vclk0, + "[current_vclk0]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrDClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_dclk0, + "[current_dclk0]"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrUClock, + format_metric_row(m_gpu_metrics_tbl.m_current_uclk, + "current_uclk"))); - idx = 0; - idy = 0; - ss << " xcp_stats.jpeg_busy: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.jpeg_busy) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != static_cast((std::end(row.jpeg_busy) - std::end(row.jpeg_busy) - 1))) { - ss << ", "; - } - if (idx + 1 != - static_cast((std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1))) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } + /* Accumulation cycle counter */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAccumulationCounter, + format_metric_row(m_gpu_metrics_tbl.m_accumulation_counter, + "accumulation_counter"))); - idx = 0; - idy = 0; - ss << " xcp_stats.gfx_busy_acc: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.gfx_busy_acc) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != static_cast((std::end(row.gfx_busy_acc) - std::end(row.gfx_busy_acc) - 1))) { - ss << ", "; - } - if (idx + 1 != - static_cast((std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1))) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } + /* Accumulated throttler residencies */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricProchotResidencyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_prochot_residency_acc, + "prochot_residency_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPPTResidencyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_ppt_residency_acc, + "ppt_residency_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricSocketThmResidencyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_socket_thm_residency_acc, + "socket_thm_residency_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricVRThmResidencyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_vr_thm_residency_acc, + "vr_thm_residency_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricHBMThmResidencyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_hbm_thm_residency_acc, + "hbm_thm_residency_acc"))); - LOG_DEBUG(ss); -} + /* Partition info */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPartition] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kGpuMetricNumPartition, + format_metric_row(m_gpu_metrics_tbl.m_num_partition, + "num_partition"))); + /* xcp_stats info */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBusyInst, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_busy_inst, + "xcp_stats->gfx_busy_inst"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricVcnBusy, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->vcn_busy, + "xcp_stats->vcn_busy"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricJpegBusy, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->jpeg_busy, + "xcp_stats->jpeg_busy"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBusyAcc, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_busy_acc, + "xcp_stats->gfx_busy_acc"))); -void GpuMetricsBase_v16_t::dump_internal_metrics_table() -{ - std::ostringstream ss; - auto idx = int64_t(0); - auto idy = int64_t(0); - std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; - ss << __PRETTY_FUNCTION__ - << " | ======= DEBUG ======= " - << " | Metric Version: " - << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) - << " | Size: " - << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) - << " |" - << "\n"; - ss << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" - << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" - << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" - << " current_socket_power: " << m_gpu_metrics_tbl.m_current_socket_power << "\n" - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n"; + /* gpu metrics v1.8 xcp_stats info */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitTotalAcc, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_below_host_limit_total_acc, + "xcp_stats->gfx_below_host_limit_total_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitPptAcc, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_below_host_limit_ppt_acc, + "xcp_stats->gfx_below_host_limit_ppt_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitThmAcc, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_below_host_limit_thm_acc, + "xcp_stats->gfx_below_host_limit_thm_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxLowUtilitizationAcc, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_low_utilization_acc, + "xcp_stats->gfx_low_utilization_acc"))); - ss << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" - << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" - << " accumulation_counter: " << m_gpu_metrics_tbl.m_accumulation_counter << "\n" - << " prochot_residency_acc: " << m_gpu_metrics_tbl.m_prochot_residency_acc << "\n" - << " ppt_residency_acc: " << m_gpu_metrics_tbl.m_ppt_residency_acc << "\n" - << " socket_thm_residency_acc: " << m_gpu_metrics_tbl.m_socket_thm_residency_acc << "\n" - << " vr_thm_residency_acc: " << m_gpu_metrics_tbl.m_vr_thm_residency_acc << "\n" - << " hbm_thm_residency_acc: " << m_gpu_metrics_tbl.m_hbm_thm_residency_acc << "\n" - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" - << " gfxclk_lock_status: " << m_gpu_metrics_tbl.m_gfxclk_lock_status << "\n" - << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" - << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" - << " xgmi_link_width: " << m_gpu_metrics_tbl.m_xgmi_link_width << "\n" - << " xgmi_link_speed: " << m_gpu_metrics_tbl.m_xgmi_link_speed << "\n" - << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" - << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n" - << " pcie_bandwidth_acc: " << m_gpu_metrics_tbl.m_pcie_bandwidth_acc << "\n" - << " pcie_bandwidth_inst: " << m_gpu_metrics_tbl.m_pcie_bandwidth_inst << "\n" - << " pcie_l0_to_recov_count_acc: " << m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc << "\n" - << " pcie_replay_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_count_acc << "\n" - << " pcie_replay_rover_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc << "\n" - << " pcie_nak_sent_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_sent_count_acc << "\n" - << " pcie_nak_rcvd_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_rcvd_count_acc << "\n" - << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n" - << " current_uclk: " << m_gpu_metrics_tbl.m_current_uclk << "\n" - << " num_partition: " << m_gpu_metrics_tbl.m_num_partition << "\n" - << " pcie_lc_perf_other_end_recovery: " - << m_gpu_metrics_tbl.m_pcie_lc_perf_other_end_recovery << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_read_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + /* PCIE other end recovery counter info */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLCPerfOtherEndRecov, + format_metric_row(m_gpu_metrics_tbl.m_pcie_lc_perf_other_end_recovery, + "pcie_lc_perf_other_end_recovery"))); - ss << " xgmi_write_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_write_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + /* VRAM max bandwidth (in GB/sec) at max memory clock */ + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricVramMaxBandwidth, + format_metric_row(m_gpu_metrics_tbl.m_mem_max_bandwidth, + "vram_max_bandwidth"))); - ss << " current_gfxclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_gfxclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + ss << __PRETTY_FUNCTION__ << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) << " |"; + LOG_TRACE(ss); - ss << " current_socclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_socclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } + // Copy to base class + std::copy(m_metrics_dynamic_tbl.begin(), m_metrics_dynamic_tbl.end(), + std::inserter(GpuMetricsBase_t::m_base_metrics_dynamic_tbl, + GpuMetricsBase_t::m_base_metrics_dynamic_tbl.end())); - ss << " current_vclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_vclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_dclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_dclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - idx = 0; - idy = 0; - ss << " xcp_stats.gfx_busy_inst: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.gfx_busy_inst) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; -#if 1 // TODO: Refactor this code using make_ostream_joiner - // Do for all occurences in this file - if (idy + 1 != (std::end(row.gfx_busy_inst) - std::end(row.gfx_busy_inst) - 1)) { - ss << ", "; - } -#else - std::copy(std::begin(row.gfx_busy_inst), - std::end(row.gfx_busy_inst), - amd::smi::make_ostream_joiner(&ss, ", ")); -#endif - if (idx + 1 != - (std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1)) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } - - idx = 0; - idy = 0; - ss << " xcp_stats.vcn_busy: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.vcn_busy) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != (std::end(row.vcn_busy) - std::end(row.vcn_busy) - 1)) { - ss << ", "; - } - if (idx + 1 != - (std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1)) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } - - idx = 0; - idy = 0; - ss << " xcp_stats.jpeg_busy: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.jpeg_busy) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != (std::end(row.jpeg_busy) - std::end(row.jpeg_busy) - 1)) { - ss << ", "; - } - if (idx + 1 != - (std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1)) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } - - idx = 0; - idy = 0; - ss << " xcp_stats.gfx_busy_acc: " << "\n"; - for (auto& row : m_gpu_metrics_tbl.m_xcp_stats) { - if (idx == 0) { - ss << "\t [ "; - } - for (auto& col : row.gfx_busy_acc) { - ss << "\t [" << idx << "] [" << idy << "]: " << col; - if (idy + 1 != (std::end(row.gfx_busy_acc) - std::end(row.gfx_busy_acc) - 1)) { - ss << ", "; - } - if (idx + 1 != - (std::end(m_gpu_metrics_tbl.m_xcp_stats) - std::end(m_gpu_metrics_tbl.m_xcp_stats) - 1)) { - ss << "\n"; - } else { - ss << "]\n"; - } - idy++; - } - idx++; - } - - LOG_DEBUG(ss); + return status_code; } rsmi_status_t GpuMetricsBase_v17_t::populate_metrics_dynamic_tbl() { @@ -1089,6 +975,11 @@ rsmi_status_t GpuMetricsBase_v17_t::populate_metrics_dynamic_tbl() { format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_busy_acc, "xcp_stats->gfx_busy_acc"))); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricXcpStats].insert( + std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_below_host_limit_acc, + "xcp_stats->gfx_below_host_limit_acc"))); + /* PCIE other end recovery counter info */ m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLCPerfOtherEndRecov, @@ -1101,12 +992,6 @@ rsmi_status_t GpuMetricsBase_v17_t::populate_metrics_dynamic_tbl() { format_metric_row(m_gpu_metrics_tbl.m_vram_max_bandwidth, "vram_max_bandwidth"))); - /* Total App Clock Counter Accumulated */ - m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleResidency] - .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxBelowHostLimitAccumulator, - format_metric_row(m_gpu_metrics_tbl.m_xcp_stats->gfx_below_host_limit_acc, - "gfx_below_host_limit_acc"))); - ss << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | Success " @@ -1366,114 +1251,6 @@ rsmi_status_t GpuMetricsBase_v16_t::populate_metrics_dynamic_tbl() { return status_code; } -void GpuMetricsBase_v15_t::dump_internal_metrics_table() -{ - std::ostringstream ss; - std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; - ss << __PRETTY_FUNCTION__ - << " | ======= DEBUG ======= " - << " | Metric Version: " << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) - << " | Size: " << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) - << " |" - << "\n"; - ss << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" - << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" - << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" - - << " current_socket_power: " << m_gpu_metrics_tbl.m_current_socket_power << "\n" - - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n"; - - ss << " vcn_activity: " << "\n"; - auto idx = uint64_t(0); - for (const auto& temp : m_gpu_metrics_tbl.m_vcn_activity) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " jpeg_activity: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_jpeg_activity) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" - << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" - - << " throttle_status: " << m_gpu_metrics_tbl.m_throttle_status << "\n" - - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" - - << " gfxclk_lock_status: " << m_gpu_metrics_tbl.m_gfxclk_lock_status << "\n" - - << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" - << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" - - << " xgmi_link_width: " << m_gpu_metrics_tbl.m_xgmi_link_width << "\n" - << " xgmi_link_speed: " << m_gpu_metrics_tbl.m_xgmi_link_speed << "\n" - - << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" - << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n" - - << " pcie_bandwidth_acc: " << m_gpu_metrics_tbl.m_pcie_bandwidth_acc << "\n" - << " pcie_bandwidth_inst: " << m_gpu_metrics_tbl.m_pcie_bandwidth_inst << "\n" - << " pcie_l0_to_recov_count_acc: " << m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc << "\n" - << " pcie_replay_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_count_acc << "\n" - << " pcie_replay_rover_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc << "\n" - << " pcie_nak_sent_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_sent_count_acc << "\n" - << " pcie_nak_rcvd_count_acc: " << m_gpu_metrics_tbl.m_pcie_nak_rcvd_count_acc << "\n"; - - ss << " xgmi_read_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_read_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " xgmi_write_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_write_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n"; - - ss << " current_gfxclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_gfxclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_socclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_socclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_vclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_vclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_dclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_dclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " padding: " << m_gpu_metrics_tbl.m_padding << "\n"; - LOG_DEBUG(ss); -} - rsmi_status_t GpuMetricsBase_v15_t::populate_metrics_dynamic_tbl() { std::ostringstream ss; auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); @@ -1706,106 +1483,6 @@ rsmi_status_t GpuMetricsBase_v15_t::populate_metrics_dynamic_tbl() { return status_code; } - -void GpuMetricsBase_v14_t::dump_internal_metrics_table() -{ - std::ostringstream ss; - std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; - ss << __PRETTY_FUNCTION__ - << " | ======= DEBUG ======= " - << " | Metric Version: " << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) - << " | Size: " << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) - << " |" - << "\n"; - ss << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" - << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" - << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" - - << " current_socket_power: " << m_gpu_metrics_tbl.m_current_socket_power << "\n" - - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n"; - - ss << " vcn_activity: " << "\n"; - auto idx = uint64_t(0); - for (const auto& temp : m_gpu_metrics_tbl.m_vcn_activity) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" - << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" - - << " throttle_status: " << m_gpu_metrics_tbl.m_throttle_status << "\n" - - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" - - << " gfxclk_lock_status: " << m_gpu_metrics_tbl.m_gfxclk_lock_status << "\n" - - << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" - << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" - - << " xgmi_link_width: " << m_gpu_metrics_tbl.m_xgmi_link_width << "\n" - << " xgmi_link_speed: " << m_gpu_metrics_tbl.m_xgmi_link_speed << "\n" - - << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" - << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n" - - << " pcie_bandwidth_acc: " << m_gpu_metrics_tbl.m_pcie_bandwidth_acc << "\n" - << " pcie_bandwidth_inst: " << m_gpu_metrics_tbl.m_pcie_bandwidth_inst << "\n" - << " pcie_l0_to_recov_count_acc: " << m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc << "\n" - << " pcie_replay_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_count_acc << "\n" - << " pcie_replay_rover_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc << "\n"; - - ss << " xgmi_read_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_read_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " xgmi_write_data_acc: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_write_data_acc) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n"; - - ss << " current_gfxclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_gfxclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_socclk: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_socclk) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_vclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_vclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " current_dclk0: " << "\n"; - idx = 0; - for (const auto& temp : m_gpu_metrics_tbl.m_current_dclk0) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " padding: " << m_gpu_metrics_tbl.m_padding << "\n"; - LOG_DEBUG(ss); -} - rsmi_status_t GpuMetricsBase_v14_t::populate_metrics_dynamic_tbl() { std::ostringstream ss; auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); @@ -2147,6 +1824,14 @@ rsmi_status_t init_max_public_gpu_matrics(AMGpuMetricsPublicLatest_t& rsmi_gpu_m init_max_uint_types()); std::fill(std::begin(row.gfx_below_host_limit_acc), std::end(row.gfx_below_host_limit_acc), init_max_uint_types()); + std::fill(std::begin(row.gfx_below_host_limit_ppt_acc), std::end(row.gfx_below_host_limit_ppt_acc), + init_max_uint_types()); + std::fill(std::begin(row.gfx_below_host_limit_thm_acc), std::end(row.gfx_below_host_limit_thm_acc), + init_max_uint_types()); + std::fill(std::begin(row.gfx_low_utilization_acc), std::end(row.gfx_low_utilization_acc), + init_max_uint_types()); + std::fill(std::begin(row.gfx_below_host_limit_total_acc), std::end(row.gfx_below_host_limit_total_acc), + init_max_uint_types()); } ss << __PRETTY_FUNCTION__ @@ -2159,6 +1844,227 @@ rsmi_status_t init_max_public_gpu_matrics(AMGpuMetricsPublicLatest_t& rsmi_gpu_m return status_code; } +AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v18_t::copy_internal_to_external_metrics() +{ + std::ostringstream ss; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ss << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ss); + + auto copy_data_from_internal_metrics_tbl = [&]() + { + AMGpuMetricsPublicLatest_t metrics_public_init{}; + + // + // Note: Initializing data members with their max. If field is max, + // no data was assigned to it. + init_max_public_gpu_matrics(metrics_public_init); + + // Header + metrics_public_init.common_header.structure_size = m_gpu_metrics_tbl.m_common_header.m_structure_size; + metrics_public_init.common_header.format_revision = m_gpu_metrics_tbl.m_common_header.m_format_revision; + metrics_public_init.common_header.content_revision = m_gpu_metrics_tbl.m_common_header.m_content_revision; + + + // Temperature + metrics_public_init.temperature_hotspot = m_gpu_metrics_tbl.m_temperature_hotspot; + metrics_public_init.temperature_mem = m_gpu_metrics_tbl.m_temperature_mem; + metrics_public_init.temperature_vrsoc = m_gpu_metrics_tbl.m_temperature_vrsoc; + + // Power + metrics_public_init.current_socket_power = m_gpu_metrics_tbl.m_current_socket_power; + + // Utilization + metrics_public_init.average_gfx_activity = m_gpu_metrics_tbl.m_average_gfx_activity; + metrics_public_init.average_umc_activity = m_gpu_metrics_tbl.m_average_umc_activity; + + // Power/Energy + metrics_public_init.energy_accumulator = m_gpu_metrics_tbl.m_energy_accumulator; + + // Driver attached timestamp (in ns) + metrics_public_init.system_clock_counter = m_gpu_metrics_tbl.m_system_clock_counter; + + // Clock Lock Status. Each bit corresponds to clock instance + metrics_public_init.gfxclk_lock_status = m_gpu_metrics_tbl.m_gfxclk_lock_status; + + // Link width (number of lanes) and speed + metrics_public_init.pcie_link_width = m_gpu_metrics_tbl.m_pcie_link_width; + metrics_public_init.pcie_link_speed = m_gpu_metrics_tbl.m_pcie_link_speed; + + // XGMI bus width and bitrate + metrics_public_init.xgmi_link_width = m_gpu_metrics_tbl.m_xgmi_link_width; + metrics_public_init.xgmi_link_speed = m_gpu_metrics_tbl.m_xgmi_link_speed; + + // Utilization Accumulated + metrics_public_init.gfx_activity_acc = m_gpu_metrics_tbl.m_gfx_activity_acc; + metrics_public_init.mem_activity_acc = m_gpu_metrics_tbl.m_mem_activity_acc; + + // PCIE accumulated bandwidth + metrics_public_init.pcie_bandwidth_acc = m_gpu_metrics_tbl.m_pcie_bandwidth_acc; + + // PCIE instantaneous bandwidth + metrics_public_init.pcie_bandwidth_inst = m_gpu_metrics_tbl.m_pcie_bandwidth_inst; + + // PCIE L0 to recovery state transition accumulated count + metrics_public_init.pcie_l0_to_recov_count_acc = m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc; + + // PCIE replay accumulated count + metrics_public_init.pcie_replay_count_acc = m_gpu_metrics_tbl.m_pcie_replay_count_acc; + + // PCIE replay rollover accumulated count + metrics_public_init.pcie_replay_rover_count_acc = m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc; + + // PCIE NAK sent accumulated count + metrics_public_init.pcie_nak_sent_count_acc = m_gpu_metrics_tbl.m_pcie_nak_sent_count_acc; + + // PCIE NAK received accumulated count + metrics_public_init.pcie_nak_rcvd_count_acc = m_gpu_metrics_tbl.m_pcie_nak_rcvd_count_acc; + + // Accumulated throttler residencies + // bumped up public to uint64_t due to planned size increase for newer ASICs + metrics_public_init.accumulation_counter = m_gpu_metrics_tbl.m_accumulation_counter; + metrics_public_init.prochot_residency_acc = m_gpu_metrics_tbl.m_prochot_residency_acc; + metrics_public_init.ppt_residency_acc = m_gpu_metrics_tbl.m_ppt_residency_acc; + metrics_public_init.socket_thm_residency_acc = m_gpu_metrics_tbl.m_socket_thm_residency_acc; + metrics_public_init.vr_thm_residency_acc = m_gpu_metrics_tbl.m_vr_thm_residency_acc; + metrics_public_init.hbm_thm_residency_acc = m_gpu_metrics_tbl.m_hbm_thm_residency_acc; + + /* VRAM max bandwidth at max memory clock */ + metrics_public_init.vram_max_bandwidth = m_gpu_metrics_tbl.m_mem_max_bandwidth; + + // XGMI accumulated data transfer size + // xgmi_read_data + const auto xgmi_read_data_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_xgmi_read_data_acc) - + std::begin(m_gpu_metrics_tbl.m_xgmi_read_data_acc)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_xgmi_read_data_acc), + xgmi_read_data_num_elems, + metrics_public_init.xgmi_read_data_acc); + // xgmi_write_data + const auto xgmi_write_data_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_xgmi_write_data_acc) - + std::begin(m_gpu_metrics_tbl.m_xgmi_write_data_acc)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_xgmi_write_data_acc), + xgmi_write_data_num_elems, + metrics_public_init.xgmi_write_data_acc); + + // xgmi_link_status // new for 1.7 + const auto xgmi_link_status_num_elems = static_cast( + std::end(m_gpu_metrics_tbl.m_xgmi_link_status) - + std::begin(m_gpu_metrics_tbl.m_xgmi_link_status)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_xgmi_link_status), + xgmi_link_status_num_elems, + metrics_public_init.xgmi_link_status); + + // PMFW attached timestamp (10ns resolution) + metrics_public_init.firmware_timestamp = m_gpu_metrics_tbl.m_firmware_timestamp; + + // Current clocks + // current_gfxclk + const auto curr_gfxclk_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_gfxclk) - + std::begin(m_gpu_metrics_tbl.m_current_gfxclk)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_gfxclk), + curr_gfxclk_num_elems, + metrics_public_init.current_gfxclks); + + // current_socclk + const auto curr_socclk_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_socclk) - + std::begin(m_gpu_metrics_tbl.m_current_socclk)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_socclk), + curr_socclk_num_elems, + metrics_public_init.current_socclks); + + // current_vclk0 + const auto curr_vclk0_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_vclk0) - + std::begin(m_gpu_metrics_tbl.m_current_vclk0)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_vclk0), + curr_vclk0_num_elems, + metrics_public_init.current_vclk0s); + + // current_dclk0 + const auto curr_dclk0_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_dclk0) - + std::begin(m_gpu_metrics_tbl.m_current_dclk0)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_dclk0), + curr_dclk0_num_elems, + metrics_public_init.current_dclk0s); + + metrics_public_init.current_uclk = m_gpu_metrics_tbl.m_current_uclk; + + metrics_public_init.num_partition = m_gpu_metrics_tbl.m_num_partition; + + metrics_public_init.pcie_lc_perf_other_end_recovery = + m_gpu_metrics_tbl.m_pcie_lc_perf_other_end_recovery; + + // xcp stats + auto priv_it = std::begin(m_gpu_metrics_tbl.m_xcp_stats); + for (auto pub_it = std::begin(metrics_public_init.xcp_stats); + pub_it != std::end(metrics_public_init.xcp_stats); ++pub_it, ++priv_it) { + std::copy_n(std::begin(priv_it->gfx_busy_inst), RSMI_MAX_NUM_XCC, pub_it->gfx_busy_inst); + std::copy_n(std::begin(priv_it->jpeg_busy), RSMI_MAX_NUM_JPEG_ENG_V1, pub_it->jpeg_busy); + std::copy_n(std::begin(priv_it->vcn_busy), RSMI_MAX_NUM_VCNS, pub_it->vcn_busy); + std::copy_n(std::begin(priv_it->gfx_busy_acc), RSMI_MAX_NUM_XCC, pub_it->gfx_busy_acc); + std::copy_n(std::begin(priv_it->gfx_below_host_limit_ppt_acc), RSMI_MAX_NUM_XCC, + pub_it->gfx_below_host_limit_ppt_acc); + std::copy_n(std::begin(priv_it->gfx_below_host_limit_thm_acc), RSMI_MAX_NUM_XCC, + pub_it->gfx_below_host_limit_thm_acc); + std::copy_n(std::begin(priv_it->gfx_low_utilization_acc), RSMI_MAX_NUM_XCC, + pub_it->gfx_low_utilization_acc); + std::copy_n(std::begin(priv_it->gfx_below_host_limit_total_acc), RSMI_MAX_NUM_XCC, + pub_it->gfx_below_host_limit_total_acc); + } + + // + // Note: Backwards compatibility -> Handling extra/exception cases + // related to earlier versions (1.3/1.4/1.5) + metrics_public_init.current_gfxclk = metrics_public_init.current_gfxclks[0]; + + metrics_public_init.current_socclk = metrics_public_init.current_socclks[0]; + + metrics_public_init.current_vclk0 = metrics_public_init.current_vclk0s[0]; + + metrics_public_init.current_vclk1 = metrics_public_init.current_vclk0s[1]; + + metrics_public_init.current_dclk0 = metrics_public_init.current_dclk0s[0]; + + metrics_public_init.current_dclk1 = metrics_public_init.current_dclk0s[1]; + + // separate by XCP + if (this->m_partition_id < kRSMI_MAX_NUM_XCP + && m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].vcn_busy[0] != UINT16_MAX) { + std::copy(std::begin(m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].vcn_busy), + std::end(m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].vcn_busy), + std::begin(metrics_public_init.vcn_activity)); + } + if (this->m_partition_id < kRSMI_MAX_NUM_XCP + && m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].jpeg_busy[0] != UINT16_MAX) { + std::copy(std::begin(m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].jpeg_busy), + std::end(m_gpu_metrics_tbl.m_xcp_stats[this->m_partition_id].jpeg_busy), + std::begin(metrics_public_init.jpeg_activity)); + } + + return metrics_public_init; + }(); + + ss << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ss); + + return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); +}; + AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v17_t::copy_internal_to_external_metrics() { std::ostringstream ss; @@ -2948,77 +2854,6 @@ AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v14_t::copy_internal_to_external_m return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); } -void GpuMetricsBase_v13_t::dump_internal_metrics_table() -{ - std::ostringstream ss; - std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; - ss << __PRETTY_FUNCTION__ - << " | ======= DEBUG ======= " - << " | Metric Version: " << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) - << " | Size: " << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) - << " |" - << "\n"; - ss << " temperature_edge: " << m_gpu_metrics_tbl.m_temperature_edge << "\n" - << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" - << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" - << " temperature_vrgfx: " << m_gpu_metrics_tbl.m_temperature_vrgfx << "\n" - << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" - << " temperature_vrmem: " << m_gpu_metrics_tbl.m_temperature_vrmem << "\n" - - << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" - << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" - << " average_mm_activity: " << m_gpu_metrics_tbl.m_average_mm_activity << "\n" - << " average_socket_power: " << m_gpu_metrics_tbl.m_average_socket_power << "\n" - - << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" - << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" - - << " average_gfxclk_frequency: " << m_gpu_metrics_tbl.m_average_gfxclk_frequency << "\n" - << " average_socclk_frequency: " << m_gpu_metrics_tbl.m_average_socclk_frequency << "\n" - << " average_uclk_frequency: " << m_gpu_metrics_tbl.m_average_uclk_frequency << "\n" - << " average_vclk0_frequency: " << m_gpu_metrics_tbl.m_average_vclk0_frequency << "\n" - << " average_dclk0_frequency: " << m_gpu_metrics_tbl.m_average_dclk0_frequency << "\n" - << " average_vclk1_frequency: " << m_gpu_metrics_tbl.m_average_vclk1_frequency << "\n" - << " average_dclk1_frequency: " << m_gpu_metrics_tbl.m_average_dclk1_frequency << "\n" - - << " current_gfxclk: " << m_gpu_metrics_tbl.m_current_gfxclk << "\n" - << " current_socclk: " << m_gpu_metrics_tbl.m_current_socclk << "\n" - << " current_uclk: " << m_gpu_metrics_tbl.m_current_uclk << "\n" - << " current_vclk0: " << m_gpu_metrics_tbl.m_current_vclk0 << "\n" - << " current_dclk0: " << m_gpu_metrics_tbl.m_current_dclk0 << "\n" - << " current_vclk1: " << m_gpu_metrics_tbl.m_current_vclk1 << "\n" - << " current_dclk1: " << m_gpu_metrics_tbl.m_current_dclk1 << "\n" - - << " throttle_status: " << m_gpu_metrics_tbl.m_throttle_status << "\n" - - << " current_fan_speed: " << m_gpu_metrics_tbl.m_current_fan_speed << "\n" - - << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" - << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" - - << " padding: " << m_gpu_metrics_tbl.m_padding << "\n" - - << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" - << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n"; - LOG_DEBUG(ss); - - ss << " temperature_hbm: " << "\n"; - auto idx = uint64_t(0); - for (const auto& temp : m_gpu_metrics_tbl.m_temperature_hbm) { - ss << "\t [" << idx << "]: " << temp << "\n"; - ++idx; - } - - ss << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n" - - << " voltage_soc: " << m_gpu_metrics_tbl.m_voltage_soc << "\n" - << " voltage_gfx: " << m_gpu_metrics_tbl.m_voltage_gfx << "\n" - << " voltage_mem: " << m_gpu_metrics_tbl.m_voltage_mem << "\n" - - << " padding1: " << m_gpu_metrics_tbl.m_padding1 << "\n" - << " m_indep_throttle_status: " << m_gpu_metrics_tbl.m_indep_throttle_status << "\n"; - LOG_DEBUG(ss); -} rsmi_status_t GpuMetricsBase_v13_t::populate_metrics_dynamic_tbl() { std::ostringstream ss; diff --git a/projects/amdsmi/tests/amd_smi_test/functional/gpu_metrics_read.cc b/projects/amdsmi/tests/amd_smi_test/functional/gpu_metrics_read.cc index 154b79a554..157c216fcc 100644 --- a/projects/amdsmi/tests/amd_smi_test/functional/gpu_metrics_read.cc +++ b/projects/amdsmi/tests/amd_smi_test/functional/gpu_metrics_read.cc @@ -358,6 +358,50 @@ void TestGpuMetricsRead::Run(void) { std::cout << " ]\n"; xcp++; } + // new for gpu metrics v1.8 + xcp = 0; + std::cout << std::dec << "xcp_stats.gfx_below_host_limit_ppt_acc = \n"; + for (auto& row : smu.xcp_stats) { + std::cout << "XCP[" << xcp << "] = " << "[ "; + std::copy(std::begin(row.gfx_below_host_limit_ppt_acc), + std::end(row.gfx_below_host_limit_ppt_acc), + amd::smi::make_ostream_joiner(&std::cout, ", ")); + std::cout << " ]\n"; + xcp++; + } + + xcp = 0; + std::cout << std::dec << "xcp_stats.gfx_below_host_limit_thm_acc = \n"; + for (auto& row : smu.xcp_stats) { + std::cout << "XCP[" << xcp << "] = " << "[ "; + std::copy(std::begin(row.gfx_below_host_limit_thm_acc), + std::end(row.gfx_below_host_limit_thm_acc), + amd::smi::make_ostream_joiner(&std::cout, ", ")); + std::cout << " ]\n"; + xcp++; + } + + xcp = 0; + std::cout << std::dec << "xcp_stats.gfx_low_utilization_acc = \n"; + for (auto& row : smu.xcp_stats) { + std::cout << "XCP[" << xcp << "] = " << "[ "; + std::copy(std::begin(row.gfx_low_utilization_acc), + std::end(row.gfx_low_utilization_acc), + amd::smi::make_ostream_joiner(&std::cout, ", ")); + std::cout << " ]\n"; + xcp++; + } + + xcp = 0; + std::cout << std::dec << "xcp_stats.gfx_below_host_limit_total_acc = \n"; + for (auto& row : smu.xcp_stats) { + std::cout << "XCP[" << xcp << "] = " << "[ "; + std::copy(std::begin(row.gfx_below_host_limit_total_acc), + std::end(row.gfx_below_host_limit_total_acc), + amd::smi::make_ostream_joiner(&std::cout, ", ")); + std::cout << " ]\n"; + xcp++; + } std::cout << "\n\n"; std::cout << "\t ** -> Checking metrics with constant changes ** " << "\n";