SWDEV-463401: amdsmi_get_gpu_asic_info() adds num_of_compute_units

number of compute units `amdgpu_gpu_info.num_of_compute_units` is exposed through amdsmi_get_gpu_asic_info().

Code changes related to the following:
  * API
  * CLI
  * Unit tests
  * Examples

Change-Id: Ibeb612d079ed87437a0e56124b8504098fc2dcfd
Signed-off-by: Oliveira, Daniel <daniel.oliveira@amd.com>


[ROCm/amdsmi commit: b05849dad0]
Этот коммит содержится в:
Oliveira, Daniel
2024-08-05 20:49:53 -05:00
коммит произвёл Daniel Oliveira
родитель e2e63055a6
Коммит 55b88706e1
11 изменённых файлов: 77 добавлений и 7 удалений
+2 -1
Просмотреть файл
@@ -301,7 +301,8 @@ int main() {
printf("\tDeviceID: 0x%lx\n", asic_info.device_id);
printf("\tVendorID: 0x%x\n", asic_info.vendor_id);
printf("\tRevisionID: 0x%x\n", asic_info.rev_id);
printf("\tAsic serial: 0x%s\n\n", asic_info.asic_serial);
printf("\tAsic serial: 0x%s\n", asic_info.asic_serial);
printf("\tNum of Computes: %d\n\n", asic_info.num_of_compute_units);
// Get VRAM info
amdsmi_vram_info_t vram_info = {};
+2 -1
Просмотреть файл
@@ -151,7 +151,8 @@ int main() {
printf("\tVendorID: 0x%x\n", asic_info.vendor_id);
printf("\tRevisionID: 0x%x\n", asic_info.rev_id);
printf("\tAsic serial: 0x%s\n", asic_info.asic_serial);
printf("\tOAM id: 0x%x\n\n", asic_info.oam_id);
printf("\tOAM id: 0x%x\n", asic_info.oam_id);
printf("\tNum of Computes: %d\n\n", asic_info.num_of_compute_units);
// Get VBIOS info
amdsmi_vbios_info_t vbios_info = {};
+2 -1
Просмотреть файл
@@ -588,7 +588,8 @@ typedef struct {
uint32_t rev_id;
char asic_serial[AMDSMI_NORMAL_STRING_LENGTH];
uint32_t oam_id; //< 0xFFFF if not supported
uint32_t reserved[18];
uint32_t num_of_compute_units; //< 0xFFFFFFFF if not supported
uint32_t reserved[17];
} amdsmi_asic_info_t;
typedef enum {
+6 -1
Просмотреть файл
@@ -1643,7 +1643,8 @@ def amdsmi_get_gpu_asic_info(
"device_id": asic_info_struct.device_id,
"rev_id": _padHexValue(hex(asic_info_struct.rev_id), 2),
"asic_serial": asic_info_struct.asic_serial.decode("utf-8"),
"oam_id": asic_info_struct.oam_id
"oam_id": asic_info_struct.oam_id,
"num_compute_units": asic_info_struct.num_of_compute_units
}
string_values = ["market_name", "vendor_name"]
@@ -1670,6 +1671,10 @@ def amdsmi_get_gpu_asic_info(
if asic_info["oam_id"] == 0xFFFF: # uint 16 max
asic_info["oam_id"] = "N/A"
# Check for max value as a sign for not applicable
if asic_info["num_compute_units"] == 0xFFFFFFFF: # uint 32 max
asic_info["num_compute_units"] = "N/A"
# Remove commas from vendor name for clean output
asic_info["vendor_name"] = asic_info["vendor_name"].replace(',', '')
+2 -1
Просмотреть файл
@@ -901,7 +901,8 @@ struct_amdsmi_asic_info_t._fields_ = [
('rev_id', ctypes.c_uint32),
('asic_serial', ctypes.c_char * 32),
('oam_id', ctypes.c_uint32),
('reserved', ctypes.c_uint32 * 18),
('num_of_compute_units', ctypes.c_uint32),
('reserved', ctypes.c_uint32 * 17),
]
amdsmi_asic_info_t = struct_amdsmi_asic_info_t
+4
Просмотреть файл
@@ -90,6 +90,10 @@ class KFDNode {
// Get gfx target version from kfd
int get_gfx_target_version(uint64_t* gfx_target_version);
// Get simd_per_cu from kfd
int32_t get_simd_per_cu(uint64_t* simd_per_cu) const;
int32_t get_simd_count(uint64_t* simd_count) const;
private:
uint32_t node_indx_;
uint32_t amdgpu_dev_index_;
+2 -2
Просмотреть файл
@@ -126,8 +126,8 @@ std::string print_rsmi_od_volt_freq_data_t(rsmi_od_volt_freq_data_t *odv);
std::string print_rsmi_od_volt_freq_regions(uint32_t num_regions,
rsmi_freq_volt_region_t *regions);
bool is_sudo_user();
rsmi_status_t rsmi_get_gfx_target_version(uint32_t dv_ind,
std::string *gfx_version);
rsmi_status_t rsmi_get_gfx_target_version(uint32_t dv_ind, std::string *gfx_version);
rsmi_status_t rsmi_dev_number_of_computes_get(uint32_t dv_ind, uint32_t* num_computes);
std::string leftTrim(const std::string &s);
std::string rightTrim(const std::string &s);
+27
Просмотреть файл
@@ -1077,5 +1077,32 @@ int KFDNode::get_gfx_target_version(uint64_t *gfx_target_version) {
return ret;
}
int32_t KFDNode::get_simd_per_cu(uint64_t* simd_per_cu) const
{
const std::string properties_path("/sys/class/kfd/kfd/topology/nodes/" +
std::to_string(this->node_indx_) +
"/properties");
auto tmp_simd_per_cu = uint64_t(0);
auto ret = read_node_properties(this->node_indx_, "simd_per_cu",
&tmp_simd_per_cu);
*simd_per_cu = tmp_simd_per_cu;
return ret;
}
int32_t KFDNode::get_simd_count(uint64_t* simd_count) const
{
const std::string properties_path("/sys/class/kfd/kfd/topology/nodes/" +
std::to_string(this->node_indx_) +
"/properties");
auto tmp_simd_count = uint64_t(0);
auto ret = read_node_properties(this->node_indx_, "simd_count",
&tmp_simd_count);
*simd_count = tmp_simd_count;
return ret;
}
} // namespace smi
} // namespace amd
+20
Просмотреть файл
@@ -65,6 +65,7 @@
#include <vector>
#include "rocm_smi/rocm_smi.h"
#include "rocm_smi/rocm_smi_kfd.h"
#include "rocm_smi/rocm_smi_utils.h"
#include "rocm_smi/rocm_smi_exception.h"
#include "rocm_smi/rocm_smi_main.h"
@@ -1198,6 +1199,25 @@ rsmi_status_t rsmi_get_gfx_target_version(uint32_t dv_ind,
}
}
rsmi_status_t rsmi_dev_number_of_computes_get(uint32_t dv_ind, uint32_t* num_computes)
{
GET_DEV_AND_KFDNODE_FROM_INDX
auto tmp_simd_per_cu = uint64_t(0);
auto tmp_simd_count = uint64_t(0);
auto ret_simd_per_cu = kfd_node->get_simd_per_cu(&tmp_simd_per_cu);
auto ret_simd_count = kfd_node->get_simd_count(&tmp_simd_count);
if (((ret_simd_per_cu != 0) || (ret_simd_count != 0)) ||
((tmp_simd_per_cu == 0) || (tmp_simd_count == 0))) {
return rsmi_status_t::RSMI_STATUS_NOT_SUPPORTED;
}
*num_computes = (tmp_simd_count / tmp_simd_per_cu);
return rsmi_status_t::RSMI_STATUS_SUCCESS;
}
std::queue<std::string> getAllDeviceGfxVers() {
uint32_t num_monitor_devs = 0;
rsmi_status_t ret;
+9
Просмотреть файл
@@ -757,6 +757,15 @@ amdsmi_get_gpu_asic_info(amdsmi_processor_handle processor_handle, amdsmi_asic_i
&(tmp_oam_id));
info->oam_id = tmp_oam_id;
// default to 0xffffffff as not supported
info->num_of_compute_units = std::numeric_limits<uint32_t>::max();
auto tmp_num_of_compute_units = uint32_t(0);
status = rsmi_wrapper(amd::smi::rsmi_dev_number_of_computes_get, processor_handle,
&tmp_num_of_compute_units);
if (status == amdsmi_status_t::AMDSMI_STATUS_SUCCESS) {
info->num_of_compute_units = tmp_num_of_compute_units;
}
return AMDSMI_STATUS_SUCCESS;
}
+1
Просмотреть файл
@@ -615,3 +615,4 @@ amdsmi_status_t smi_amdgpu_is_gpu_power_management_enabled(amd::smi::AMDSmiGPUDe
*enabled = false;
return AMDSMI_STATUS_SUCCESS;
}