rocr: Remove KMT usage from AMD ext
Use the core Driver in AMD's HSA extension API to make it
agnostic to the underlying OS and kernel-mode driver.
[ROCm/ROCR-Runtime commit: d3a4dc9687]
Dieser Commit ist enthalten in:
1 Ursprung
b42578b070
Commit
3b30b8a975
7 Dateien geändert
+79
-13
Keine Dateien entsprechen Ihrer Suche
@@ -430,6 +430,28 @@ hsa_status_t KfdDriver::ReleaseShareableHandle(core::ShareableHandle &handle) {
|
|||||||
return HSA_STATUS_SUCCESS;
|
return HSA_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hsa_status_t KfdDriver::SPMAcquire(uint32_t preferred_node_id) const {
|
||||||
|
if (hsaKmtSPMAcquire(preferred_node_id) != HSAKMT_STATUS_SUCCESS) return HSA_STATUS_ERROR;
|
||||||
|
|
||||||
|
return HSA_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
hsa_status_t KfdDriver::SPMRelease(uint32_t preferred_node_id) const {
|
||||||
|
if (hsaKmtSPMRelease(preferred_node_id) != HSAKMT_STATUS_SUCCESS) return HSA_STATUS_ERROR;
|
||||||
|
|
||||||
|
return HSA_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
hsa_status_t KfdDriver::SPMSetDestBuffer(uint32_t preferred_node_id, uint32_t size_bytes,
|
||||||
|
uint32_t* timeout, uint32_t* size_copied,
|
||||||
|
void* dest_mem_addr, bool* is_spm_data_loss) const {
|
||||||
|
if (hsaKmtSPMSetDestBuffer(preferred_node_id, size_bytes, timeout, size_copied, dest_mem_addr,
|
||||||
|
is_spm_data_loss) != HSAKMT_STATUS_SUCCESS)
|
||||||
|
return HSA_STATUS_ERROR;
|
||||||
|
|
||||||
|
return HSA_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void *KfdDriver::AllocateKfdMemory(const HsaMemFlags &flags, uint32_t node_id,
|
void *KfdDriver::AllocateKfdMemory(const HsaMemFlags &flags, uint32_t node_id,
|
||||||
size_t size) {
|
size_t size) {
|
||||||
void *mem = nullptr;
|
void *mem = nullptr;
|
||||||
|
|||||||
@@ -671,5 +671,22 @@ hsa_status_t XdnaDriver::SubmitCmdChain(hsa_amd_aie_ert_packet_t* first_pkt, uin
|
|||||||
return HSA_STATUS_SUCCESS;
|
return HSA_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hsa_status_t XdnaDriver::SPMAcquire(uint32_t preferred_node_id) const {
|
||||||
|
// AIE does not support streaming performance monitor.
|
||||||
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
hsa_status_t XdnaDriver::SPMRelease(uint32_t preferred_node_id) const {
|
||||||
|
// AIE does not support streaming performance monitor.
|
||||||
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
};
|
||||||
|
|
||||||
|
hsa_status_t XdnaDriver::SPMSetDestBuffer(uint32_t preferred_node_id, uint32_t size_bytes,
|
||||||
|
uint32_t* timeout, uint32_t* size_copied,
|
||||||
|
void* dest_mem_addr, bool* is_spm_data_loss) const {
|
||||||
|
// AIE does not support streaming performance monitor.
|
||||||
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace AMD
|
} // namespace AMD
|
||||||
} // namespace rocr
|
} // namespace rocr
|
||||||
@@ -301,7 +301,7 @@ class Agent : public Checked<0xF6BC25EB17E6F917> {
|
|||||||
__forceinline uint32_t node_id() const { return node_id_; }
|
__forceinline uint32_t node_id() const { return node_id_; }
|
||||||
|
|
||||||
// @brief Returns the driver associated with this agent.
|
// @brief Returns the driver associated with this agent.
|
||||||
__forceinline Driver &driver() { return *driver_; }
|
__forceinline Driver& driver() const { return *driver_; }
|
||||||
|
|
||||||
// @brief Getter for profiling_enabled_.
|
// @brief Getter for profiling_enabled_.
|
||||||
__forceinline bool profiling_enabled() const { return profiling_enabled_; }
|
__forceinline bool profiling_enabled() const { return profiling_enabled_; }
|
||||||
|
|||||||
@@ -109,7 +109,13 @@ public:
|
|||||||
size_t size) override;
|
size_t size) override;
|
||||||
hsa_status_t ReleaseShareableHandle(core::ShareableHandle &handle) override;
|
hsa_status_t ReleaseShareableHandle(core::ShareableHandle &handle) override;
|
||||||
|
|
||||||
private:
|
hsa_status_t SPMAcquire(uint32_t preferred_node_id) const override;
|
||||||
|
hsa_status_t SPMRelease(uint32_t preferred_node_id) const override;
|
||||||
|
hsa_status_t SPMSetDestBuffer(uint32_t preferred_node_id, uint32_t size_bytes, uint32_t* timeout,
|
||||||
|
uint32_t* size_copied, void* dest_mem_addr,
|
||||||
|
bool* is_spm_data_loss) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
/// @brief Allocate agent accessible memory (system / local memory).
|
/// @brief Allocate agent accessible memory (system / local memory).
|
||||||
static void *AllocateKfdMemory(const HsaMemFlags &flags, uint32_t node_id,
|
static void *AllocateKfdMemory(const HsaMemFlags &flags, uint32_t node_id,
|
||||||
size_t size);
|
size_t size);
|
||||||
|
|||||||
@@ -174,10 +174,16 @@ public:
|
|||||||
size_t size) override;
|
size_t size) override;
|
||||||
hsa_status_t ReleaseShareableHandle(core::ShareableHandle &handle) override;
|
hsa_status_t ReleaseShareableHandle(core::ShareableHandle &handle) override;
|
||||||
|
|
||||||
// @brief Submits num_pkts packets in a command chain to the XDNA driver
|
/// @brief Submits num_pkts packets in a command chain to the XDNA driver
|
||||||
hsa_status_t SubmitCmdChain(hsa_amd_aie_ert_packet_t* first_pkt, uint32_t num_pkts,
|
hsa_status_t SubmitCmdChain(hsa_amd_aie_ert_packet_t* first_pkt, uint32_t num_pkts,
|
||||||
uint32_t num_operands, uint32_t hw_ctx_handle);
|
uint32_t num_operands, uint32_t hw_ctx_handle);
|
||||||
|
|
||||||
|
hsa_status_t SPMAcquire(uint32_t preferred_node_id) const override;
|
||||||
|
hsa_status_t SPMRelease(uint32_t preferred_node_id) const override;
|
||||||
|
hsa_status_t SPMSetDestBuffer(uint32_t preferred_node_id, uint32_t size_bytes, uint32_t* timeout,
|
||||||
|
uint32_t* size_copied, void* dest_mem_addr,
|
||||||
|
bool* is_spm_data_loss) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
hsa_status_t QueryDriverVersion();
|
hsa_status_t QueryDriverVersion();
|
||||||
/// @brief Allocate device accesible heap space.
|
/// @brief Allocate device accesible heap space.
|
||||||
|
|||||||
@@ -193,6 +193,24 @@ public:
|
|||||||
virtual hsa_status_t
|
virtual hsa_status_t
|
||||||
ReleaseShareableHandle(core::ShareableHandle &handle) = 0;
|
ReleaseShareableHandle(core::ShareableHandle &handle) = 0;
|
||||||
|
|
||||||
|
/// @brief Acquire a streaming performance monitor on an agent.
|
||||||
|
/// @param[in] preferred_node_id Node ID of the preferred agent.
|
||||||
|
virtual hsa_status_t SPMAcquire(uint32_t preferred_node_id) const = 0;
|
||||||
|
/// @brief Release a streaming performance monitor on an agent.
|
||||||
|
/// @param[in] preferred_node_id Node ID of the preferred agent.
|
||||||
|
virtual hsa_status_t SPMRelease(uint32_t preferred_node_id) const = 0;
|
||||||
|
/// @brief Setup the destination user-mode buffer for streaming performance monitor data.
|
||||||
|
/// @param[in] preferred_node_id Node ID of the preferred agent.
|
||||||
|
/// @param[in] size_bytes Size of the destination buffer in bytes.
|
||||||
|
/// @param[in, out] timeout Timeout in milliseconds.
|
||||||
|
/// @param[out] size_copied Size of data copied in bytes.
|
||||||
|
/// @param[in] dest_mem_addr Destination address for streaming performance data. Set to NULL to
|
||||||
|
/// stop copy on previous buffer.
|
||||||
|
/// @param[out] is_spm_data_loss Data was lost if true.
|
||||||
|
virtual hsa_status_t SPMSetDestBuffer(uint32_t preferred_node_id, uint32_t size_bytes,
|
||||||
|
uint32_t* timeout, uint32_t* size_copied,
|
||||||
|
void* dest_mem_addr, bool* is_spm_data_loss) const = 0;
|
||||||
|
|
||||||
/// Unique identifier for supported kernel-mode drivers.
|
/// Unique identifier for supported kernel-mode drivers.
|
||||||
const DriverType kernel_driver_type_;
|
const DriverType kernel_driver_type_;
|
||||||
|
|
||||||
|
|||||||
@@ -1218,11 +1218,11 @@ hsa_status_t hsa_amd_spm_acquire(hsa_agent_t preferred_agent) {
|
|||||||
TRY;
|
TRY;
|
||||||
IS_OPEN();
|
IS_OPEN();
|
||||||
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
||||||
|
// Currently, the SPM API is only supported for GPU agents.
|
||||||
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
||||||
return HSA_STATUS_ERROR_INVALID_AGENT;
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
|
||||||
if (hsaKmtSPMAcquire(agent->node_id()) != HSAKMT_STATUS_SUCCESS) return HSA_STATUS_ERROR;
|
return agent->driver().SPMAcquire(agent->node_id());
|
||||||
return HSA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
CATCH;
|
CATCH;
|
||||||
}
|
}
|
||||||
@@ -1232,12 +1232,11 @@ hsa_status_t hsa_amd_spm_release(hsa_agent_t preferred_agent) {
|
|||||||
IS_OPEN();
|
IS_OPEN();
|
||||||
|
|
||||||
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
||||||
|
// Currently, the SPM API is only supported for GPU agents.
|
||||||
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
||||||
return HSA_STATUS_ERROR_INVALID_AGENT;
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
|
||||||
if (hsaKmtSPMRelease(agent->node_id()) != HSAKMT_STATUS_SUCCESS) return HSA_STATUS_ERROR;
|
return agent->driver().SPMRelease(agent->node_id());
|
||||||
|
|
||||||
return HSA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
CATCH;
|
CATCH;
|
||||||
}
|
}
|
||||||
@@ -1249,14 +1248,12 @@ hsa_status_t hsa_amd_spm_set_dest_buffer(hsa_agent_t preferred_agent, size_t siz
|
|||||||
IS_OPEN();
|
IS_OPEN();
|
||||||
|
|
||||||
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
const core::Agent* agent = core::Agent::Convert(preferred_agent);
|
||||||
|
// Currently, the SPM API is only supported for GPU agents.
|
||||||
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
if (agent == NULL || !agent->IsValid() || agent->device_type() != core::Agent::kAmdGpuDevice)
|
||||||
return HSA_STATUS_ERROR_INVALID_AGENT;
|
return HSA_STATUS_ERROR_INVALID_AGENT;
|
||||||
|
|
||||||
if (hsaKmtSPMSetDestBuffer(agent->node_id(), size_in_bytes, timeout, size_copied, dest,
|
return agent->driver().SPMSetDestBuffer(agent->node_id(), size_in_bytes, timeout, size_copied,
|
||||||
is_data_loss) != HSAKMT_STATUS_SUCCESS)
|
dest, is_data_loss);
|
||||||
return HSA_STATUS_ERROR;
|
|
||||||
|
|
||||||
return HSA_STATUS_SUCCESS;
|
|
||||||
CATCH;
|
CATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren