[SWDEV-498711] RDC Partition Implementation (#119)
* [SWDEV-498711] RDC Partition Implementation Change-Id: Ibfc3709793770537e4c9d36458f34c6b4f461724 Signed-off-by: adapryor <Adam.pryor@amd.com>
Bu işleme şunda yer alıyor:
@@ -129,6 +129,11 @@ typedef enum { INTEGER = 0, DOUBLE, STRING, BLOB } rdc_field_type_t;
|
||||
*/
|
||||
#define RDC_MAX_NUM_DEVICES 128
|
||||
|
||||
/**
|
||||
* @brief Max number of partitions
|
||||
*/
|
||||
#define RDC_MAX_NUM_PARTITIONS 8
|
||||
|
||||
/**
|
||||
* @brief The max fields in a field group
|
||||
*/
|
||||
@@ -1617,6 +1622,139 @@ rdc_status_t rdc_config_clear(rdc_handle_t p_rdc_handle, rdc_gpu_group_t group_i
|
||||
|
||||
const char* get_rocm_path(const char* search_string);
|
||||
|
||||
/**
|
||||
* @brief The device role
|
||||
*/
|
||||
typedef enum {
|
||||
RDC_DEVICE_ROLE_PHYSICAL,
|
||||
RDC_DEVICE_ROLE_PARTITION_INSTANCE //!< The partition instance
|
||||
} rdc_device_role_t;
|
||||
|
||||
/**
|
||||
* @brief The device type
|
||||
*/
|
||||
typedef enum { RDC_DEVICE_TYPE_GPU, RDC_DEVICE_TYPE_CPU } rdc_device_type_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t device_index; //!< Physical device index
|
||||
uint32_t instance_index; //!< Instance or core index
|
||||
rdc_device_role_t entity_role; //!< Physical device or partition instance
|
||||
rdc_device_type_t device_type; //!< Type
|
||||
} rdc_entity_info_t;
|
||||
|
||||
/**
|
||||
* @brief The function to decode the entity info from entity index
|
||||
* @details
|
||||
* | 31 30 29| 28 27 | 21 20 19 ... 12 11 | 10 9 8 7 6 5 4 3 2 1 0 |
|
||||
* |---------|-------|--------------------|---------------------------|
|
||||
* | Type | Role | Instance | Device |
|
||||
* |---------|-------|--------------------|---------------------------|
|
||||
* the 32 bit entity index is crafted based on above structure, this function
|
||||
* will decode them into a data structure
|
||||
*
|
||||
* @param[in] entity_index The entity index.
|
||||
*
|
||||
* @retval rdc_entity_info_t is returned for decode structure
|
||||
*/
|
||||
|
||||
rdc_entity_info_t rdc_get_info_from_entity_index(uint32_t entity_index);
|
||||
|
||||
/**
|
||||
* @brief The function to encode the entity info to entity index
|
||||
* @details
|
||||
* | 31 30 29| 28 27 | 21 20 19 ... 12 11 | 10 9 8 7 6 5 4 3 2 1 0 |
|
||||
* |---------|-------|--------------------|---------------------------|
|
||||
* | Type | Role | Instance | Device |
|
||||
* |---------|-------|--------------------|---------------------------|
|
||||
* the 32 bit entity index is crafted based on above structure, this function
|
||||
* will encode them to index
|
||||
*
|
||||
* @param[in] info The entity info to encode.
|
||||
*
|
||||
* @retval entity_index is returned
|
||||
*/
|
||||
uint32_t rdc_get_entity_index_from_info(rdc_entity_info_t info);
|
||||
|
||||
// map from amdsmi_accelerator_partition_resource_type_t
|
||||
typedef enum {
|
||||
RDC_ACCELERATOR_XCC = 0,
|
||||
RDC_ACCELERATOR_ENCODER,
|
||||
RDC_ACCELERATOR_DECODER,
|
||||
RDC_ACCELERATOR_DMA,
|
||||
RDC_ACCELERATOR_JPEG,
|
||||
RDC_ACCELERATOR_RESOURCE_MAX,
|
||||
RDC_ACCELERATOR_LAST = RDC_ACCELERATOR_RESOURCE_MAX
|
||||
} rdc_instance_resource_type_t;
|
||||
|
||||
// map from amdsmi_accelerator_partition_resource_profile_t
|
||||
typedef struct {
|
||||
rdc_instance_resource_type_t resource_type;
|
||||
uint32_t partition_resource; // The resources a partition can be used, which may be shared
|
||||
uint32_t num_partitions_share_resource; // If it is greater than 1, then resource is shared.
|
||||
} rdc_resource_profile_t;
|
||||
|
||||
/**
|
||||
* @brief Query the resource allocation for a device/instance
|
||||
*
|
||||
* @details The profile contains detail information how resource is allocated.
|
||||
*
|
||||
* As an example, MI300X has 8 XCCs and 4 Decoders, in DPX mode, the physical device is
|
||||
* partitioned to 2 instances, so each instance will have 4 XCC and 2 Decoder and they are
|
||||
* not shared.
|
||||
* [XCC, 4, 0], [DECODER, 2, 0]
|
||||
*
|
||||
* If it is CPX mode, the physical device is partitioned to 8 instances, and each instance
|
||||
* have 1 XCC and 2 instances are sharing the same decoder.
|
||||
* [XCC, 1, 0], [DECODER, 1, 1]
|
||||
*
|
||||
* If entity_index is the physical device, it should return all resources of the device:
|
||||
* [XCC, 8, 0], [DECODER, 4, 0]
|
||||
*
|
||||
* @param[in] p_rdc_handle The RDC handler.
|
||||
*
|
||||
* @param[in] entity_index The GPU index to query. It can be physical device or instance.
|
||||
*
|
||||
* @param[in] resource_type Which resource type to query
|
||||
*
|
||||
* @param[out] profile The details how the resource is allocated.
|
||||
*
|
||||
* @retval ::RDC_ST_OK is returned upon successful call.
|
||||
*/
|
||||
rdc_status_t rdc_instance_profile_get(rdc_handle_t p_rdc_handle, uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile);
|
||||
|
||||
/**
|
||||
* @brief Get the number of partitions for the specified GPU index.
|
||||
*
|
||||
* @param[in] p_rdc_handle The RDC handler.
|
||||
* @param[in] index The GPU index to query.
|
||||
* @param[out] num_partition Pointer to a variable to receive the number of partitions.
|
||||
*
|
||||
* @retval ::RDC_ST_OK on success.
|
||||
*/
|
||||
rdc_status_t rdc_get_num_partition(rdc_handle_t p_rdc_handle, uint32_t index,
|
||||
uint16_t* num_partition);
|
||||
|
||||
/**
|
||||
* @brief Check if gpuid is partition string
|
||||
*
|
||||
* @param[in] s - singular partition string
|
||||
* @retval bool - if partition string or not
|
||||
*/
|
||||
bool rdc_is_partition_string(const char* s);
|
||||
|
||||
/**
|
||||
* @brief Parse partition id into physical gpu and partition
|
||||
*
|
||||
* @param[in] s - singular partition string
|
||||
* @param[out] physicalGpu - socket id
|
||||
* @param[out] partition - partition id
|
||||
*
|
||||
* @retval bool - success
|
||||
*/
|
||||
bool rdc_parse_partition_string(const char* s, uint32_t* physicalGpu, uint32_t* partition);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
Copyright (c) 2025 - present Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
#ifndef INCLUDE_RDC_LIB_RDCENTITYCODEC_H_
|
||||
#define INCLUDE_RDC_LIB_RDCENTITYCODEC_H_
|
||||
|
||||
#include "rdc/rdc.h"
|
||||
|
||||
/*
|
||||
*
|
||||
* See rdc.h for description of entity_index
|
||||
* Shifts and masks help get only the bits in question to decode/encode
|
||||
*
|
||||
* Ex, RDC_ENTITY_TYPE_SHIFT = 29 helps shift the 29 irrelevant bits, so we're
|
||||
* only left with the top 3 type bits.
|
||||
* Then, the corresponding 3 type bits are anded with the RDC_ENTITY_TYPE_MASK = 0x7
|
||||
* which = 111 in binary, "copying" the type bits.
|
||||
*
|
||||
*
|
||||
*/
|
||||
static constexpr uint32_t RDC_ENTITY_TYPE_SHIFT = 29;
|
||||
static constexpr uint32_t RDC_ENTITY_ROLE_SHIFT = 27;
|
||||
static constexpr uint32_t RDC_ENTITY_INSTANCE_SHIFT = 11;
|
||||
static constexpr uint32_t RDC_ENTITY_DEVICE_SHIFT = 0;
|
||||
|
||||
static constexpr uint32_t RDC_ENTITY_TYPE_MASK = 0x7; // 3 bits for type.
|
||||
static constexpr uint32_t RDC_ENTITY_ROLE_MASK = 0x3; // 2 bits for role.
|
||||
static constexpr uint32_t RDC_ENTITY_INSTANCE_MASK = 0x3FF; // 10 bits for instance.
|
||||
static constexpr uint32_t RDC_ENTITY_DEVICE_MASK = 0x3FF; // 10 bits for device.
|
||||
|
||||
rdc_entity_info_t rdc_get_info_from_entity_index(uint32_t entity_index);
|
||||
uint32_t rdc_get_entity_index_from_info(rdc_entity_info_t info);
|
||||
bool rdc_is_partition_string(const char* s);
|
||||
bool rdc_parse_partition_string(const char* s, uint32_t* physicalGpu, uint32_t* partition);
|
||||
|
||||
#endif // INCLUDE_RDC_LIB_RDCENTITYCODEC_H_
|
||||
@@ -116,7 +116,7 @@ class RdcHandler {
|
||||
virtual rdc_status_t rdc_health_check(rdc_gpu_group_t group_id,
|
||||
rdc_health_response_t* response) = 0;
|
||||
virtual rdc_status_t rdc_health_clear(rdc_gpu_group_t group_id) = 0;
|
||||
// topology API
|
||||
// topology API
|
||||
virtual rdc_status_t rdc_device_topology_get(uint32_t gpu_index,
|
||||
rdc_device_topology_t* results) = 0;
|
||||
virtual rdc_status_t rdc_link_status_get(rdc_link_status_t* results) = 0;
|
||||
@@ -131,6 +131,12 @@ class RdcHandler {
|
||||
// Clear the setting
|
||||
virtual rdc_status_t rdc_config_clear(rdc_gpu_group_t group_id) = 0;
|
||||
|
||||
virtual rdc_status_t rdc_get_num_partition(uint32_t index, uint16_t* num_partition) = 0;
|
||||
|
||||
virtual rdc_status_t rdc_instance_profile_get(uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile) = 0;
|
||||
|
||||
virtual ~RdcHandler() {}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Copyright (c) 2025 - present Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
#ifndef INCLUDE_RDC_LIB_RDCPARTITION_H_
|
||||
#define INCLUDE_RDC_LIB_RDCPARTITION_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "rdc/rdc.h"
|
||||
|
||||
namespace amd {
|
||||
namespace rdc {
|
||||
|
||||
class RdcPartition {
|
||||
public:
|
||||
virtual rdc_status_t rdc_instance_profile_get_impl(uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile) = 0;
|
||||
|
||||
virtual rdc_status_t rdc_get_num_partition_impl(uint32_t index, uint16_t* num_partition) = 0;
|
||||
|
||||
virtual ~RdcPartition() {}
|
||||
};
|
||||
typedef std::shared_ptr<RdcPartition> RdcPartitionPtr;
|
||||
|
||||
} // namespace rdc
|
||||
} // namespace amd
|
||||
|
||||
#endif // INCLUDE_RDC_LIB_RDCPARTITION_H_
|
||||
@@ -32,6 +32,7 @@ THE SOFTWARE.
|
||||
#include "rdc_lib/RdcMetricsUpdater.h"
|
||||
#include "rdc_lib/RdcModuleMgr.h"
|
||||
#include "rdc_lib/RdcNotification.h"
|
||||
#include "rdc_lib/RdcPartition.h"
|
||||
#include "rdc_lib/RdcPolicy.h"
|
||||
#include "rdc_lib/RdcTopologyLink.h"
|
||||
#include "rdc_lib/RdcWatchTable.h"
|
||||
@@ -121,7 +122,7 @@ class RdcEmbeddedHandler final : public RdcHandler {
|
||||
rdc_status_t rdc_health_check(rdc_gpu_group_t group_id, rdc_health_response_t* response) override;
|
||||
rdc_status_t rdc_health_clear(rdc_gpu_group_t group_id) override;
|
||||
rdc_status_t rdc_device_topology_get(uint32_t gpu_index, rdc_device_topology_t* results) override;
|
||||
|
||||
|
||||
rdc_status_t rdc_link_status_get(rdc_link_status_t* results) override;
|
||||
|
||||
// Set one configure
|
||||
@@ -134,11 +135,18 @@ class RdcEmbeddedHandler final : public RdcHandler {
|
||||
// Clear the setting
|
||||
rdc_status_t rdc_config_clear(rdc_gpu_group_t group_id) override;
|
||||
|
||||
rdc_status_t rdc_get_num_partition(uint32_t index, uint16_t* num_partition) override;
|
||||
|
||||
rdc_status_t rdc_instance_profile_get(uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile) override;
|
||||
|
||||
explicit RdcEmbeddedHandler(rdc_operation_mode_t op_mode);
|
||||
~RdcEmbeddedHandler() final;
|
||||
|
||||
private:
|
||||
rdc_status_t get_gpu_gauges(rdc_gpu_gauges_t* gpu_gauges);
|
||||
RdcPartitionPtr partition_;
|
||||
RdcGroupSettingsPtr group_settings_;
|
||||
RdcCacheManagerPtr cache_mgr_;
|
||||
RdcMetricFetcherPtr metric_fetcher_;
|
||||
@@ -150,7 +158,6 @@ class RdcEmbeddedHandler final : public RdcHandler {
|
||||
RdcTopologyLinkPtr topologylink_;
|
||||
RdcConfigSettingsPtr config_handler_;
|
||||
std::future<void> updater_;
|
||||
|
||||
};
|
||||
|
||||
} // namespace rdc
|
||||
|
||||
@@ -28,6 +28,7 @@ THE SOFTWARE.
|
||||
#include <string>
|
||||
|
||||
#include "rdc_lib/RdcGroupSettings.h"
|
||||
#include "rdc_lib/impl/RdcPartitionImpl.h"
|
||||
|
||||
namespace amd {
|
||||
namespace rdc {
|
||||
@@ -51,7 +52,7 @@ class RdcGroupSettingsImpl : public RdcGroupSettings {
|
||||
rdc_status_t rdc_group_field_get_all_ids(rdc_field_grp_t field_group_id_list[],
|
||||
uint32_t* count) override;
|
||||
|
||||
RdcGroupSettingsImpl();
|
||||
explicit RdcGroupSettingsImpl(const RdcPartitionPtr& partition);
|
||||
|
||||
private:
|
||||
std::map<rdc_gpu_group_t, rdc_group_info_t> gpu_group_;
|
||||
@@ -60,6 +61,7 @@ class RdcGroupSettingsImpl : public RdcGroupSettings {
|
||||
uint32_t cur_field_group_id_ = 0;
|
||||
std::mutex group_mutex_;
|
||||
std::mutex field_group_mutex_;
|
||||
RdcPartitionPtr partition_;
|
||||
};
|
||||
|
||||
} // namespace rdc
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
Copyright (c) 2025 - present Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
#ifndef INCLUDE_RDC_LIB_IMPL_RDCPARTITIONIMPL_H_
|
||||
#define INCLUDE_RDC_LIB_IMPL_RDCPARTITIONIMPL_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "rdc/rdc.h"
|
||||
#include "rdc_lib/RdcPartition.h"
|
||||
|
||||
namespace amd {
|
||||
namespace rdc {
|
||||
|
||||
class RdcPartitionImpl : public RdcPartition {
|
||||
public:
|
||||
rdc_status_t rdc_instance_profile_get_impl(uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile);
|
||||
rdc_status_t rdc_get_num_partition_impl(uint32_t index, uint16_t* num_partition);
|
||||
};
|
||||
|
||||
} // namespace rdc
|
||||
} // namespace amd
|
||||
|
||||
#endif // INCLUDE_RDC_LIB_IMPL_RDCPARTITIONIMPL_H_
|
||||
@@ -126,9 +126,15 @@ class RdcStandaloneHandler : public RdcHandler {
|
||||
rdc_status_t rdc_health_check(rdc_gpu_group_t group_id, rdc_health_response_t* response) override;
|
||||
rdc_status_t rdc_health_clear(rdc_gpu_group_t group_id) override;
|
||||
rdc_status_t rdc_device_topology_get(uint32_t gpu_index, rdc_device_topology_t* results) override;
|
||||
|
||||
|
||||
rdc_status_t rdc_link_status_get(rdc_link_status_t* results) override;
|
||||
|
||||
rdc_status_t rdc_get_num_partition(uint32_t index, uint16_t* num_partition) override;
|
||||
|
||||
rdc_status_t rdc_instance_profile_get(uint32_t entity_index,
|
||||
rdc_instance_resource_type_t resource_type,
|
||||
rdc_resource_profile_t* profile) override;
|
||||
|
||||
explicit RdcStandaloneHandler(const char* ip_and_port, const char* root_ca,
|
||||
const char* client_cert, const char* client_key);
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ THE SOFTWARE.
|
||||
#ifndef INCLUDE_RDC_LIB_IMPL_RSMIUTILS_H_
|
||||
#define INCLUDE_RDC_LIB_IMPL_RSMIUTILS_H_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "amd_smi/amdsmi.h"
|
||||
#include "rdc/rdc.h"
|
||||
|
||||
@@ -33,6 +35,12 @@ rdc_status_t Smi2RdcError(amdsmi_status_t rsmi);
|
||||
amdsmi_status_t get_processor_handle_from_id(uint32_t gpu_id,
|
||||
amdsmi_processor_handle* processor_handle);
|
||||
amdsmi_status_t get_processor_count(uint32_t& all_processor_count);
|
||||
amdsmi_status_t get_socket_handles(std::vector<amdsmi_socket_handle>& sockets);
|
||||
amdsmi_status_t get_processor_handles(amdsmi_socket_handle socket,
|
||||
std::vector<amdsmi_processor_handle>& processors);
|
||||
amdsmi_status_t get_kfd_partition_id(amdsmi_processor_handle proc, uint32_t* partition_id);
|
||||
amdsmi_status_t get_metrics_info(amdsmi_processor_handle proc, amdsmi_gpu_metrics_t* metrics);
|
||||
amdsmi_status_t get_num_partition(uint32_t index, uint16_t* num_partition);
|
||||
|
||||
} // namespace rdc
|
||||
} // namespace amd
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle