Enable RDC link Status feature

1.add link status APIs
   2.Add link status example for link status API usage
This commit is contained in:
stali
2024-12-17 14:29:05 +08:00
committed by Li, Star
parent f4de4b0529
commit 29b6699b62
15 changed files with 315 additions and 22 deletions
+42
View File
@@ -25,6 +25,7 @@ THE SOFTWARE.
#include <sys/time.h>
#include <unistd.h>
#include <assert.h>
#include <algorithm>
#include <ctime>
#include <map>
@@ -75,6 +76,7 @@ rdc_status_t RdcTopologyLinkImpl::rdc_device_topology_get(uint32_t gpu_index,
// Assign the index to the index list
count = device_count.value.l_int;
assert(count <= RDC_MAX_NUM_DEVICES);
for (uint32_t i = 0; i < count; i++) {
gpu_index_list[i] = i;
}
@@ -134,6 +136,46 @@ rdc_status_t RdcTopologyLinkImpl::rdc_device_topology_get(uint32_t gpu_index,
rdc_status_t RdcTopologyLinkImpl::rdc_link_status_get(rdc_link_status_t* results) {
rdc_status_t status = RDC_ST_NOT_FOUND;
amdsmi_status_t err = AMDSMI_STATUS_SUCCESS;
uint32_t gpu_index_list[RDC_MAX_NUM_DEVICES];
uint32_t count = 0;
rdc_field_value device_count;
status = metric_fetcher_->fetch_smi_field(0, RDC_FI_GPU_COUNT, &device_count);
if (status != RDC_ST_OK) {
return status;
}
// Assign the index to the index list
count = device_count.value.l_int;
assert(count <= RDC_MAX_NUM_DEVICES);
for (uint32_t i = 0; i < count; i++) {
gpu_index_list[i] = i;
}
results->num_of_gpus = count;
for (uint32_t i = 0; i < count; i++) {
amdsmi_processor_handle processor_handle;
err = get_processor_handle_from_id(gpu_index_list[i], &processor_handle);
if (err != AMDSMI_STATUS_SUCCESS) {
RDC_LOG(RDC_INFO, "Fail to get process GPUs processor handle information: " << err);
return status;
}
amdsmi_xgmi_link_status_t link_status;
err = amdsmi_get_gpu_xgmi_link_status(processor_handle, &link_status);
if (err != AMDSMI_STATUS_SUCCESS) {
RDC_LOG(RDC_INFO, "Fail to get process GPUs xgmi link information: " << err);
}
results->gpus[i].gpu_index = gpu_index_list[i];
results->gpus[i].num_of_links = link_status.total_links;
for (uint32_t n = 0; n < link_status.total_links; n++) {
results->gpus[i].link_states[n] = static_cast<rdc_link_state_t>(link_status.status[n]);
}
results->gpus[i].link_types = RDC_IOLINK_TYPE_XGMI;
}
return status;
}
+32 -13
View File
@@ -1027,27 +1027,46 @@ rdc_status_t RdcStandaloneHandler::rdc_device_topology_get(uint32_t gpu_index,
if (err_status != RDC_ST_OK) return err_status;
::rdc::Topology Topology = reply.toppology();
results->num_of_gpus= Topology.num_of_gpus();
results->numa_node= Topology.numa_node();
results->num_of_gpus = Topology.num_of_gpus();
results->numa_node = Topology.numa_node();
for (uint32_t i = 0; i < Topology.num_of_gpus(); ++i) {
::rdc::TopologyLinkInfo linkinfo = Topology.link_infos(i);
results->link_infos[i].gpu_index=linkinfo.gpu_index();
results->link_infos[i].weight=linkinfo.weight();
results->link_infos[i].min_bandwidth=linkinfo.min_bandwidth();
results->link_infos[i].max_bandwidth=linkinfo.max_bandwidth();
results->link_infos[i].hops=linkinfo.hops();
results->link_infos[i].link_type=static_cast<rdc_topology_link_type_t>(linkinfo.link_type());
results->link_infos[i].is_p2p_accessible=linkinfo.p2p_accessible();
::rdc::TopologyLinkInfo linkinfo = Topology.link_infos(i);
results->link_infos[i].gpu_index = linkinfo.gpu_index();
results->link_infos[i].weight = linkinfo.weight();
results->link_infos[i].min_bandwidth = linkinfo.min_bandwidth();
results->link_infos[i].max_bandwidth = linkinfo.max_bandwidth();
results->link_infos[i].hops = linkinfo.hops();
results->link_infos[i].link_type = static_cast<rdc_topology_link_type_t>(linkinfo.link_type());
results->link_infos[i].is_p2p_accessible = linkinfo.p2p_accessible();
}
return RDC_ST_OK;
}
rdc_status_t RdcStandaloneHandler::rdc_link_status_get(rdc_link_status_t* results) {
::rdc::UpdateAllFieldsResponse reply;
::grpc::Status status = grpc::Status::OK;
return error_handle(status, reply.status());
::rdc::Empty request;
::rdc::GetLinkStatusResponse reply;
::grpc::ClientContext context;
::grpc::Status status = stub_->GetLinkStatus(&context, request, &reply);
rdc_status_t err_status = error_handle(status, reply.status());
if (err_status != RDC_ST_OK) return err_status;
::rdc::LinkStatus LinkStatus = reply.linkstatus();
results->num_of_gpus = LinkStatus.num_of_gpus();
for (uint32_t i = 0; i < LinkStatus.num_of_gpus(); ++i) {
::rdc::GpuLinkStatus gpulinkstatus = LinkStatus.gpus(i);
results->gpus[i].gpu_index = gpulinkstatus.gpu_index();
results->gpus[i].num_of_links = gpulinkstatus.num_of_links();
results->gpus[i].link_types = static_cast<rdc_topology_link_type_t>(gpulinkstatus.link_types());
for (uint32_t n = 0; n < gpulinkstatus.num_of_links(); n++) {
results->gpus[i].link_states[n] = static_cast<rdc_link_state_t>(gpulinkstatus.link_states(n));
}
}
return RDC_ST_OK;
}
} // namespace rdc