From ea89ddd589a518d50689c2417bd28f348706821c Mon Sep 17 00:00:00 2001 From: German Andryeyev <56892148+gandryey@users.noreply.github.com> Date: Fri, 19 Sep 2025 11:25:30 -0400 Subject: [PATCH] SWDEV-547108 - Add dll loader for Windows build (#1004) The build of ROCR backend will be enabled by default in Windows. It requires the dll loader until ROCR dll will be always available in Windows for any configuration. --- projects/clr/rocclr/cmake/ROCclrHSA.cmake | 60 +- projects/clr/rocclr/device/rocm/rocblit.cpp | 36 +- .../clr/rocclr/device/rocm/roccounters.cpp | 6 +- .../clr/rocclr/device/rocm/roccounters.hpp | 17 +- projects/clr/rocclr/device/rocm/rocdevice.cpp | 426 +++++++------ projects/clr/rocclr/device/rocm/rocdevice.hpp | 14 +- .../clr/rocclr/device/rocm/rocglinterop.hpp | 4 +- projects/clr/rocclr/device/rocm/rockernel.cpp | 21 +- projects/clr/rocclr/device/rocm/rocmemory.cpp | 75 ++- projects/clr/rocclr/device/rocm/rocprintf.cpp | 4 +- .../clr/rocclr/device/rocm/rocprogram.cpp | 28 +- projects/clr/rocclr/device/rocm/rocrctx.cpp | 143 +++++ projects/clr/rocclr/device/rocm/rocrctx.hpp | 571 ++++++++++++++++++ projects/clr/rocclr/device/rocm/rocsignal.cpp | 14 +- projects/clr/rocclr/device/rocm/rocsignal.hpp | 5 +- .../clr/rocclr/device/rocm/rocurilocator.cpp | 8 +- .../clr/rocclr/device/rocm/rocurilocator.hpp | 3 +- .../clr/rocclr/device/rocm/rocvirtual.cpp | 98 ++- .../clr/rocclr/device/rocm/rocvirtual.hpp | 16 +- 19 files changed, 1130 insertions(+), 419 deletions(-) create mode 100644 projects/clr/rocclr/device/rocm/rocrctx.cpp create mode 100644 projects/clr/rocclr/device/rocm/rocrctx.hpp diff --git a/projects/clr/rocclr/cmake/ROCclrHSA.cmake b/projects/clr/rocclr/cmake/ROCclrHSA.cmake index 3ba360b24d..d28ca82e47 100644 --- a/projects/clr/rocclr/cmake/ROCclrHSA.cmake +++ b/projects/clr/rocclr/cmake/ROCclrHSA.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2020 - 2021 Advanced Micro Devices, Inc. All rights reserved. +# Copyright (c) 2020 - 2025 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 @@ -18,15 +18,54 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -find_package(hsa-runtime64 1.11 REQUIRED CONFIG - PATHS - /opt/rocm/ - ${ROCM_INSTALL_PATH} - PATH_SUFFIXES - cmake/hsa-runtime64 - lib/cmake/hsa-runtime64 - lib64/cmake/hsa-runtime64) -target_link_libraries(rocclr PUBLIC hsa-runtime64::hsa-runtime64) +if(UNIX) + find_package(hsa-runtime64 1.11 REQUIRED CONFIG + PATHS + /opt/rocm/ + ${ROCM_INSTALL_PATH} + PATH_SUFFIXES + cmake/hsa-runtime64 + lib/cmake/hsa-runtime64 + lib64/cmake/hsa-runtime64) +else() + find_package(hsa-runtime64 CONFIG + PATHS + /opt/rocm/ + ${ROCM_INSTALL_PATH} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_INSTALL_PREFIX} + ${CMAKE_INSTALL_PREFIX}/.. + PATH_SUFFIXES + rocr/lib/cmake/hsa-runtime64 + rocr/runtime/hsa-runtime + cmake/hsa-runtime64 + lib/cmake/hsa-runtime64 + lib64/cmake/hsa-runtime64) +endif() + +if (ROCR_DLL_LOAD) + find_path(AMD_HSA_INCLUDE_DIR hsa.h + HINTS + /opt/rocm + ${ROCM_INSTALL_PATH} + ${CMAKE_CURRENT_BINARY_DIR} + PATHS + ${CMAKE_CURRENT_BINARY_DIR}/.. + ${CMAKE_CURRENT_BINARY_DIR}/../.. + ${CMAKE_CURRENT_BINARY_DIR}/../../rocr + ${ROCCLR_SRC_DIR}/../../rocr-runtime/runtime/hsa-runtime + PATH_SUFFIXES + include + include/hsa + inc) + message("Roc CLR: " ${ROCCLR_SRC_DIR} "; HSA headers:" ${AMD_HSA_INCLUDE_DIR}) + target_compile_definitions(rocclr PUBLIC ROCR_DYN_DLL) + target_include_directories(rocclr PUBLIC ${AMD_HSA_INCLUDE_DIR}) +else() + target_link_libraries(rocclr PUBLIC hsa-runtime64::hsa-runtime64) +endif() + +#target_include_directories(rocclr PRIVATE ${AMD_HSA_INCLUDE_DIR}/..) find_package(NUMA) if(NUMA_FOUND) @@ -39,6 +78,7 @@ find_package(OpenGL REQUIRED) target_sources(rocclr PRIVATE ${ROCCLR_SRC_DIR}/device/rocm/rocappprofile.cpp + ${ROCCLR_SRC_DIR}/device/rocm/rocrctx.cpp ${ROCCLR_SRC_DIR}/device/rocm/rocblit.cpp ${ROCCLR_SRC_DIR}/device/rocm/rocblitcl.cpp ${ROCCLR_SRC_DIR}/device/rocm/roccounters.cpp diff --git a/projects/clr/rocclr/device/rocm/rocblit.cpp b/projects/clr/rocclr/device/rocm/rocblit.cpp index 7b8495eacb..a51a9163f1 100644 --- a/projects/clr/rocclr/device/rocm/rocblit.cpp +++ b/projects/clr/rocclr/device/rocm/rocblit.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2015 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -317,8 +317,8 @@ bool DmaBlitManager::copyBufferRect(device::Memory& srcMemory, device::Memory& d active.handle); hsa_status_t status = - hsa_amd_memory_async_copy_rect(&dstMem, &offset, &srcMem, &offset, &dim, agent, direction, - wait_events.size(), wait_events.data(), active); + Hsa::memory_async_copy_rect(&dstMem, &offset, &srcMem, &offset, &dim, agent, direction, + wait_events.size(), wait_events.data(), active); if (status != HSA_STATUS_SUCCESS) { gpu().Barriers().ResetCurrentSignal(); LogPrintfError("DMA buffer failed with code %d", status); @@ -338,7 +338,7 @@ bool DmaBlitManager::copyBufferRect(device::Memory& srcMemory, device::Memory& d ClPrint(amd::LOG_DEBUG, amd::LOG_COPY2, "HSA Async Copy wait_event=0x%zx, completion_signal=0x%zx", (wait_events.size() != 0) ? wait_events[0].handle : 0, active.handle); - hsa_status_t status = hsa_amd_memory_async_copy( + hsa_status_t status = Hsa::memory_async_copy( (reinterpret_cast
(dst) + dstOffset), dstAgent, (reinterpret_cast(src) + srcOffset), srcAgent, size[0], wait_events.size(), wait_events.data(), active); @@ -385,8 +385,8 @@ bool DmaBlitManager::copyImageToBuffer(device::Memory& srcMemory, device::Memory image_region.range.y = size[1]; image_region.range.z = size[2]; - hsa_status_t status = hsa_ext_image_export(gpu().gpu_device(), srcImage.getHsaImageObject(), - dstHost, rowPitch, slicePitch, &image_region); + hsa_status_t status = Hsa::image_export(gpu().gpu_device(), srcImage.getHsaImageObject(), + dstHost, rowPitch, slicePitch, &image_region); result = (status == HSA_STATUS_SUCCESS) ? true : false; // hsa_ext_image_export need a system scope fence @@ -431,8 +431,8 @@ bool DmaBlitManager::copyBufferToImage(device::Memory& srcMemory, device::Memory image_region.range.y = size[1]; image_region.range.z = size[2]; - hsa_status_t status = hsa_ext_image_import(gpu().gpu_device(), srcHost, rowPitch, slicePitch, - dstImage.getHsaImageObject(), &image_region); + hsa_status_t status = Hsa::image_import(gpu().gpu_device(), srcHost, rowPitch, slicePitch, + dstImage.getHsaImageObject(), &image_region); result = (status == HSA_STATUS_SUCCESS) ? true : false; // hsa_ext_image_import need a system scope fence @@ -513,10 +513,10 @@ inline bool DmaBlitManager::rocrCopyBuffer(address dst, hsa_agent_t& dstAgent, c copyMask &= (engine == HwQueueEngine::SdmaRead ? sdmaEngineReadMask_ : sdmaEngineWriteMask_); if (copyMask == 0) { // Check SDMA engine status - status = hsa_amd_memory_copy_engine_status(dstAgent, srcAgent, &freeEngineMask); + status = Hsa::memory_copy_engine_status(dstAgent, srcAgent, &freeEngineMask); if (status == HSA_STATUS_SUCCESS) { - status = hsa_amd_memory_get_preferred_copy_engine(dstAgent, srcAgent, &recIdMask); + status = Hsa::memory_get_preferred_copy_engine(dstAgent, srcAgent, &recIdMask); } ClPrint(amd::LOG_DEBUG, amd::LOG_COPY, @@ -552,9 +552,9 @@ inline bool DmaBlitManager::rocrCopyBuffer(address dst, hsa_agent_t& dstAgent, c copyEngine, dst, src, size, forceSDMA, engine, (wait_events.size() != 0) ? wait_events[0].handle : 0, active.handle); - status = hsa_amd_memory_async_copy_on_engine(dst, dstAgent, src, srcAgent, size, - wait_events.size(), wait_events.data(), active, - copyEngine, forceSDMA); + status = Hsa::memory_async_copy_on_engine(dst, dstAgent, src, srcAgent, size, + wait_events.size(), wait_events.data(), active, + copyEngine, forceSDMA); } else { kUseRegularCopyApi = true; } @@ -567,8 +567,8 @@ inline bool DmaBlitManager::rocrCopyBuffer(address dst, hsa_agent_t& dstAgent, c dst, src, size, (wait_events.size() != 0) ? wait_events[0].handle : 0, active.handle, engine); - status = hsa_amd_memory_async_copy(dst, dstAgent, src, srcAgent, size, wait_events.size(), - wait_events.data(), active); + status = Hsa::memory_async_copy(dst, dstAgent, src, srcAgent, size, wait_events.size(), + wait_events.data(), active); } if (status == HSA_STATUS_SUCCESS) { @@ -609,14 +609,14 @@ bool DmaBlitManager::hsaCopy(const Memory& srcMemory, const Memory& dstMemory, if (static_cast(srcMemory.owner())->ipcShared()) { hsa_amd_pointer_info_t info = {sizeof(hsa_amd_pointer_info_t)}; if (HSA_STATUS_SUCCESS == - hsa_amd_pointer_info(const_cast
(src), &info, nullptr, nullptr, nullptr)) { + Hsa::pointer_info(const_cast
(src), &info, nullptr, nullptr, nullptr)) { srcAgent = info.agentOwner; } } if (static_cast(dstMemory.owner())->ipcShared()) { hsa_amd_pointer_info_t info = {sizeof(hsa_amd_pointer_info_t)}; - if (HSA_STATUS_SUCCESS == hsa_amd_pointer_info(dst, &info, nullptr, nullptr, nullptr)) { + if (HSA_STATUS_SUCCESS == Hsa::pointer_info(dst, &info, nullptr, nullptr, nullptr)) { dstAgent = info.agentOwner; } } @@ -2737,7 +2737,7 @@ bool KernelBlitManager::runScheduler(uint64_t vqVM, hsa_queue_t* schedulerQueue, if (!dev().info().pcie_atomics_) { // Use a device side global atomics to workaround the reliance of PCIe 3 atomics - sp->write_index = hsa_queue_load_write_index_relaxed(schedulerQueue); + sp->write_index = Hsa::queue_load_write_index_relaxed(schedulerQueue); } else { sp->write_index = static_cast(-1ULL); } diff --git a/projects/clr/rocclr/device/rocm/roccounters.cpp b/projects/clr/rocclr/device/rocm/roccounters.cpp index 475732f7d1..46a9a1bd7c 100644 --- a/projects/clr/rocclr/device/rocm/roccounters.cpp +++ b/projects/clr/rocclr/device/rocm/roccounters.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2017 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -565,7 +565,7 @@ bool PerfCounterProfile::initialize() { } // create the completion signal - if (hsa_signal_create(1, 0, nullptr, &completionSignal_) != HSA_STATUS_SUCCESS) { + if (Hsa::signal_create(1, 0, nullptr, &completionSignal_) != HSA_STATUS_SUCCESS) { LogError("Failed to create signal for profile counter"); return false; } @@ -604,7 +604,7 @@ hsa_ext_amd_aql_pm4_packet_t* PerfCounterProfile::createStopPacket() { PerfCounterProfile::~PerfCounterProfile() { if (completionSignal_.handle != 0) { - hsa_signal_destroy(completionSignal_); + Hsa::signal_destroy(completionSignal_); } if (profile_.command_buffer.ptr) { diff --git a/projects/clr/rocclr/device/rocm/roccounters.hpp b/projects/clr/rocclr/device/rocm/roccounters.hpp index 4ce2d70e41..e2d0f684dd 100644 --- a/projects/clr/rocclr/device/rocm/roccounters.hpp +++ b/projects/clr/rocclr/device/rocm/roccounters.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2017 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2017 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24,7 +24,6 @@ #include "top.hpp" #include "device/device.hpp" #include "device/rocm/rocdevice.hpp" -#include "hsa/hsa_ven_amd_aqlprofile.h" namespace amd::roc { @@ -108,19 +107,7 @@ class PerfCounterProfile : public amd::ReferenceCountedObject { //! Get the API tables bool Create() { hsa_agent_t agent = roc_device_.getBackendDevice(); - bool system_support, agent_support; - hsa_system_extension_supported(HSA_EXTENSION_AMD_AQLPROFILE, 1, 0, &system_support); - if (!system_support) { - LogError("HSA system does not support profile counter"); - return false; - } - hsa_agent_extension_supported(HSA_EXTENSION_AMD_AQLPROFILE, agent, 1, 0, &agent_support); - if (!agent_support) { - LogError("HSA agent does not support profile counter"); - return false; - } - - if (hsa_system_get_major_extension_table( + if (Hsa::system_get_major_extension_table( HSA_EXTENSION_AMD_AQLPROFILE, hsa_ven_amd_aqlprofile_VERSION_MAJOR, sizeof(hsa_ven_amd_aqlprofile_pfn_t), &api_) != HSA_STATUS_SUCCESS) { LogError("Failed to obtain aql profile extension function table"); diff --git a/projects/clr/rocclr/device/rocm/rocdevice.cpp b/projects/clr/rocclr/device/rocm/rocdevice.cpp index 7114688604..e7d1818f9e 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.cpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008 - 2024 Advanced Micro Devices, Inc. +/* Copyright (c) 2008 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -243,7 +243,7 @@ Device::~Device() { ClPrint(amd::LOG_DETAIL_DEBUG, amd::LOG_QUEUE, "Deleting hardware queue %p with refCount 0", queue->base_address); qIter = it.erase(qIter); - hsa_queue_destroy(queue); + Hsa::queue_destroy(queue); } } queuePool_.clear(); @@ -260,22 +260,13 @@ Device::~Device() { delete[] p2p_agents_list_; if (0 != prefetch_signal_.handle) { - hsa_signal_destroy(prefetch_signal_); + Hsa::signal_destroy(prefetch_signal_); } } -bool NullDevice::initCompiler(bool isOffline) { return true; } - -bool NullDevice::destroyCompiler() { return true; } - -void NullDevice::tearDown() { destroyCompiler(); } +void NullDevice::tearDown() {} bool NullDevice::init() { - // Initialize the compiler - if (!initCompiler(offlineDevice_)) { - return false; - } - // Create offline devices for all ISAs not already associated with an online // device. This allows code objects to be compiled for all supported ISAs. std::vector devices = getDevices(CL_DEVICE_TYPE_GPU, false); @@ -313,7 +304,7 @@ NullDevice::~NullDevice() {} hsa_status_t Device::iterateAgentCallback(hsa_agent_t agent, void* data) { hsa_device_type_t dev_type = HSA_DEVICE_TYPE_CPU; - hsa_status_t stat = hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &dev_type); + hsa_status_t stat = Hsa::agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &dev_type); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("HSA_AGENT_INFO_DEVICE failed with %x", stat); @@ -322,8 +313,8 @@ hsa_status_t Device::iterateAgentCallback(hsa_agent_t agent, void* data) { if (dev_type == HSA_DEVICE_TYPE_CPU) { AgentInfo info = {agent, {0}, {0}, {0}}; - stat = hsa_amd_agent_iterate_memory_pools(agent, Device::iterateCpuMemoryPoolCallback, - reinterpret_cast(&info)); + stat = Hsa::agent_iterate_memory_pools(agent, Device::iterateCpuMemoryPoolCallback, + reinterpret_cast(&info)); if (stat == HSA_STATUS_SUCCESS) { cpu_agents_.push_back(info); } @@ -344,14 +335,12 @@ hsa_status_t Device::loaderQueryHostAddress(const void* device, const void** hos // ================================================================================================ bool Device::init() { - hsa_status_t status = HSA_STATUS_SUCCESS; - // Initialize the compiler - if (!initCompiler(offlineDevice_)) { - LogError("initCompiler failed."); + if (!Hsa::LoadLib()) { + LogPrintfWarning("Failed to load rocr library!"); return false; } - status = hsa_init(); + hsa_status_t status = Hsa::init(); // If there are no GPUs available, hsa_init will fail with HSA_STATUS_ERROR_OUT_OF_RESOURCES // but for NoGpu tests to pass, true needs to be returned @@ -366,10 +355,10 @@ bool Device::init() { return false; } - hsa_system_get_major_extension_table(HSA_EXTENSION_AMD_LOADER, 1, sizeof(amd_loader_ext_table), - &amd_loader_ext_table); + Hsa::system_get_major_extension_table(HSA_EXTENSION_AMD_LOADER, 1, sizeof(amd_loader_ext_table), + &amd_loader_ext_table); - status = hsa_iterate_agents(iterateAgentCallback, nullptr); + status = Hsa::iterate_agents(iterateAgentCallback, nullptr); if (status != HSA_STATUS_SUCCESS) { LogPrintfError("hsa_iterate_agents failed with %x", status); return false; @@ -398,8 +387,8 @@ bool Device::init() { auto agent = gpu_agents_[i]; char unique_id[32] = {0}; if (HSA_STATUS_SUCCESS == - hsa_agent_get_info(agent, static_cast(HSA_AMD_AGENT_INFO_UUID), - unique_id)) { + Hsa::agent_get_info(agent, static_cast(HSA_AMD_AGENT_INFO_UUID), + unique_id)) { if (std::string(unique_id).find(str_id) != std::string::npos) { str_id = std::to_string(i); break; @@ -446,7 +435,7 @@ bool Device::init() { // request via environment variable. By default the // System Memory is setup to be Coherent if (roc_device->settings().enableNCMode_) { - hsa_status_t err = hsa_amd_coherency_set_type(agent, HSA_AMD_COHERENCY_TYPE_NONCOHERENT); + hsa_status_t err = Hsa::coherency_set_type(agent, HSA_AMD_COHERENCY_TYPE_NONCOHERENT); if (err != HSA_STATUS_SUCCESS) { LogError("Unable to set NC memory policy!"); continue; @@ -524,20 +513,20 @@ extern const char* SchedulerSourceCode; void Device::tearDown() { NullDevice::tearDown(); - hsa_shut_down(); + Hsa::shut_down(); } // ================================================================================================ bool Device::create() { char agent_name[64] = {0}; - if (HSA_STATUS_SUCCESS != hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_NAME, agent_name)) { + if (HSA_STATUS_SUCCESS != Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_NAME, agent_name)) { LogError("Unable to get HSA device name"); return false; } - if (HSA_STATUS_SUCCESS != hsa_agent_get_info(bkendDevice_, - (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CHIP_ID, - &pciDeviceId_)) { + if (HSA_STATUS_SUCCESS != Hsa::agent_get_info(bkendDevice_, + (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CHIP_ID, + &pciDeviceId_)) { LogPrintfError("Unable to get PCI ID of HSA device %s", agent_name); return false; } @@ -546,7 +535,7 @@ bool Device::create() { uint count; hsa_isa_t first_isa; } agent_isas = {0, {0}}; - if (HSA_STATUS_SUCCESS != hsa_agent_iterate_isas( + if (HSA_STATUS_SUCCESS != Hsa::agent_iterate_isas( bkendDevice_, [](hsa_isa_t isa, void* data) { agent_isas_t* agent_isas = static_cast(data); @@ -562,18 +551,18 @@ bool Device::create() { } uint32_t isa_name_length = 0; - if (HSA_STATUS_SUCCESS != hsa_isa_get_info_alt(agent_isas.first_isa, - (hsa_isa_info_t)HSA_ISA_INFO_NAME_LENGTH, - &isa_name_length)) { + if (HSA_STATUS_SUCCESS != Hsa::isa_get_info_alt(agent_isas.first_isa, + (hsa_isa_info_t)HSA_ISA_INFO_NAME_LENGTH, + &isa_name_length)) { LogPrintfError("Unable to get ISA name length for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); return false; } std::vector isa_name(isa_name_length + 1, '\0'); - if (HSA_STATUS_SUCCESS != hsa_isa_get_info_alt(agent_isas.first_isa, - (hsa_isa_info_t)HSA_ISA_INFO_NAME, - isa_name.data())) { + if (HSA_STATUS_SUCCESS != Hsa::isa_get_info_alt(agent_isas.first_isa, + (hsa_isa_info_t)HSA_ISA_INFO_NAME, + isa_name.data())) { LogPrintfError("Unable to get ISA name for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); return false; @@ -587,7 +576,7 @@ bool Device::create() { } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_PROFILE, &agent_profile_)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_PROFILE, &agent_profile_)) { LogPrintfError("Unable to get profile for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); return false; } @@ -596,9 +585,9 @@ bool Device::create() { // Check cooperative groups for HIP only if (amd::IS_HIP && (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_COOPERATIVE_QUEUES), - &coop_groups))) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_COOPERATIVE_QUEUES), + &coop_groups))) { LogPrintfError( "Unable to determine if cooperative queues are supported for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); @@ -610,8 +599,8 @@ bool Device::create() { // Get Agent HDP Flush Register Memory hsa_amd_hdp_flush_t hdpInfo; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_HDP_FLUSH), - &hdpInfo)) { + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_HDP_FLUSH), + &hdpInfo)) { LogPrintfError("Unable to determine HDP flush info for HSA device %s", agent_name); return false; } @@ -646,8 +635,8 @@ bool Device::create() { uint32_t hsa_bdf_id = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_BDFID), - &hsa_bdf_id)) { + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_BDFID), + &hsa_bdf_id)) { LogPrintfError("Unable to determine BFD ID for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); return false; @@ -659,8 +648,8 @@ bool Device::create() { info_.deviceTopology_.pcie.function = (hsa_bdf_id & 0x07); uint32_t pci_domain_id = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_DOMAIN), - &pci_domain_id)) { + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_DOMAIN), + &pci_domain_id)) { LogPrintfError("Unable to determine domain ID for HSA device %s (PCI ID %x)", agent_name, pciDeviceId_); return false; @@ -700,14 +689,14 @@ bool Device::create() { mapCache_->push_back(nullptr); // Create signal for HMM prefetch operation on device - if (HSA_STATUS_SUCCESS != hsa_signal_create(kInitSignalValueOne, 0, nullptr, &prefetch_signal_)) { + if (HSA_STATUS_SUCCESS != Hsa::signal_create(kInitSignalValueOne, 0, nullptr, &prefetch_signal_)) { return false; } if (AMD_LOG_LEVEL >= LOG_EXTRA_DEBUG) { uint8_t logMask[8] = {0}; hsa_flag_set64(logMask, HSA_AMD_LOG_FLAG_BLIT_KERNEL_PKTS); - hsa_amd_enable_logging(logMask, outFile); + Hsa::enable_logging(logMask, outFile); } return true; @@ -781,7 +770,7 @@ hsa_status_t Device::iterateGpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo hsa_region_segment_t segment_type = (hsa_region_segment_t)0; hsa_status_t stat = - hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment_type); + Hsa::memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment_type); if (stat != HSA_STATUS_SUCCESS) { return stat; } @@ -793,7 +782,7 @@ hsa_status_t Device::iterateGpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo if (dev->settings().enableLocalMemory_) { uint32_t global_flag = 0; hsa_status_t stat = - hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &global_flag); + Hsa::memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &global_flag); if (stat != HSA_STATUS_SUCCESS) { return stat; } @@ -811,8 +800,8 @@ hsa_status_t Device::iterateGpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo // If cpu agent cannot access this pool, the device does not support large bar. hsa_amd_memory_pool_access_t tmp{}; - hsa_amd_agent_memory_pool_get_info(dev->cpu_agent_info_->agent, pool, - HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, &tmp); + Hsa::agent_memory_pool_get_info(dev->cpu_agent_info_->agent, pool, + HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, &tmp); if (tmp == HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED) { dev->info_.largeBar_ = false; @@ -821,8 +810,8 @@ hsa_status_t Device::iterateGpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo } // Query the recommended granularity for this pool. - stat = hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, - &(dev->info_.virtualMemAllocGranularity_)); + stat = Hsa::memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, + &(dev->info_.virtualMemAllocGranularity_)); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError( "Cannot query HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE info" @@ -855,7 +844,7 @@ hsa_status_t Device::iterateCpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo hsa_region_segment_t segment_type = (hsa_region_segment_t)0; hsa_status_t stat = - hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment_type); + Hsa::memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment_type); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("HSA_AMD_MEMORY_POOL_INFO_SEGMENT query failed with %x", stat); return stat; @@ -866,7 +855,7 @@ hsa_status_t Device::iterateCpuMemoryPoolCallback(hsa_amd_memory_pool_t pool, vo case HSA_REGION_SEGMENT_GLOBAL: { uint32_t global_flag = 0; stat = - hsa_amd_memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &global_flag); + Hsa::memory_pool_get_info(pool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &global_flag); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS query failed with %x", stat); break; @@ -962,7 +951,7 @@ bool Sampler::create(const amd::Sampler& owner) { fillSampleDescriptor(samplerDescriptor, owner); hsa_status_t status = - hsa_ext_sampler_create_v2(dev_.getBackendDevice(), &samplerDescriptor, &hsa_sampler); + Hsa::sampler_create(dev_.getBackendDevice(), &samplerDescriptor, &hsa_sampler); if (HSA_STATUS_SUCCESS != status) { DevLogPrintfError("Sampler creation failed with status: %d \n", status); @@ -975,7 +964,7 @@ bool Sampler::create(const amd::Sampler& owner) { return true; } -Sampler::~Sampler() { hsa_ext_sampler_destroy(dev_.getBackendDevice(), hsa_sampler); } +Sampler::~Sampler() { Hsa::sampler_destroy(dev_.getBackendDevice(), hsa_sampler); } Memory* Device::getGpuMemory(amd::Memory* mem) const { return static_cast(mem->getDeviceMemory(*this)); @@ -996,15 +985,15 @@ bool Device::populateOCLDeviceConstants() { ::strncpy(info_.name_, isa().targetId(), sizeof(info_.name_) - 1); char device_name[64] = {0}; - if (HSA_STATUS_SUCCESS == hsa_agent_get_info(bkendDevice_, - (hsa_agent_info_t)HSA_AMD_AGENT_INFO_PRODUCT_NAME, - device_name)) { + if (HSA_STATUS_SUCCESS == Hsa::agent_get_info(bkendDevice_, + (hsa_agent_info_t)HSA_AMD_AGENT_INFO_PRODUCT_NAME, + device_name)) { ::strncpy(info_.boardName_, device_name, sizeof(info_.boardName_) - 1); } char unique_id[32] = {0}; if (HSA_STATUS_SUCCESS == - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_UUID), + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_UUID), unique_id)) { // ROCr gives the UUID info in the format GPU-XXXX with length 20 bytes // Strip the first 4 bytes and store only the 16 bytes representing UUID @@ -1013,11 +1002,11 @@ bool Device::populateOCLDeviceConstants() { } } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - (amd::IS_HIP) - ? (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT - : (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT, - &info_.maxComputeUnits_)) { + Hsa::agent_get_info(bkendDevice_, + (amd::IS_HIP) + ? (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT + : (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT, + &info_.maxComputeUnits_)) { return false; } assert(info_.maxComputeUnits_ > 0); @@ -1026,8 +1015,8 @@ bool Device::populateOCLDeviceConstants() { settings().enableWgpMode_ ? info_.maxComputeUnits_ / 2 : info_.maxComputeUnits_; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT, - &info_.maxPhysicalComputeUnits_)) { + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT, + &info_.maxPhysicalComputeUnits_)) { return false; } assert(info_.maxPhysicalComputeUnits_ > 0); @@ -1035,9 +1024,9 @@ bool Device::populateOCLDeviceConstants() { info_.maxPhysicalComputeUnits_ = settings().enableWgpMode_ ? info_.maxPhysicalComputeUnits_ / 2 : info_.maxPhysicalComputeUnits_; - if (HSA_STATUS_SUCCESS != hsa_agent_get_info(bkendDevice_, - (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CACHELINE_SIZE, - &info_.globalMemCacheLineSize_)) { + if (HSA_STATUS_SUCCESS != Hsa::agent_get_info(bkendDevice_, + (hsa_agent_info_t)HSA_AMD_AGENT_INFO_CACHELINE_SIZE, + &info_.globalMemCacheLineSize_)) { return false; } info_.globalMemCacheLineSize_ = @@ -1045,7 +1034,7 @@ bool Device::populateOCLDeviceConstants() { uint32_t cachesize[4] = {0}; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_CACHE_SIZE, cachesize)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_CACHE_SIZE, cachesize)) { return false; } assert(cachesize[0] > 0); @@ -1060,8 +1049,8 @@ bool Device::populateOCLDeviceConstants() { (settings().doublePrecision_) ? 1 : 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY, - &info_.maxEngineClockFrequency_)) { + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY, + &info_.maxEngineClockFrequency_)) { return false; } @@ -1072,37 +1061,37 @@ bool Device::populateOCLDeviceConstants() { } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY, - &info_.maxMemoryClockFrequency_)) { + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY, + &info_.maxMemoryClockFrequency_)) { return false; } uint64_t wallClockFrequency = 0; // in Hz if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY, - &wallClockFrequency)) { + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY, + &wallClockFrequency)) { LogWarning("HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY cannot be queried. Ignored!"); } info_.wallClockFrequency_ = static_cast(wallClockFrequency / 1000); // in KHz if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_DRIVER_NODE_ID), - &info_.driverNodeId_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_DRIVER_NODE_ID), + &info_.driverNodeId_)) { return false; } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_NUM_SDMA_ENG), - &info_.numSDMAengines_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_NUM_SDMA_ENG), + &info_.numSDMAengines_)) { return false; } uint64_t scratchLimitMax = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_MAX, - &scratchLimitMax)) { + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_MAX, + &scratchLimitMax)) { LogWarning("HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_MAX cannot be queried!"); return false; } @@ -1112,7 +1101,7 @@ bool Device::populateOCLDeviceConstants() { checkAtomicSupport(); assert(cpu_agent_info_->fine_grain_pool.handle != 0); - if (HSA_STATUS_SUCCESS != hsa_amd_agent_iterate_memory_pools( + if (HSA_STATUS_SUCCESS != Hsa::agent_iterate_memory_pools( bkendDevice_, Device::iterateGpuMemoryPoolCallback, this)) { return false; } @@ -1124,8 +1113,8 @@ bool Device::populateOCLDeviceConstants() { hsa_status_t err; // Can another GPU (agent) have access to the current GPU memory pool (gpuvm_segment_)? hsa_amd_memory_pool_access_t access; - err = hsa_amd_agent_memory_pool_get_info(agent, gpuvm_segment_, - HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, &access); + err = Hsa::agent_memory_pool_get_info(agent, gpuvm_segment_, + HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, &access); if (err != HSA_STATUS_SUCCESS) { continue; } @@ -1147,23 +1136,23 @@ bool Device::populateOCLDeviceConstants() { } size_t group_segment_size = 0; - if (HSA_STATUS_SUCCESS != hsa_amd_memory_pool_get_info(group_segment_, - HSA_AMD_MEMORY_POOL_INFO_SIZE, - &group_segment_size)) { + if (HSA_STATUS_SUCCESS != Hsa::memory_pool_get_info(group_segment_, + HSA_AMD_MEMORY_POOL_INFO_SIZE, + &group_segment_size)) { return false; } assert(group_segment_size > 0); // Find SDMA read mask if (HSA_STATUS_SUCCESS != - hsa_amd_memory_copy_engine_status(getCpuAgent(), getBackendDevice(), &maxSdmaReadMask_)) { + Hsa::memory_copy_engine_status(getCpuAgent(), getBackendDevice(), &maxSdmaReadMask_)) { return false; } assert(maxSdmaReadMask_ > 0 && "No SDMA engines available for Read"); // Find SDMA write mask if (HSA_STATUS_SUCCESS != - hsa_amd_memory_copy_engine_status(getBackendDevice(), getCpuAgent(), &maxSdmaWriteMask_)) { + Hsa::memory_copy_engine_status(getBackendDevice(), getCpuAgent(), &maxSdmaWriteMask_)) { return false; } assert(maxSdmaWriteMask_ > 0 && "No SDMA engines available for Write"); @@ -1176,7 +1165,7 @@ bool Device::populateOCLDeviceConstants() { uint8_t memory_properties[8]; // Get the memory property from ROCr. if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MEMORY_PROPERTIES, + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_MEMORY_PROPERTIES, memory_properties)) { LogError("HSA_AGENT_INFO_AMD_MEMORY_PROPERTIES query failed"); } @@ -1188,9 +1177,9 @@ bool Device::populateOCLDeviceConstants() { if (settings().enableLocalMemory_ && gpuvm_segment_.handle != 0) { size_t global_segment_size = 0; - if (HSA_STATUS_SUCCESS != hsa_amd_memory_pool_get_info(gpuvm_segment_, - HSA_AMD_MEMORY_POOL_INFO_SIZE, - &global_segment_size)) { + if (HSA_STATUS_SUCCESS != Hsa::memory_pool_get_info(gpuvm_segment_, + HSA_AMD_MEMORY_POOL_INFO_SIZE, + &global_segment_size)) { return false; } @@ -1213,8 +1202,8 @@ bool Device::populateOCLDeviceConstants() { info_.maxMemAllocSize_ = static_cast(gpuvm_segment_max_alloc_); if (HSA_STATUS_SUCCESS != - hsa_amd_memory_pool_get_info(gpuvm_segment_, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, - &alloc_granularity_)) { + Hsa::memory_pool_get_info(gpuvm_segment_, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, + &alloc_granularity_)) { return false; } @@ -1231,9 +1220,9 @@ bool Device::populateOCLDeviceConstants() { uint64_t(info_.globalMemSize_ * std::min(GPU_SINGLE_ALLOC_PERCENT, 100u) / 100u); if (HSA_STATUS_SUCCESS != - hsa_amd_memory_pool_get_info(cpu_agent_info_->fine_grain_pool, - HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, - &alloc_granularity_)) { + Hsa::memory_pool_get_info(cpu_agent_info_->fine_grain_pool, + HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE, + &alloc_granularity_)) { return false; } } @@ -1252,7 +1241,7 @@ bool Device::populateOCLDeviceConstants() { uint32_t max_work_group_size = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_WORKGROUP_MAX_SIZE, &max_work_group_size)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_WORKGROUP_MAX_SIZE, &max_work_group_size)) { return false; } assert(max_work_group_size > 0); @@ -1262,7 +1251,7 @@ bool Device::populateOCLDeviceConstants() { uint16_t max_workgroup_size[3] = {0, 0, 0}; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_WORKGROUP_MAX_DIM, &max_workgroup_size)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_WORKGROUP_MAX_DIM, &max_workgroup_size)) { return false; } assert(max_workgroup_size[0] != 0 && max_workgroup_size[1] != 0 && max_workgroup_size[2] != 0); @@ -1309,9 +1298,9 @@ bool Device::populateOCLDeviceConstants() { info_.spirVersions_ = ""; uint16_t major, minor; - if (hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_VERSION_MAJOR, &major) != + if (Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_VERSION_MAJOR, &major) != HSA_STATUS_SUCCESS || - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_VERSION_MINOR, &minor) != + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_VERSION_MINOR, &minor) != HSA_STATUS_SUCCESS) { return false; } @@ -1366,7 +1355,7 @@ bool Device::populateOCLDeviceConstants() { uint8_t hsa_extensions[128]; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_EXTENSIONS, hsa_extensions)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_EXTENSIONS, hsa_extensions)) { return false; } @@ -1375,16 +1364,16 @@ bool Device::populateOCLDeviceConstants() { if (image_is_supported) { // Images if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_MAX_SAMPLER_HANDLERS), - &info_.maxSamplers_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_MAX_SAMPLER_HANDLERS), + &info_.maxSamplers_)) { return false; } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_MAX_IMAGE_RD_HANDLES), - &info_.maxReadImageArgs_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_MAX_IMAGE_RD_HANDLES), + &info_.maxReadImageArgs_)) { return false; } @@ -1392,17 +1381,17 @@ bool Device::populateOCLDeviceConstants() { info_.maxWriteImageArgs_ = 8; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_MAX_IMAGE_RORW_HANDLES), - &info_.maxReadWriteImageArgs_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_MAX_IMAGE_RORW_HANDLES), + &info_.maxReadWriteImageArgs_)) { return false; } uint32_t image_max_dim[3]; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_2D_MAX_ELEMENTS), - &image_max_dim)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_2D_MAX_ELEMENTS), + &image_max_dim)) { return false; } @@ -1410,9 +1399,9 @@ bool Device::populateOCLDeviceConstants() { info_.image2DMaxHeight_ = image_max_dim[1]; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_3D_MAX_ELEMENTS), - &image_max_dim)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_3D_MAX_ELEMENTS), + &image_max_dim)) { return false; } @@ -1422,9 +1411,9 @@ bool Device::populateOCLDeviceConstants() { uint32_t max_array_size = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_ARRAY_MAX_LAYERS), - &max_array_size)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_ARRAY_MAX_LAYERS), + &max_array_size)) { return false; } @@ -1432,9 +1421,9 @@ bool Device::populateOCLDeviceConstants() { uint32_t max_image1da_width = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_1DA_MAX_ELEMENTS), - &max_image1da_width)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_1DA_MAX_ELEMENTS), + &max_image1da_width)) { return false; } @@ -1442,9 +1431,9 @@ bool Device::populateOCLDeviceConstants() { uint32_t max_image2da_width[2] = {0, 0}; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_2DA_MAX_ELEMENTS), - &max_image2da_width)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_2DA_MAX_ELEMENTS), + &max_image2da_width)) { return false; } @@ -1453,17 +1442,17 @@ bool Device::populateOCLDeviceConstants() { uint32_t max_image1d_width = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS), - &max_image1d_width)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS), + &max_image1d_width)) { return false; } info_.image1DMaxWidth_ = max_image1d_width; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_EXT_AGENT_INFO_IMAGE_1DB_MAX_ELEMENTS), - &image_max_dim)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_EXT_AGENT_INFO_IMAGE_1DB_MAX_ELEMENTS), + &image_max_dim)) { return false; } info_.imageMaxBufferSize_ = (amd::IS_HIP) ? image_max_dim[0] : (1 << 27); @@ -1502,31 +1491,31 @@ bool Device::populateOCLDeviceConstants() { info_.simdWidth_ = isa().simdWidth(); info_.simdInstructionWidth_ = isa().simdInstructionWidth(); if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_WAVEFRONT_SIZE, &info_.wavefrontWidth_)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_WAVEFRONT_SIZE, &info_.wavefrontWidth_)) { return false; } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_MEMORY_WIDTH), - &info_.vramBusBitWidth_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_MEMORY_WIDTH), + &info_.vramBusBitWidth_)) { return false; } info_.globalMemChannels_ = info_.vramBusBitWidth_ / 32; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU), - &info_.simdPerCU_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU), + &info_.simdPerCU_)) { return false; } uint32_t max_waves_per_cu = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU), - &max_waves_per_cu)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU), + &max_waves_per_cu)) { return false; } @@ -1539,16 +1528,16 @@ bool Device::populateOCLDeviceConstants() { uint32_t cache_sizes[4]; /* FIXIT [skudchad] - Seems like hardcoded in HSA backend so 0*/ if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AGENT_INFO_CACHE_SIZE), - cache_sizes)) { + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AGENT_INFO_CACHE_SIZE), + cache_sizes)) { return false; } uint32_t asic_revision = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_ASIC_REVISION), - &asic_revision)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_ASIC_REVISION), + &asic_revision)) { return false; } info_.asicRevision_ = asic_revision; @@ -1619,27 +1608,27 @@ bool Device::populateOCLDeviceConstants() { // Generic support for HMM interfaces if (HSA_STATUS_SUCCESS != - hsa_system_get_info(HSA_AMD_SYSTEM_INFO_SVM_SUPPORTED, &info_.hmmSupported_)) { + Hsa::system_get_info(HSA_AMD_SYSTEM_INFO_SVM_SUPPORTED, &info_.hmmSupported_)) { LogError("HSA_AMD_SYSTEM_INFO_SVM_SUPPORTED query failed. HMM will be disabled"); } // This capability should be available with xnack enabled - if (HSA_STATUS_SUCCESS != hsa_system_get_info(HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT, - &info_.hmmCpuMemoryAccessible_)) { + if (HSA_STATUS_SUCCESS != Hsa::system_get_info(HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT, + &info_.hmmCpuMemoryAccessible_)) { LogError("HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT query failed."); } // HMM specific capability for CPU direct access to device memory if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_SVM_DIRECT_HOST_ACCESS), - &info_.hmmDirectHostAccess_)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_SVM_DIRECT_HOST_ACCESS), + &info_.hmmDirectHostAccess_)) { LogError("HSA_AMD_AGENT_INFO_SVM_DIRECT_HOST_ACCESS query failed."); } if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_NUM_XCC), - &info_.numberOfXccs_)) { + Hsa::agent_get_info(bkendDevice_, static_cast(HSA_AMD_AGENT_INFO_NUM_XCC), + &info_.numberOfXccs_)) { LogError("HSA_AMD_AGENT_INFO_NUM_XCC query failed."); } @@ -1656,7 +1645,7 @@ bool Device::populateOCLDeviceConstants() { info_.virtualMemoryManagement_ = false; if (HIP_VMEM_MANAGE_SUPPORT) { if (HSA_STATUS_SUCCESS != - hsa_system_get_info( + Hsa::system_get_info( static_cast(HSA_AMD_SYSTEM_INFO_VIRTUAL_MEM_API_SUPPORTED), &info_.virtualMemoryManagement_)) { LogError("HSA_AMD_SYSTEM_INFO_VIRTUAL_MEM_API_SUPPORTED query failed "); @@ -1711,9 +1700,9 @@ bool Device::globalFreeMemory(size_t* freeMemory) const { uint64_t globalAvailMemory; // Queries memory available in bytes across all global pools owned by the agent if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, - static_cast(HSA_AMD_AGENT_INFO_MEMORY_AVAIL), - &globalAvailMemory)) { + Hsa::agent_get_info(bkendDevice_, + static_cast(HSA_AMD_AGENT_INFO_MEMORY_AVAIL), + &globalAvailMemory)) { LogError("HSA_AMD_AGENT_INFO_MEMORY_AVAIL query failed."); return false; } @@ -2015,7 +2004,8 @@ void* Device::hostAlloc(size_t size, size_t alignment, MemorySegment mem_seg, } hsa_amd_memory_pool_t pool = getHostMemoryPool(mem_seg, static_cast(agentInfo)); - hsa_status_t stat = hsa_amd_memory_pool_allocate(pool, size, memFlags, &ptr); + hsa_status_t stat = Hsa::memory_pool_allocate(pool, size, memFlags, &ptr); + ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Allocate hsa host memory %p, size 0x%zx," " numa_node = %d, mem_seg = %d", @@ -2025,7 +2015,7 @@ void* Device::hostAlloc(size_t size, size_t alignment, MemorySegment mem_seg, return nullptr; } - stat = hsa_amd_agents_allow_access(gpu_agents_.size(), &gpu_agents_[0], nullptr, ptr); + stat = Hsa::agents_allow_access(gpu_agents_.size(), &gpu_agents_[0], nullptr, ptr); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("Fail hsa_amd_agents_allow_access with err %d", stat); hostFree(ptr, size); @@ -2079,7 +2069,7 @@ void* Device::hostNumaAlloc(size_t size, size_t alignment, MemorySegment mem_seg void* Device::hostLock(void* hostMem, size_t size, const MemorySegment memSegment) const { hsa_amd_memory_pool_t pool = getHostMemoryPool(memSegment); void* deviceMemory = nullptr; - hsa_status_t status = hsa_amd_memory_lock_to_pool( + hsa_status_t status = Hsa::memory_lock_to_pool( hostMem, size, const_cast(&bkendDevice_), 1, pool, 0, &deviceMemory); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Locking to pool %p, size 0x%zx, hostMem = %p," @@ -2098,7 +2088,7 @@ bool Device::deviceAllowAccess(void* ptr) const { std::lock_guard lock(lock_allow_access_); if (!p2pAgents().empty()) { hsa_status_t stat = - hsa_amd_agents_allow_access(p2pAgents().size(), p2pAgents().data(), nullptr, ptr); + Hsa::agents_allow_access(p2pAgents().size(), p2pAgents().data(), nullptr, ptr); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("Allow p2p access failed - hsa_amd_agents_allow_access with err %d", stat); return false; @@ -2114,7 +2104,7 @@ bool Device::allowPeerAccess(device::Memory* memory) const { if (!p2pAgents().empty()) { void* ptr = reinterpret_cast(memory->virtualAddress()); hsa_agent_t agent = getBackendDevice(); - hsa_status_t stat = hsa_amd_agents_allow_access(1, &agent, nullptr, ptr); + hsa_status_t stat = Hsa::agents_allow_access(1, &agent, nullptr, ptr); if (stat != HSA_STATUS_SUCCESS) { LogPrintfError("Allow p2p access failed - hsa_amd_agents_allow_access with err: %d", stat); return false; @@ -2128,7 +2118,7 @@ uint64_t Device::deviceVmemAlloc(size_t size, uint64_t flags) const { // We only allow pinned memory at this time. hsa_status_t hsa_status = - hsa_amd_vmem_handle_create(gpuvm_segment_, size, MEMORY_TYPE_PINNED, flags, &hsa_vmem_handle); + Hsa::vmem_handle_create(gpuvm_segment_, size, MEMORY_TYPE_PINNED, flags, &hsa_vmem_handle); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_handle_create! Failed with hsa status: %d \n", hsa_status); } @@ -2140,7 +2130,7 @@ void Device::deviceVmemRelease(uint64_t mem_handle) const { hsa_amd_vmem_alloc_handle_t hsa_vmem_handle{}; hsa_vmem_handle.handle = mem_handle; - hsa_status_t hsa_status = hsa_amd_vmem_handle_release(hsa_vmem_handle); + hsa_status_t hsa_status = Hsa::vmem_handle_release(hsa_vmem_handle); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_handle_release! Failed with hsa status: %d \n", hsa_status); } @@ -2149,8 +2139,8 @@ void Device::deviceVmemRelease(uint64_t mem_handle) const { void* Device::reserveMemory(size_t size, size_t alignment) const { void* ptr = nullptr; // Reserves non registered VA memory using HSA APIs. - hsa_status_t status = hsa_amd_vmem_address_reserve_align(&ptr, size, 0, alignment, - HSA_AMD_VMEM_ADDRESS_NO_REGISTER); + hsa_status_t status = Hsa::vmem_address_reserve_align(&ptr, size, 0, alignment, + HSA_AMD_VMEM_ADDRESS_NO_REGISTER); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Reserve hsa device memory %p, size 0x%zx", ptr, size); if (status != HSA_STATUS_SUCCESS) { LogError("Fail to reserve memory"); @@ -2160,7 +2150,7 @@ void* Device::reserveMemory(size_t size, size_t alignment) const { } void Device::releaseMemory(void* ptr, size_t size) const { - hsa_status_t hsa_status = hsa_amd_vmem_address_free(ptr, size); + hsa_status_t hsa_status = Hsa::vmem_address_free(ptr, size); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Free hsa reserved memory %p", ptr); if (hsa_status != HSA_STATUS_SUCCESS) { LogError("hsa_amd_vmem_address_free failed \n"); @@ -2189,7 +2179,7 @@ void* Device::deviceLocalAlloc(size_t size, const AllocationFlags& flags) const } void* ptr = nullptr; - hsa_status_t stat = hsa_amd_memory_pool_allocate(pool, size, hsa_mem_flags, &ptr); + hsa_status_t stat = Hsa::memory_pool_allocate(pool, size, hsa_mem_flags, &ptr); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Allocate hsa device memory %p, size 0x%zx, hsa_mem_flags 0x%xh", ptr, size, hsa_mem_flags); @@ -2207,7 +2197,7 @@ void* Device::deviceLocalAlloc(size_t size, const AllocationFlags& flags) const } void Device::memFree(void* ptr, size_t size) const { - hsa_status_t stat = hsa_amd_memory_pool_free(ptr); + hsa_status_t stat = Hsa::memory_pool_free(ptr); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Free hsa memory %p", ptr); if (stat != HSA_STATUS_SUCCESS) { LogError("Fail freeing local memory"); @@ -2284,7 +2274,7 @@ void* Device::virtualAlloc(void* req_addr, size_t size, size_t alignment) { // Reserves the address using HSA APIs, with requested address. // There is no guarantee that we will get the requested address. hsa_status_t hsa_status = - hsa_amd_vmem_address_reserve(&vptr, size, reinterpret_cast(req_addr), 0); + Hsa::vmem_address_reserve(&vptr, size, reinterpret_cast(req_addr), 0); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_address_reserve. Failed with status: %d \n", hsa_status); return nullptr; @@ -2309,7 +2299,7 @@ bool Device::virtualFree(void* addr) { return false; } - hsa_status_t hsa_status = hsa_amd_vmem_address_free(memObj->getSvmPtr(), memObj->getSize()); + hsa_status_t hsa_status = Hsa::vmem_address_free(memObj->getSvmPtr(), memObj->getSize()); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_address_free. Failed with status:%d \n", hsa_status); return false; @@ -2325,7 +2315,7 @@ bool Device::SetMemAccess(void* va_addr, size_t va_size, VmmAccess access_flags, desc.agent_handle = access_location == VmmLocationType::kDevice ? getBackendDevice() : getCpuAgent(); - if ((hsa_status = hsa_amd_vmem_set_access(va_addr, va_size, &desc, 1)) != HSA_STATUS_SUCCESS) { + if ((hsa_status = Hsa::vmem_set_access(va_addr, va_size, &desc, 1)) != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_set_access. Failed with status:%d \n", hsa_status); return false; } @@ -2344,7 +2334,7 @@ bool Device::GetMemAccess(void* va_addr, VmmAccess* access_flags_ptr) const { return false; } - if ((hsa_status = hsa_amd_vmem_get_access(va_mem_obj->getSvmPtr(), &perms, getBackendDevice())) != + if ((hsa_status = Hsa::vmem_get_access(va_mem_obj->getSvmPtr(), &perms, getBackendDevice())) != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_get_access. Failed with status:%d \n", hsa_status); return false; @@ -2367,7 +2357,7 @@ bool Device::ExportShareableVMMHandle(amd::Memory& amd_mem_obj, int flags, void* return false; } - if ((hsa_status = hsa_amd_vmem_export_shareable_handle(&dmabuf_fd, hsa_vmem_handle, flags)) != + if ((hsa_status = Hsa::vmem_export_shareable_handle(&dmabuf_fd, hsa_vmem_handle, flags)) != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_vmem_export_shareable_handle with status: %d \n", hsa_status); return false; @@ -2389,7 +2379,7 @@ bool Device::ImportShareableHSAHandle(void* osHandle, uint64_t* hsa_handle_ptr) } int dmabuf_fd = static_cast(reinterpret_cast(osHandle)); - if ((hsa_status = hsa_amd_vmem_import_shareable_handle(dmabuf_fd, &hsa_vmem_handle)) != + if ((hsa_status = Hsa::vmem_import_shareable_handle(dmabuf_fd, &hsa_vmem_handle)) != HSA_STATUS_SUCCESS) { LogPrintfError("Failed hsa_amd_vmem_import_shareable_handle with status: %d \n", hsa_status); return false; @@ -2489,7 +2479,7 @@ bool Device::SetSvmAttributesInt(const void* dev_ptr, size_t count, amd::MemoryA } hsa_status_t status = - hsa_amd_svm_attributes_set(const_cast(dev_ptr), count, attr.data(), attr.size()); + Hsa::svm_attributes_set(const_cast(dev_ptr), count, attr.data(), attr.size()); if (status != HSA_STATUS_SUCCESS) { LogPrintfError("hsa_amd_svm_attributes_set() failed. Advice: %d, status: %d", advice, status); return false; @@ -2527,7 +2517,7 @@ bool Device::GetSvmAttributes(void** data, size_t* data_sizes, int* attributes, ptr_info.size = sizeof(hsa_amd_pointer_info_t); // Query ptr type to see if it's a HMM allocation hsa_status_t status = - hsa_amd_pointer_info(const_cast(dev_ptr), &ptr_info, nullptr, nullptr, nullptr); + Hsa::pointer_info(const_cast(dev_ptr), &ptr_info, nullptr, nullptr, nullptr); // The call should never fail in ROCR, but just check for an error and continue if (status != HSA_STATUS_SUCCESS) { LogError("hsa_amd_pointer_info() failed"); @@ -2586,7 +2576,7 @@ bool Device::GetSvmAttributes(void** data, size_t* data_sizes, int* attributes, } hsa_status_t status = - hsa_amd_svm_attributes_get(const_cast(dev_ptr), count, attr.data(), attr.size()); + Hsa::svm_attributes_get(const_cast(dev_ptr), count, attr.data(), attr.size()); if (status != HSA_STATUS_SUCCESS) { LogError("hsa_amd_svm_attributes_get() failed"); return false; @@ -2703,7 +2693,7 @@ bool Device::GetSvmAttributes(void** data, size_t* data_sizes, int* attributes, size_t Device::ScratchLimitCurrent() const { uint64_t scratchLimitCurrent = 0; hsa_status_t ret = - hsa_agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_CURRENT, + Hsa::agent_get_info(bkendDevice_, (hsa_agent_info_t)HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_CURRENT, &scratchLimitCurrent); if (HSA_STATUS_SUCCESS != ret) { LogPrintfError("HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_CURRENT cannot be queried! Err: 0x%xh", ret); @@ -2713,7 +2703,7 @@ size_t Device::ScratchLimitCurrent() const { }; bool Device::UpdateScratchLimitCurrent(size_t limit) const { - hsa_status_t ret = hsa_amd_agent_set_async_scratch_limit(bkendDevice_, limit); + hsa_status_t ret = Hsa::agent_set_async_scratch_limit(bkendDevice_, limit); if (HSA_STATUS_SUCCESS != ret) { LogPrintfError("hsa_amd_agent_set_async_scratch_limit(%zu) failed with err 0x%xh", limit, ret); return false; @@ -2735,11 +2725,11 @@ bool Device::SvmAllocInit(void* memory, size_t size) const { if (info().hmmSupported_) { // Initialize signal for the barrier - hsa_signal_store_relaxed(prefetch_signal_, kInitSignalValueOne); + Hsa::signal_store_relaxed(prefetch_signal_, kInitSignalValueOne); // Initiate a prefetch command which should force memory update in HMM hsa_status_t status = - hsa_amd_svm_prefetch_async(memory, size, getBackendDevice(), 0, nullptr, prefetch_signal_); + Hsa::svm_prefetch_async(memory, size, getBackendDevice(), 0, nullptr, prefetch_signal_); if (status != HSA_STATUS_SUCCESS) { LogError("hsa_amd_svm_prefetch_async() failed"); return false; @@ -2812,7 +2802,7 @@ bool Device::IsHwEventReady(const amd::Event& event, bool wait, amd::SyncPolicy auto signal = reinterpret_cast(hw_event)->signal_; ClPrint(amd::LOG_INFO, amd::LOG_SIG, "Check HW event = 0x%lx", signal.handle); - return (hsa_signal_load_relaxed(signal) == 0); + return (Hsa::signal_load_relaxed(signal) == 0); } // ================================================================================================ @@ -2918,7 +2908,7 @@ hsa_queue_t* Device::acquireQueue(uint32_t queue_size_hint, bool coop_queue, // is no queue. uint32_t queue_max_packets = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(bkendDevice_, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &queue_max_packets)) { + Hsa::agent_get_info(bkendDevice_, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &queue_max_packets)) { DevLogError("Cannot get hsa agent info \n"); return nullptr; } @@ -2932,9 +2922,9 @@ hsa_queue_t* Device::acquireQueue(uint32_t queue_size_hint, bool coop_queue, queue_type = HSA_QUEUE_TYPE_COOPERATIVE; } - while (hsa_queue_create(bkendDevice_, queue_size, queue_type, callbackQueue, this, - std::numeric_limits::max(), std::numeric_limits::max(), - &queue) != HSA_STATUS_SUCCESS) { + while (Hsa::queue_create(bkendDevice_, queue_size, queue_type, callbackQueue, this, + std::numeric_limits::max(), std::numeric_limits::max(), + &queue) != HSA_STATUS_SUCCESS) { queue_size >>= 1; if (queue_size < 64) { // if a queue with the same requested priority available from the pool, returns it here @@ -2948,10 +2938,10 @@ hsa_queue_t* Device::acquireQueue(uint32_t queue_size_hint, bool coop_queue, // default priority is normal so no need to set it again if (queue_priority != HSA_AMD_QUEUE_PRIORITY_NORMAL) { - hsa_status_t st = hsa_amd_queue_set_priority(queue, queue_priority); + hsa_status_t st = Hsa::queue_set_priority(queue, queue_priority); if (st != HSA_STATUS_SUCCESS) { DevLogError("Device::acquireQueue: hsa_amd_queue_set_priority failed!"); - hsa_queue_destroy(queue); + Hsa::queue_destroy(queue); return nullptr; } } @@ -2961,7 +2951,7 @@ hsa_queue_t* Device::acquireQueue(uint32_t queue_size_hint, bool coop_queue, "size %d with priority %d, cooperative: %i", queue, queue->base_address, queue_size, queue_priority, coop_queue); - hsa_amd_profiling_set_profiler_enabled(queue, 1); + Hsa::profiling_set_profiler_enabled(queue, 1); if (cuMask.size() != 0 || info_.globalCUMask_.size() != 0) { std::stringstream ss; ss << std::hex; @@ -3023,10 +3013,10 @@ hsa_queue_t* Device::acquireQueue(uint32_t queue_size_hint, bool coop_queue, } hsa_status_t status = - hsa_amd_queue_cu_set_mask(queue, final_mask.size() * 32, final_mask.data()); + Hsa::queue_cu_set_mask(queue, final_mask.size() * 32, final_mask.data()); if (status != HSA_STATUS_SUCCESS) { DevLogError("Device::acquireQueue: hsa_amd_queue_cu_set_mask failed!"); - hsa_queue_destroy(queue); + Hsa::queue_destroy(queue); return nullptr; } if (cuMask.size() != 0) { @@ -3098,14 +3088,14 @@ void Device::releaseQueue(hsa_queue_t* queue, const std::vector& cuMas ClPrint(amd::LOG_INFO, amd::LOG_QUEUE, "Deleting hardware queue %p with refCount 0", queue->base_address); qIter = it.erase(qIter); - hsa_queue_destroy(queue); + Hsa::queue_destroy(queue); } } } if (coop_queue) { // cooperative queue ClPrint(amd::LOG_INFO, amd::LOG_QUEUE, "Deleting CG enabled hardware queue %p ", queue->base_address); - hsa_queue_destroy(queue); + Hsa::queue_destroy(queue); } } @@ -3173,7 +3163,7 @@ bool Device::findLinkInfo(const hsa_amd_memory_pool_t& pool, // Retrieve the hops between 2 devices. int32_t hops = 0; - hsa_status_t hsa_status = hsa_amd_agent_memory_pool_get_info( + hsa_status_t hsa_status = Hsa::agent_memory_pool_get_info( bkendDevice_, pool, HSA_AMD_AGENT_MEMORY_POOL_INFO_NUM_LINK_HOPS, &hops); if (hsa_status != HSA_STATUS_SUCCESS) { @@ -3221,7 +3211,7 @@ bool Device::findLinkInfo(const hsa_amd_memory_pool_t& pool, // Retrieve link info on the pool. std::vector link_info(hops); - hsa_status = hsa_amd_agent_memory_pool_get_info( + hsa_status = Hsa::agent_memory_pool_get_info( bkendDevice_, pool, HSA_AMD_AGENT_MEMORY_POOL_INFO_LINK_INFO, link_info.data()); if (hsa_status != HSA_STATUS_SUCCESS) { @@ -3361,7 +3351,7 @@ hsa_status_t Device::BackendErrorCallBackHandler(const hsa_amd_event_t* event, v void Device::RegisterBackendErrorCb() { // Register ROCclr Error Callback hsa_status_t hsa_error = HSA_STATUS_SUCCESS; - hsa_error = hsa_amd_register_system_event_handler(BackendErrorCallBackHandler, nullptr); + hsa_error = Hsa::register_system_event_handler(BackendErrorCallBackHandler, nullptr); if (hsa_error != HSA_STATUS_SUCCESS) { LogError("Cannot Register Call back event handler"); } @@ -3409,10 +3399,10 @@ void Device::ReleaseGlobalSignal(void* signal) const { bool Device::CreateUserEvent(amd::UserEvent* event) const { std::unique_ptr signal(new ProfilingSignal()); if ((signal == nullptr) || - (HSA_STATUS_SUCCESS != hsa_signal_create(0, 0, nullptr, &signal->signal_))) { + (HSA_STATUS_SUCCESS != Hsa::signal_create(0, 0, nullptr, &signal->signal_))) { return false; } - hsa_signal_silent_store_relaxed(signal->signal_, kInitSignalValueOne); + Hsa::signal_silent_store_relaxed(signal->signal_, kInitSignalValueOne); event->SetHwEvent(signal.release()); return true; } @@ -3421,14 +3411,14 @@ bool Device::CreateUserEvent(amd::UserEvent* event) const { void Device::SetUserEvent(amd::UserEvent* event) const { auto signal = reinterpret_cast(event->HwEvent()); assert(signal != nullptr && "Can't have user event without hw event!"); - hsa_signal_silent_store_relaxed(signal->signal_, 0); + Hsa::signal_silent_store_relaxed(signal->signal_, 0); } // ================================================================================================ bool Device::IsValidAllocation(const void* dev_ptr, size_t size, hsa_amd_pointer_info_t* ptr_info) { // Query ptr type to see if it's a HMM allocation hsa_status_t status = - hsa_amd_pointer_info(const_cast(dev_ptr), ptr_info, nullptr, nullptr, nullptr); + Hsa::pointer_info(const_cast(dev_ptr), ptr_info, nullptr, nullptr, nullptr); // The call should never fail in ROCR, but just check for an error and continue if (status != HSA_STATUS_SUCCESS) { LogError("hsa_amd_pointer_info() failed"); @@ -3513,14 +3503,14 @@ void Device::RemoveKernel(Kernel& gpuKernel) const { // ================================================================================================ ProfilingSignal::~ProfilingSignal() { if (signal_.handle != 0) { - if (hsa_signal_load_relaxed(signal_) > 0 + if (Hsa::signal_load_relaxed(signal_) > 0 && !(HIP_SKIP_ABORT_ON_GPU_ERROR && amd::Device::IsGPUInError())) { LogError("Runtime shouldn't destroy a signal that is still busy!"); - if (hsa_signal_wait_scacquire(signal_, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, + if (Hsa::signal_wait_scacquire(signal_, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, kUnlimitedWait, HSA_WAIT_STATE_BLOCKED) != 0) { } } - hsa_signal_destroy(signal_); + Hsa::signal_destroy(signal_); } } @@ -3578,11 +3568,11 @@ void callbackQueue(hsa_status_t status, hsa_queue_t* queue, void* data) { } // Abort on device exceptions. const char* errorMsg = 0; - hsa_status_string(status, &errorMsg); + Hsa::status_string(status, &errorMsg); if (status == HSA_STATUS_ERROR_OUT_OF_RESOURCES) { size_t global_available_mem = 0; if (HSA_STATUS_SUCCESS != - hsa_agent_get_info(dev->getBackendDevice(), + Hsa::agent_get_info(dev->getBackendDevice(), static_cast(HSA_AMD_AGENT_INFO_MEMORY_AVAIL), &global_available_mem)) { LogError("HSA_AMD_AGENT_INFO_MEMORY_AVAIL query failed."); diff --git a/projects/clr/rocclr/device/rocm/rocdevice.hpp b/projects/clr/rocclr/device/rocm/rocdevice.hpp index 414272da1a..944505f658 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.hpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009 - 2023 Advanced Micro Devices, Inc. +/* Copyright (c) 2009 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32,17 +32,13 @@ #include "thread/monitor.hpp" #include "utils/versions.hpp" +#include "device/rocm/rocrctx.hpp" #include "device/rocm/rocsettings.hpp" #include "device/rocm/rocvirtual.hpp" #include "device/rocm/rocdefs.hpp" #include "device/rocm/rocprintf.hpp" #include "device/rocm/rocglinterop.hpp" -#include "hsa/hsa.h" -#include "hsa/hsa_ext_image.h" -#include "hsa/hsa_ext_amd.h" -#include "hsa/hsa_ven_amd_loader.h" - #include #include #include @@ -305,12 +301,6 @@ class NullDevice : public amd::Device { #endif #endif - protected: - //! Initialize compiler instance and handle - static bool initCompiler(bool isOffline); - //! destroy compiler instance and handle - static bool destroyCompiler(); - private: static constexpr bool offlineDevice_ = true; }; diff --git a/projects/clr/rocclr/device/rocm/rocglinterop.hpp b/projects/clr/rocclr/device/rocm/rocglinterop.hpp index 478e45cd10..c19dd1be8b 100644 --- a/projects/clr/rocclr/device/rocm/rocglinterop.hpp +++ b/projects/clr/rocclr/device/rocm/rocglinterop.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2016 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -36,9 +36,9 @@ typedef _XDisplay Display; typedef __GLXcontextRec* GLXContext; #endif +#include "device/rocm/rocdevice.hpp" #include "device/rocm/mesa_glinterop.h" #include "device/rocm/rocregisters.hpp" -#include "hsa/hsa_ext_amd.h" namespace amd::roc { diff --git a/projects/clr/rocclr/device/rocm/rockernel.cpp b/projects/clr/rocclr/device/rocm/rockernel.cpp index 40c0490b53..91f46b59b9 100644 --- a/projects/clr/rocclr/device/rocm/rockernel.cpp +++ b/projects/clr/rocclr/device/rocm/rockernel.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2009 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,7 +19,6 @@ THE SOFTWARE. */ #include "rockernel.hpp" -#include "hsa/amd_hsa_kernel_code.h" #include @@ -46,7 +45,7 @@ bool Kernel::postLoad() { hsa_status_t hsaStatus; hsa_executable_symbol_t symbol; hsa_agent_t agent = program()->rocDevice().getBackendDevice(); - hsaStatus = hsa_executable_get_symbol_by_name(program()->hsaExecutable(), symbolName().c_str(), + hsaStatus = Hsa::executable_get_symbol_by_name(program()->hsaExecutable(), symbolName().c_str(), &agent, &symbol); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError("Cannot Get Symbol : %s, failed with hsa_status: %d \n", symbolName().c_str(), @@ -54,7 +53,7 @@ bool Kernel::postLoad() { return false; } - hsaStatus = hsa_executable_symbol_get_info(symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, + hsaStatus = Hsa::executable_symbol_get_info(symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT, &kernelCodeHandle_); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError(" Cannot Get Symbol Info: %s, failed with hsa_status: %d \n ", @@ -62,7 +61,7 @@ bool Kernel::postLoad() { return false; } - hsaStatus = hsa_executable_symbol_get_info( + hsaStatus = Hsa::executable_symbol_get_info( symbol, HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK, &kernelHasDynamicCallStack_); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError(" Cannot Get Dynamic callstack info, failed with hsa_status: %d \n ", @@ -80,7 +79,7 @@ bool Kernel::postLoad() { // retrieve the kernel code object handle of such a kernel. The address of the variable and the // kernel code object handle are known only after the hsa executable is loaded. The below code // copies the kernel code object handle to the address of the variable. - hsaStatus = hsa_executable_get_symbol_by_name(program()->hsaExecutable(), + hsaStatus = Hsa::executable_get_symbol_by_name(program()->hsaExecutable(), RuntimeHandle().c_str(), &agent, &kernelSymbol); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError("Cannot get Kernel Symbol by name: %s, failed with hsa_status: %d \n", @@ -88,7 +87,7 @@ bool Kernel::postLoad() { return false; } - hsaStatus = hsa_executable_symbol_get_info( + hsaStatus = Hsa::executable_symbol_get_info( kernelSymbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE, &variable_size); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError( @@ -96,7 +95,7 @@ bool Kernel::postLoad() { return false; } - hsaStatus = hsa_executable_symbol_get_info( + hsaStatus = Hsa::executable_symbol_get_info( kernelSymbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS, &variable_address); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError("[ROC][Kernel] Cannot get Kernel Address, failed with hsa_status: %d \n", @@ -107,7 +106,7 @@ bool Kernel::postLoad() { const struct RuntimeHandle runtime_handle = { kernelCodeHandle_, WorkitemPrivateSegmentByteSize(), WorkgroupGroupSegmentByteSize()}; hsaStatus = - hsa_memory_copy(reinterpret_cast(variable_address), &runtime_handle, variable_size); + Hsa::memory_copy(reinterpret_cast(variable_address), &runtime_handle, variable_size); if (hsaStatus != HSA_STATUS_SUCCESS) { DevLogPrintfError("[ROC][Kernel] HSA Memory copy failed, failed with hsa_status: %d \n", @@ -121,8 +120,8 @@ bool Kernel::postLoad() { // We set the value to HSA if the value is uninitialized uint32_t wavefront_size = workGroupInfo_.wavefrontPerSIMD_; if (wavefront_size == 0 && - hsa_agent_get_info(program()->rocDevice().getBackendDevice(), HSA_AGENT_INFO_WAVEFRONT_SIZE, - &wavefront_size) != HSA_STATUS_SUCCESS) { + Hsa::agent_get_info(program()->rocDevice().getBackendDevice(), HSA_AGENT_INFO_WAVEFRONT_SIZE, + &wavefront_size) != HSA_STATUS_SUCCESS) { DevLogPrintfError("[ROC][Kernel] Cannot get Wavefront Size, failed with hsa_status: %d \n", hsaStatus); return false; diff --git a/projects/clr/rocclr/device/rocm/rocmemory.cpp b/projects/clr/rocclr/device/rocm/rocmemory.cpp index 136b8f69b0..743f33173f 100644 --- a/projects/clr/rocclr/device/rocm/rocmemory.cpp +++ b/projects/clr/rocclr/device/rocm/rocmemory.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008 - 2023 Advanced Micro Devices, Inc. +/* Copyright (c) 2008 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -212,8 +212,8 @@ hsa_status_t Memory::interopMapBuffer(amd::Os::FileDesc fdn) { #else auto fd = fdn; #endif - hsa_status_t status = hsa_amd_interop_map_buffer(1, &agent, fd, 0, &size, &interop_deviceMemory_, - &metadata_size, (const void**)&metadata); + hsa_status_t status = Hsa::interop_map_buffer(1, &agent, fd, 0, &size, &interop_deviceMemory_, + &metadata_size, (const void**)&metadata); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Map Interop memory %p, size 0x%zx", interop_deviceMemory_, size); deviceMemory_ = static_cast(interop_deviceMemory_); // + out.buf_offset; @@ -254,7 +254,7 @@ bool Memory::createInteropBuffer(GLenum targetType, int miplevel) { hsa_agent_t agent = dev().getBackendDevice(); uint32_t id; - hsa_agent_get_info(agent, static_cast(HSA_AMD_AGENT_INFO_CHIP_ID), &id); + Hsa::agent_get_info(agent, static_cast(HSA_AMD_AGENT_INFO_CHIP_ID), &id); static constexpr int MaxMetadataSizeDwords = 64; static constexpr int MaxMetadataSizeBytes = MaxMetadataSizeDwords * sizeof(int); @@ -293,7 +293,7 @@ bool Memory::createInteropBuffer(GLenum targetType, int miplevel) { void Memory::destroyInteropBuffer() { assert(kind_ == MEMORY_KIND_INTEROP && "Memory must be interop type."); - hsa_amd_interop_unmap_buffer(interop_deviceMemory_); + Hsa::interop_unmap_buffer(interop_deviceMemory_); ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Unmap GL memory %p", deviceMemory_); deviceMemory_ = nullptr; } @@ -622,7 +622,7 @@ Buffer::~Buffer() { if (owner()->ipcShared()) { // Detach the memory from HSA - auto hsa_status = hsa_amd_ipc_memory_detach(owner()->getSvmPtr()); + auto hsa_status = Hsa::ipc_memory_detach(owner()->getSvmPtr()); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("HSA failed to detach memory with status: %d", hsa_status); } @@ -665,9 +665,8 @@ void Buffer::destroy() { dev().memFree(deviceMemory_, size()); } } else if (memFlags & ROCCLR_MEM_HSA_SIGNAL_MEMORY) { - if (HSA_STATUS_SUCCESS != hsa_signal_destroy(signal_)) { - ClPrint(amd::LOG_ERROR, amd::LOG_MEM, - "hsa_signal_destroy failed"); + if (HSA_STATUS_SUCCESS != Hsa::signal_destroy(signal_)) { + ClPrint(amd::LOG_ERROR, amd::LOG_MEM, "hsa_signal_destroy failed"); } deviceMemory_ = nullptr; } else { @@ -680,7 +679,7 @@ void Buffer::destroy() { if (memFlags & CL_MEM_USE_HOST_PTR) { // unlock svm host pointer from memory pool if (!dev().info().hmmSupported_) { - hsa_amd_memory_unlock(owner()->getSvmPtr()); + Hsa::memory_unlock(owner()->getSvmPtr()); } // destroy system memory if (!(amd::Os::releaseMemory(deviceMemory_, size()))) { @@ -723,14 +722,14 @@ void Buffer::destroy() { if (needUnlockHostMem) { if (memFlags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)) { - if (dev().agent_profile() != HSA_PROFILE_FULL) hsa_amd_memory_unlock(owner()->getHostMem()); + if (dev().agent_profile() != HSA_PROFILE_FULL) Hsa::memory_unlock(owner()->getHostMem()); } } } if (memFlags & CL_MEM_USE_HOST_PTR) { if (dev().agent_profile() == HSA_PROFILE_FULL) { - hsa_memory_deregister(owner()->getHostMem(), size()); + Hsa::memory_deregister(owner()->getHostMem(), size()); } } } @@ -759,7 +758,7 @@ bool Buffer::create(bool alloc_local) { // Extra 1 for the current device const uint32_t ipc_agents_num = dev().p2pAgents().size() + 1; // Retrieve the devPtr from the handle - auto hsa_status = hsa_amd_ipc_memory_attach( + auto hsa_status = Hsa::ipc_memory_attach( reinterpret_cast( reinterpret_cast(owner())->Handle()), owner()->getSize(), ipc_agents_num, dev().IpcAgents(), &orig_dev_ptr); @@ -832,14 +831,14 @@ bool Buffer::create(bool alloc_local) { } else if (memFlags & ROCCLR_MEM_HSA_SIGNAL_MEMORY) { // TODO: ROCr will introduce a new attribute enum that implies a non-blocking signal, // replace "HSA_AMD_SIGNAL_AMD_GPU_ONLY" with this new enum when it is ready. - if (HSA_STATUS_SUCCESS != hsa_amd_signal_create(kInitSignalValueOne, 0, nullptr, - HSA_AMD_SIGNAL_AMD_GPU_ONLY, &signal_)) { + if (HSA_STATUS_SUCCESS != Hsa::signal_create(kInitSignalValueOne, 0, nullptr, + HSA_AMD_SIGNAL_AMD_GPU_ONLY, &signal_)) { ClPrint(amd::LOG_ERROR, amd::LOG_MEM, "hsa_amd_signal_create signal failed"); return false; } volatile hsa_signal_value_t* signalValuePtr = nullptr; - if (HSA_STATUS_SUCCESS != hsa_amd_signal_value_pointer(signal_, &signalValuePtr)) { + if (HSA_STATUS_SUCCESS != Hsa::signal_value_pointer(signal_, &signalValuePtr)) { ClPrint(amd::LOG_ERROR, amd::LOG_MEM, "hsa_amd_signal_value_pointer failed"); return false; @@ -1005,7 +1004,7 @@ bool Buffer::create(bool alloc_local) { deviceMemory_ = owner()->getHostMem(); if (memFlags & CL_MEM_USE_HOST_PTR) { - hsa_memory_register(deviceMemory_, size()); + Hsa::memory_register(deviceMemory_, size()); } return deviceMemory_ != nullptr; @@ -1042,7 +1041,7 @@ bool Buffer::ExportHandle(void* handle) const { orig_dev_ptr = owner()->getHostMem(); } - auto hsa_status = hsa_amd_ipc_memory_create(orig_dev_ptr, owner()->getSize(), + auto hsa_status = Hsa::ipc_memory_create(orig_dev_ptr, owner()->getSize(), reinterpret_cast(handle)); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Failed to create memory for IPC, failed with hsa_status: %d", hsa_status); @@ -1061,7 +1060,7 @@ bool Buffer::GetFDHandleForMem(void* dev_ptr, size_t size, bool vmm, void* handl hsa_amd_vmem_alloc_handle_t mem_handle; // Retrieve the corresponding phys_mem handle for the mapped dev_ptr. - hsa_status_t hsa_status = hsa_amd_vmem_retain_alloc_handle(&mem_handle, dev_ptr); + hsa_status_t hsa_status = Hsa::vmem_retain_alloc_handle(&mem_handle, dev_ptr); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Cannot retain alloc handle for dev_ptr: 0x%x hsa returned status: %d", dev_ptr, hsa_status); @@ -1069,7 +1068,7 @@ bool Buffer::GetFDHandleForMem(void* dev_ptr, size_t size, bool vmm, void* handl } // Now, retrieve the shareable handle (fd in linux) for the phys_mem handle. - hsa_status = hsa_amd_vmem_export_shareable_handle(&dmabuffd, mem_handle, 0); + hsa_status = Hsa::vmem_export_shareable_handle(&dmabuffd, mem_handle, 0); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError("Cannot get shareable handle for mem_handle: %lu, hsa returned status: %d", mem_handle, hsa_status); @@ -1077,7 +1076,7 @@ bool Buffer::GetFDHandleForMem(void* dev_ptr, size_t size, bool vmm, void* handl } } else { // Retrieve a shareable handle for the device ptr. - hsa_status_t hsa_status = hsa_amd_portable_export_dmabuf(dev_ptr, size, &dmabuffd, &offset); + hsa_status_t hsa_status = Hsa::portable_export_dmabuf(dev_ptr, size, &dmabuffd, &offset); if (hsa_status != HSA_STATUS_SUCCESS) { LogPrintfError( "Cannot export a portable fd for dev_ptr: 0x%x with size: %lu," @@ -1244,8 +1243,8 @@ bool Image::createInteropImage() { originalDeviceMemory_ = deviceMemory_; if (obj->getGLTarget() == GL_TEXTURE_BUFFER) { - hsa_status_t err = hsa_ext_image_create(dev().getBackendDevice(), &imageDescriptor_, - originalDeviceMemory_, permission_, &hsaImageObject_); + hsa_status_t err = Hsa::image_create(dev().getBackendDevice(), &imageDescriptor_, + originalDeviceMemory_, permission_, &hsaImageObject_); return (err == HSA_STATUS_SUCCESS); } @@ -1263,8 +1262,8 @@ bool Image::createInteropImage() { } hsa_status_t err = - hsa_amd_image_create(dev().getBackendDevice(), &imageDescriptor_, amdImageDesc_, - originalDeviceMemory_, permission_, &hsaImageObject_); + Hsa::image_create(dev().getBackendDevice(), &imageDescriptor_, amdImageDesc_, + originalDeviceMemory_, permission_, &hsaImageObject_); if (err != HSA_STATUS_SUCCESS) return false; return true; @@ -1302,8 +1301,8 @@ bool Image::create(bool alloc_local) { } // Get memory size requirement for device specific image. - hsa_status_t status = hsa_ext_image_data_get_info(dev().getBackendDevice(), &imageDescriptor_, - permission_, &deviceImageInfo_); + hsa_status_t status = Hsa::image_data_get_info(dev().getBackendDevice(), &imageDescriptor_, + permission_, &deviceImageInfo_); if (status != HSA_STATUS_SUCCESS) { LogPrintfError("Fail to allocate image memory, failed with hsa_status: %d", status); @@ -1340,8 +1339,8 @@ bool Image::create(bool alloc_local) { assert(amd::isMultipleOf(deviceMemory_, static_cast(deviceImageInfo_.alignment))); - status = hsa_ext_image_create(dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, - permission_, &hsaImageObject_); + status = Hsa::image_create(dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, + permission_, &hsaImageObject_); if (status != HSA_STATUS_SUCCESS) { LogPrintfError("[OCL] Fail to allocate image memory, failed with hsa_status: %d \n", status); @@ -1388,7 +1387,7 @@ bool Image::createView(const Memory& parent) { rowPitch = elementSize * amd::alignUp(rowPitch, (dev().info().imagePitchAlignment_ / elementSize)); - status = hsa_ext_image_create_with_layout( + status = Hsa::image_create_with_layout( dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR, rowPitch, 0, &hsaImageObject_); @@ -1409,7 +1408,7 @@ bool Image::createView(const Memory& parent) { break; } hsa_ext_image_t hsaImage; - if (HSA_STATUS_SUCCESS == hsa_ext_image_create_with_layout( + if (HSA_STATUS_SUCCESS == Hsa::image_create_with_layout( dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR, tryPitch, 0, &hsaImage)) { @@ -1417,8 +1416,8 @@ bool Image::createView(const Memory& parent) { LogWarning("[OCL] will use copy image"); workaround = true; // Free the image. - hsa_ext_image_destroy(dev().getBackendDevice(), hsaImage); - hsa_ext_image_destroy(dev().getBackendDevice(), hsaImageObject_); + Hsa::image_destroy(dev().getBackendDevice(), hsaImage); + Hsa::image_destroy(dev().getBackendDevice(), hsaImageObject_); hsaImageObject_.handle = 0; break; } @@ -1436,11 +1435,11 @@ bool Image::createView(const Memory& parent) { } } else if (kind_ == MEMORY_KIND_INTEROP) { amdImageDesc_ = static_cast(parent.owner()->getDeviceMemory(dev()))->amdImageDesc_; - status = hsa_amd_image_create(dev().getBackendDevice(), &imageDescriptor_, amdImageDesc_, - deviceMemory_, permission_, &hsaImageObject_); + status = Hsa::image_create(dev().getBackendDevice(), &imageDescriptor_, amdImageDesc_, + deviceMemory_, permission_, &hsaImageObject_); } else { - status = hsa_ext_image_create(dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, - permission_, &hsaImageObject_); + status = Hsa::image_create(dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, + permission_, &hsaImageObject_); } if (status != HSA_STATUS_SUCCESS) { @@ -1537,7 +1536,7 @@ void Image::destroy() { delete copyImageBuffer_; if (hsaImageObject_.handle != 0 && ownsHsaImageObject_) { - hsa_status_t status = hsa_ext_image_destroy(dev().getBackendDevice(), hsaImageObject_); + hsa_status_t status = Hsa::image_destroy(dev().getBackendDevice(), hsaImageObject_); assert(status == HSA_STATUS_SUCCESS); } // Don't destroy memory if it's a view. Parent will destroy the original allocation. diff --git a/projects/clr/rocclr/device/rocm/rocprintf.cpp b/projects/clr/rocclr/device/rocm/rocprintf.cpp index 4ed427f3a0..cef7ab5b56 100644 --- a/projects/clr/rocclr/device/rocm/rocprintf.cpp +++ b/projects/clr/rocclr/device/rocm/rocprintf.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2010 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -405,7 +405,7 @@ bool PrintfDbg::init(bool printfEnabled) { // Copy offset and number of bytes available for printf data // into the corresponding location in the debug buffer - hsa_status_t err = hsa_memory_copy(dbgBuffer_, sysMem, 2 * sizeof(uint32_t)); + hsa_status_t err = Hsa::memory_copy(dbgBuffer_, sysMem, 2 * sizeof(uint32_t)); if (err != HSA_STATUS_SUCCESS) { LogPrintfError( "\n Can't copy offset and bytes available data to dgbBuffer_," diff --git a/projects/clr/rocclr/device/rocm/rocprogram.cpp b/projects/clr/rocclr/device/rocm/rocprogram.cpp index c0e0a952ce..63502560fc 100644 --- a/projects/clr/rocclr/device/rocm/rocprogram.cpp +++ b/projects/clr/rocclr/device/rocm/rocprogram.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2008 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23,8 +23,6 @@ #include "utils/options.hpp" #include "rockernel.hpp" -#include "hsa/amd_hsa_kernel_code.h" - #include #include #include @@ -37,7 +35,7 @@ namespace amd::roc { static inline const char* hsa_strerror(hsa_status_t status) { const char* str = nullptr; - if (hsa_status_string(status, &str) == HSA_STATUS_SUCCESS) { + if (Hsa::status_string(status, &str) == HSA_STATUS_SUCCESS) { return str; } return "Unknown error"; @@ -46,10 +44,10 @@ static inline const char* hsa_strerror(hsa_status_t status) { Program::~Program() { // Destroy the executable. if (hsaExecutable_.handle != 0) { - hsa_executable_destroy(hsaExecutable_); + Hsa::executable_destroy(hsaExecutable_); } if (hsaCodeObjectReader_.handle != 0) { - hsa_code_object_reader_destroy(hsaCodeObjectReader_); + Hsa::code_object_reader_destroy(hsaCodeObjectReader_); } releaseClBinary(); } @@ -102,7 +100,7 @@ bool Program::defineGlobalVar(const char* name, void* dptr) { hsa_agent_t hsa_device = rocDevice().getBackendDevice(); hsa_status_t status = - hsa_executable_agent_global_variable_define(hsaExecutable_, hsa_device, name, dptr); + Hsa::executable_agent_global_variable_define(hsaExecutable_, hsa_device, name, dptr); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Could not define global variable : "; buildLog_ += hsa_strerror(status); @@ -134,7 +132,7 @@ bool Program::createGlobalVarObj(amd::Memory** amd_mem_obj, void** device_pptr, /* Find HSA Symbol by name */ status = - hsa_executable_get_symbol_by_name(hsaExecutable_, global_name, &hsa_device, &global_symbol); + Hsa::executable_get_symbol_by_name(hsaExecutable_, global_name, &hsa_device, &global_symbol); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Failed to find the Symbol by Name: "; buildLog_ += hsa_strerror(status); @@ -144,7 +142,7 @@ bool Program::createGlobalVarObj(amd::Memory** amd_mem_obj, void** device_pptr, /* Find HSA Symbol Type */ status = - hsa_executable_symbol_get_info(global_symbol, HSA_EXECUTABLE_SYMBOL_INFO_TYPE, &sym_type); + Hsa::executable_symbol_get_info(global_symbol, HSA_EXECUTABLE_SYMBOL_INFO_TYPE, &sym_type); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Failed to find the Symbol Type : "; buildLog_ += hsa_strerror(status); @@ -161,7 +159,7 @@ bool Program::createGlobalVarObj(amd::Memory** amd_mem_obj, void** device_pptr, } /* Retrieve the size of the variable */ - status = hsa_executable_symbol_get_info(global_symbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE, + status = Hsa::executable_symbol_get_info(global_symbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE, bytes); if (status != HSA_STATUS_SUCCESS) { @@ -174,7 +172,7 @@ bool Program::createGlobalVarObj(amd::Memory** amd_mem_obj, void** device_pptr, // Handle size 0 symbols if (*bytes != 0) { // Find HSA Symbol Address - status = hsa_executable_symbol_get_info( + status = Hsa::executable_symbol_get_info( global_symbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS, device_pptr); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Failed to find the Symbol Address : "; @@ -288,7 +286,7 @@ bool LightningProgram::setKernels(void* binary, size_t binSize, amd::Os::FileDes hsa_agent_t agent = rocDevice().getBackendDevice(); hsa_status_t status; - status = hsa_executable_create_alt(HSA_PROFILE_FULL, HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT, + status = Hsa::executable_create_alt(HSA_PROFILE_FULL, HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT, nullptr, &hsaExecutable_); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Executable for AMD HSA Code Object isn't created: "; @@ -300,7 +298,7 @@ bool LightningProgram::setKernels(void* binary, size_t binSize, amd::Os::FileDes // Load the code object, either with file descriptor and offset // or binary image and binary size with URI // or binary image and binary size - status = hsa_code_object_reader_create_from_memory(binary, binSize, &hsaCodeObjectReader_); + status = Hsa::code_object_reader_create_from_memory(binary, binSize, &hsaCodeObjectReader_); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: AMD HSA Code Object Reader create failed: "; buildLog_ += hsa_strerror(status); @@ -308,7 +306,7 @@ bool LightningProgram::setKernels(void* binary, size_t binSize, amd::Os::FileDes return false; } - status = hsa_executable_load_agent_code_object(hsaExecutable_, agent, hsaCodeObjectReader_, + status = Hsa::executable_load_agent_code_object(hsaExecutable_, agent, hsaCodeObjectReader_, nullptr, nullptr); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: AMD HSA Code Object loading failed: "; @@ -318,7 +316,7 @@ bool LightningProgram::setKernels(void* binary, size_t binSize, amd::Os::FileDes } // Freeze the executable. - status = hsa_executable_freeze(hsaExecutable_, nullptr); + status = Hsa::executable_freeze(hsaExecutable_, nullptr); if (status != HSA_STATUS_SUCCESS) { buildLog_ += "Error: Freezing the executable failed: "; buildLog_ += hsa_strerror(status); diff --git a/projects/clr/rocclr/device/rocm/rocrctx.cpp b/projects/clr/rocclr/device/rocm/rocrctx.cpp new file mode 100644 index 0000000000..63308eed8a --- /dev/null +++ b/projects/clr/rocclr/device/rocm/rocrctx.cpp @@ -0,0 +1,143 @@ +/* Copyright (c) 2025 Advanced Micro Devices, Inc. + + 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. */ + +#include "os/os.hpp" +#include "utils/flags.hpp" +#include "rocrctx.hpp" + +namespace amd { +namespace roc { + +std::once_flag Hsa::initialized; +RocrEntryPoints Hsa::cep_; +bool Hsa::is_ready_ = false; + +bool Hsa::LoadLib() { +#if defined(ROCR_DYN_DLL) + static const char* rocr_lib_name = WINDOWS_SWITCH("hsa-runtime64.dll", "hsa-runtime64.so.1"); + cep_.handle = Os::loadLibrary(rocr_lib_name); + if (nullptr == cep_.handle) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Failed to load COMGR library."); + return false; + } +#endif + GET_ROCR_SYMBOL(hsa_init) + GET_ROCR_SYMBOL(hsa_shut_down) + GET_ROCR_SYMBOL(hsa_system_get_info) + GET_ROCR_SYMBOL(hsa_iterate_agents) + GET_ROCR_SYMBOL(hsa_agent_get_info) + GET_ROCR_SYMBOL(hsa_queue_create) + GET_ROCR_SYMBOL(hsa_queue_destroy) + GET_ROCR_SYMBOL(hsa_queue_load_read_index_scacquire) + GET_ROCR_SYMBOL(hsa_queue_load_read_index_relaxed) + GET_ROCR_SYMBOL(hsa_queue_load_write_index_relaxed) + GET_ROCR_SYMBOL(hsa_queue_add_write_index_screlease) + GET_ROCR_SYMBOL(hsa_memory_register) + GET_ROCR_SYMBOL(hsa_memory_deregister) + GET_ROCR_SYMBOL(hsa_memory_copy) + GET_ROCR_SYMBOL(hsa_signal_create) + GET_ROCR_SYMBOL(hsa_signal_destroy) + GET_ROCR_SYMBOL(hsa_signal_load_relaxed) + GET_ROCR_SYMBOL(hsa_signal_store_relaxed) + GET_ROCR_SYMBOL(hsa_signal_silent_store_relaxed) + GET_ROCR_SYMBOL(hsa_signal_store_screlease) + GET_ROCR_SYMBOL(hsa_signal_wait_scacquire) + GET_ROCR_SYMBOL(hsa_signal_add_relaxed) + GET_ROCR_SYMBOL(hsa_signal_subtract_relaxed) + GET_ROCR_SYMBOL(hsa_isa_get_info_alt) + GET_ROCR_SYMBOL(hsa_agent_iterate_isas) + GET_ROCR_SYMBOL(hsa_system_get_major_extension_table) + GET_ROCR_SYMBOL(hsa_status_string) + GET_ROCR_SYMBOL(hsa_executable_create_alt) + GET_ROCR_SYMBOL(hsa_executable_destroy) + GET_ROCR_SYMBOL(hsa_executable_get_info) + GET_ROCR_SYMBOL(hsa_code_object_reader_destroy) + GET_ROCR_SYMBOL(hsa_code_object_reader_create_from_memory) + GET_ROCR_SYMBOL(hsa_executable_load_agent_code_object) + GET_ROCR_SYMBOL(hsa_executable_agent_global_variable_define) + GET_ROCR_SYMBOL(hsa_executable_get_symbol_by_name) + GET_ROCR_SYMBOL(hsa_executable_symbol_get_info) + GET_ROCR_SYMBOL(hsa_executable_freeze) + // AMD extensions + GET_ROCR_SYMBOL(hsa_amd_coherency_set_type) + GET_ROCR_SYMBOL(hsa_amd_profiling_set_profiler_enabled) + GET_ROCR_SYMBOL(hsa_amd_profiling_async_copy_enable) + GET_ROCR_SYMBOL(hsa_amd_profiling_get_dispatch_time) + GET_ROCR_SYMBOL(hsa_amd_profiling_get_async_copy_time) + GET_ROCR_SYMBOL(hsa_amd_signal_async_handler) + GET_ROCR_SYMBOL(hsa_amd_queue_cu_set_mask) + GET_ROCR_SYMBOL(hsa_amd_memory_pool_get_info) + GET_ROCR_SYMBOL(hsa_amd_agent_iterate_memory_pools) + GET_ROCR_SYMBOL(hsa_amd_memory_pool_allocate) + GET_ROCR_SYMBOL(hsa_amd_memory_pool_free) + GET_ROCR_SYMBOL(hsa_amd_memory_async_copy) + GET_ROCR_SYMBOL(hsa_amd_memory_async_copy_on_engine) + GET_ROCR_SYMBOL(hsa_amd_memory_copy_engine_status) + GET_ROCR_SYMBOL(hsa_amd_agent_memory_pool_get_info) + GET_ROCR_SYMBOL(hsa_amd_agents_allow_access) + GET_ROCR_SYMBOL(hsa_amd_memory_unlock) + GET_ROCR_SYMBOL(hsa_amd_interop_map_buffer) + GET_ROCR_SYMBOL(hsa_amd_interop_unmap_buffer) + GET_ROCR_SYMBOL(hsa_amd_image_create) + GET_ROCR_SYMBOL(hsa_amd_pointer_info) + GET_ROCR_SYMBOL(hsa_amd_ipc_memory_create) + GET_ROCR_SYMBOL(hsa_amd_ipc_memory_attach) + GET_ROCR_SYMBOL(hsa_amd_ipc_memory_detach) + GET_ROCR_SYMBOL(hsa_amd_signal_create) + GET_ROCR_SYMBOL(hsa_amd_register_system_event_handler) + GET_ROCR_SYMBOL(hsa_amd_queue_set_priority) + GET_ROCR_SYMBOL(hsa_amd_memory_async_copy_rect) + GET_ROCR_SYMBOL(hsa_amd_memory_lock_to_pool) + GET_ROCR_SYMBOL(hsa_amd_signal_value_pointer) + GET_ROCR_SYMBOL(hsa_amd_svm_attributes_set) + GET_ROCR_SYMBOL(hsa_amd_svm_attributes_get) + GET_ROCR_SYMBOL(hsa_amd_svm_prefetch_async) + GET_ROCR_SYMBOL(hsa_amd_portable_export_dmabuf) + GET_ROCR_SYMBOL(hsa_amd_portable_close_dmabuf) + GET_ROCR_SYMBOL(hsa_amd_vmem_address_reserve) + GET_ROCR_SYMBOL(hsa_amd_vmem_address_free) + GET_ROCR_SYMBOL(hsa_amd_vmem_handle_create) + GET_ROCR_SYMBOL(hsa_amd_vmem_handle_release) + GET_ROCR_SYMBOL(hsa_amd_vmem_map) + GET_ROCR_SYMBOL(hsa_amd_vmem_unmap) + GET_ROCR_SYMBOL(hsa_amd_vmem_set_access) + GET_ROCR_SYMBOL(hsa_amd_vmem_get_access) + GET_ROCR_SYMBOL(hsa_amd_vmem_export_shareable_handle) + GET_ROCR_SYMBOL(hsa_amd_vmem_import_shareable_handle) + GET_ROCR_SYMBOL(hsa_amd_vmem_retain_alloc_handle) + GET_ROCR_SYMBOL(hsa_amd_agent_set_async_scratch_limit) + GET_ROCR_SYMBOL(hsa_amd_vmem_address_reserve_align) + GET_ROCR_SYMBOL(hsa_amd_enable_logging) + GET_ROCR_SYMBOL(hsa_amd_memory_get_preferred_copy_engine) + + // Image extensions + GET_ROCR_SYMBOL(hsa_ext_image_data_get_info) + GET_ROCR_SYMBOL(hsa_ext_image_create) + GET_ROCR_SYMBOL(hsa_ext_image_import) + GET_ROCR_SYMBOL(hsa_ext_image_export) + GET_ROCR_SYMBOL(hsa_ext_image_destroy) + GET_ROCR_SYMBOL(hsa_ext_sampler_create_v2) + GET_ROCR_SYMBOL(hsa_ext_sampler_destroy) + GET_ROCR_SYMBOL(hsa_ext_image_create_with_layout) + is_ready_ = true; + return true; +} +} // namespace roc +} // namespace amd diff --git a/projects/clr/rocclr/device/rocm/rocrctx.hpp b/projects/clr/rocclr/device/rocm/rocrctx.hpp new file mode 100644 index 0000000000..73a1cded43 --- /dev/null +++ b/projects/clr/rocclr/device/rocm/rocrctx.hpp @@ -0,0 +1,571 @@ +/* Copyright (c) 2025 Advanced Micro Devices, Inc. + + 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. */ + +#pragma once + +#include +#include "top.hpp" + +#ifdef ROCR_DYN_DLL +#include "hsa.h" +#include "hsa_ext_image.h" +#include "hsa_ext_amd.h" +#include "amd_hsa_signal.h" +#include "hsa_ven_amd_loader.h" +#include "hsa_ven_amd_aqlprofile.h" +#else +#include "hsa/hsa.h" +#include "hsa/hsa_ext_image.h" +#include "hsa/hsa_ext_amd.h" +#include "hsa/amd_hsa_signal.h" +#include "hsa/hsa_ven_amd_loader.h" +#include "hsa/hsa_ven_amd_aqlprofile.h" +#endif + +namespace amd { +namespace roc { + +struct RocrEntryPoints { + void* handle; + + // Core functionality + decltype(hsa_init)* hsa_init_; + decltype(hsa_shut_down)* hsa_shut_down_; + decltype(hsa_system_get_info)* hsa_system_get_info_; + decltype(hsa_iterate_agents)* hsa_iterate_agents_; + decltype(hsa_agent_get_info)* hsa_agent_get_info_; + decltype(hsa_queue_create)* hsa_queue_create_; + decltype(hsa_queue_destroy)* hsa_queue_destroy_; + decltype(hsa_queue_load_read_index_scacquire)* hsa_queue_load_read_index_scacquire_; + decltype(hsa_queue_load_read_index_relaxed)* hsa_queue_load_read_index_relaxed_; + decltype(hsa_queue_load_write_index_relaxed)* hsa_queue_load_write_index_relaxed_; + decltype(hsa_queue_add_write_index_screlease)* hsa_queue_add_write_index_screlease_; + decltype(hsa_memory_register)* hsa_memory_register_; + decltype(hsa_memory_deregister)* hsa_memory_deregister_; + decltype(hsa_memory_copy)* hsa_memory_copy_; + decltype(hsa_signal_create)* hsa_signal_create_; + decltype(hsa_signal_destroy)* hsa_signal_destroy_; + decltype(hsa_signal_load_relaxed)* hsa_signal_load_relaxed_; + decltype(hsa_signal_store_relaxed)* hsa_signal_store_relaxed_; + decltype(hsa_signal_silent_store_relaxed)* hsa_signal_silent_store_relaxed_; + decltype(hsa_signal_store_screlease)* hsa_signal_store_screlease_; + decltype(hsa_signal_wait_scacquire)* hsa_signal_wait_scacquire_; + decltype(hsa_signal_add_relaxed)* hsa_signal_add_relaxed_; + decltype(hsa_signal_subtract_relaxed)* hsa_signal_subtract_relaxed_; + decltype(hsa_isa_get_info_alt)* hsa_isa_get_info_alt_; + decltype(hsa_agent_iterate_isas)* hsa_agent_iterate_isas_; + decltype(hsa_system_get_major_extension_table)* hsa_system_get_major_extension_table_; + decltype(hsa_status_string)* hsa_status_string_; + decltype(hsa_executable_create_alt)* hsa_executable_create_alt_; + decltype(hsa_executable_destroy)* hsa_executable_destroy_; + decltype(hsa_executable_get_info)* hsa_executable_get_info_; + decltype(hsa_code_object_reader_destroy)* hsa_code_object_reader_destroy_; + decltype(hsa_code_object_reader_create_from_memory)* hsa_code_object_reader_create_from_memory_; + decltype(hsa_executable_load_agent_code_object)* hsa_executable_load_agent_code_object_; + decltype(hsa_executable_agent_global_variable_define)* + hsa_executable_agent_global_variable_define_; + decltype(hsa_executable_get_symbol_by_name)* hsa_executable_get_symbol_by_name_; + decltype(hsa_executable_symbol_get_info)* hsa_executable_symbol_get_info_; + decltype(hsa_executable_freeze)* hsa_executable_freeze_; + // AMD extensions + decltype(hsa_amd_coherency_set_type)* hsa_amd_coherency_set_type_; + decltype(hsa_amd_profiling_set_profiler_enabled)* hsa_amd_profiling_set_profiler_enabled_; + decltype(hsa_amd_profiling_async_copy_enable)* hsa_amd_profiling_async_copy_enable_; + decltype(hsa_amd_profiling_get_dispatch_time)* hsa_amd_profiling_get_dispatch_time_; + decltype(hsa_amd_profiling_get_async_copy_time)* hsa_amd_profiling_get_async_copy_time_; + decltype(hsa_amd_signal_async_handler)* hsa_amd_signal_async_handler_; + decltype(hsa_amd_queue_cu_set_mask)* hsa_amd_queue_cu_set_mask_; + decltype(hsa_amd_memory_pool_get_info)* hsa_amd_memory_pool_get_info_; + decltype(hsa_amd_agent_iterate_memory_pools)* hsa_amd_agent_iterate_memory_pools_; + decltype(hsa_amd_memory_pool_allocate)* hsa_amd_memory_pool_allocate_; + decltype(hsa_amd_memory_pool_free)* hsa_amd_memory_pool_free_; + decltype(hsa_amd_memory_async_copy)* hsa_amd_memory_async_copy_; + decltype(hsa_amd_memory_async_copy_on_engine)* hsa_amd_memory_async_copy_on_engine_; + decltype(hsa_amd_memory_copy_engine_status)* hsa_amd_memory_copy_engine_status_; + decltype(hsa_amd_agent_memory_pool_get_info)* hsa_amd_agent_memory_pool_get_info_; + decltype(hsa_amd_agents_allow_access)* hsa_amd_agents_allow_access_; + decltype(hsa_amd_memory_unlock)* hsa_amd_memory_unlock_; + decltype(hsa_amd_interop_map_buffer)* hsa_amd_interop_map_buffer_; + decltype(hsa_amd_interop_unmap_buffer)* hsa_amd_interop_unmap_buffer_; + decltype(hsa_amd_image_create)* hsa_amd_image_create_; + decltype(hsa_amd_pointer_info)* hsa_amd_pointer_info_; + decltype(hsa_amd_ipc_memory_create)* hsa_amd_ipc_memory_create_; + decltype(hsa_amd_ipc_memory_attach)* hsa_amd_ipc_memory_attach_; + decltype(hsa_amd_ipc_memory_detach)* hsa_amd_ipc_memory_detach_; + decltype(hsa_amd_signal_create)* hsa_amd_signal_create_; + decltype(hsa_amd_register_system_event_handler)* hsa_amd_register_system_event_handler_; + decltype(hsa_amd_queue_set_priority)* hsa_amd_queue_set_priority_; + decltype(hsa_amd_memory_async_copy_rect)* hsa_amd_memory_async_copy_rect_; + decltype(hsa_amd_memory_lock_to_pool)* hsa_amd_memory_lock_to_pool_; + decltype(hsa_amd_signal_value_pointer)* hsa_amd_signal_value_pointer_; + decltype(hsa_amd_svm_attributes_set)* hsa_amd_svm_attributes_set_; + decltype(hsa_amd_svm_attributes_get)* hsa_amd_svm_attributes_get_; + decltype(hsa_amd_svm_prefetch_async)* hsa_amd_svm_prefetch_async_; + decltype(hsa_amd_portable_export_dmabuf)* hsa_amd_portable_export_dmabuf_; + decltype(hsa_amd_portable_close_dmabuf)* hsa_amd_portable_close_dmabuf_; // CLR doesn't use it? + decltype(hsa_amd_vmem_address_reserve)* hsa_amd_vmem_address_reserve_; + decltype(hsa_amd_vmem_address_free)* hsa_amd_vmem_address_free_; + decltype(hsa_amd_vmem_handle_create)* hsa_amd_vmem_handle_create_; + decltype(hsa_amd_vmem_handle_release)* hsa_amd_vmem_handle_release_; + decltype(hsa_amd_vmem_map)* hsa_amd_vmem_map_; + decltype(hsa_amd_vmem_unmap)* hsa_amd_vmem_unmap_; + decltype(hsa_amd_vmem_set_access)* hsa_amd_vmem_set_access_; + decltype(hsa_amd_vmem_get_access)* hsa_amd_vmem_get_access_; + decltype(hsa_amd_vmem_export_shareable_handle)* hsa_amd_vmem_export_shareable_handle_; + decltype(hsa_amd_vmem_import_shareable_handle)* hsa_amd_vmem_import_shareable_handle_; + decltype(hsa_amd_vmem_retain_alloc_handle)* hsa_amd_vmem_retain_alloc_handle_; + decltype(hsa_amd_agent_set_async_scratch_limit)* hsa_amd_agent_set_async_scratch_limit_; + decltype(hsa_amd_vmem_address_reserve_align)* hsa_amd_vmem_address_reserve_align_; + decltype(hsa_amd_enable_logging)* hsa_amd_enable_logging_; + decltype(hsa_amd_memory_get_preferred_copy_engine)* hsa_amd_memory_get_preferred_copy_engine_; + // Image extensions + decltype(hsa_ext_image_data_get_info)* hsa_ext_image_data_get_info_; + decltype(hsa_ext_image_create)* hsa_ext_image_create_; + decltype(hsa_ext_image_import)* hsa_ext_image_import_; + decltype(hsa_ext_image_export)* hsa_ext_image_export_; + decltype(hsa_ext_image_destroy)* hsa_ext_image_destroy_; + decltype(hsa_ext_sampler_create_v2)* hsa_ext_sampler_create_v2_; + decltype(hsa_ext_sampler_destroy)* hsa_ext_sampler_destroy_; + decltype(hsa_ext_image_create_with_layout)* hsa_ext_image_create_with_layout_; +}; + +#ifdef ROCR_DYN_DLL +#define ROCR_DYN(NAME) cep_.NAME##_ +#define GET_ROCR_SYMBOL(NAME) \ + cep_.NAME##_ = reinterpret_cast(Os::getSymbol(cep_.handle, #NAME)); \ + if (nullptr == cep_.NAME##_) { \ + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Failed to load ROCR function %s", #NAME); \ + return false; \ + } +#define GET_ROCR_OPTIONAL_SYMBOL(NAME) \ + cep_.NAME = reinterpret_cast(Os::getSymbol(cep_.handle, #NAME)); +#else +#define ROCR_DYN(NAME) NAME +#define GET_ROCR_SYMBOL(NAME) +#define GET_ROCR_OPTIONAL_SYMBOL(NAME) +#endif + +class Hsa : public amd::AllStatic { + public: + static std::once_flag initialized; + + static bool LoadLib(); + + static bool IsReady() { return is_ready_; } + + static hsa_status_t init() { return ROCR_DYN(hsa_init)(); } + static hsa_status_t shut_down() { return ROCR_DYN(hsa_shut_down)(); } + static hsa_status_t system_get_info(hsa_system_info_t attribute, void* value) { + return ROCR_DYN(hsa_system_get_info)(attribute, value); + } + static hsa_status_t iterate_agents(hsa_status_t (*callback)(hsa_agent_t agent, void* data), + void* data) { + return ROCR_DYN(hsa_iterate_agents)(callback, data); + } + static hsa_status_t agent_get_info(hsa_agent_t agent, hsa_agent_info_t attribute, void* value) { + return ROCR_DYN(hsa_agent_get_info)(agent, attribute, value); + } + static hsa_status_t queue_create(hsa_agent_t agent, uint32_t size, hsa_queue_type32_t type, + void (*callback)(hsa_status_t status, hsa_queue_t* source, + void* data), + void* data, uint32_t private_segment_size, + uint32_t group_segment_size, hsa_queue_t** queue) { + return ROCR_DYN(hsa_queue_create)(agent, size, type, callback, data, private_segment_size, + group_segment_size, queue); + } + static hsa_status_t queue_destroy(hsa_queue_t* queue) { + return ROCR_DYN(hsa_queue_destroy)(queue); + } + static uint64_t queue_load_read_index_scacquire(const hsa_queue_t* queue) { + return ROCR_DYN(hsa_queue_load_read_index_scacquire)(queue); + } + static uint64_t queue_load_read_index_relaxed(const hsa_queue_t* queue) { + return ROCR_DYN(hsa_queue_load_read_index_relaxed)(queue); + } + static uint64_t queue_load_write_index_relaxed(const hsa_queue_t* queue) { + return ROCR_DYN(hsa_queue_load_write_index_relaxed)(queue); + } + static uint64_t queue_add_write_index_screlease(const hsa_queue_t* queue, uint64_t value) { + return ROCR_DYN(hsa_queue_add_write_index_screlease)(queue, value); + } + static hsa_status_t memory_register(void* ptr, size_t size) { + return ROCR_DYN(hsa_memory_register)(ptr, size); + } + static hsa_status_t memory_deregister(void* ptr, size_t size) { + return ROCR_DYN(hsa_memory_deregister)(ptr, size); + } + static hsa_status_t memory_copy(void* dst, const void* src, size_t size) { + return ROCR_DYN(hsa_memory_copy)(dst, src, size); + } + static hsa_status_t signal_create(hsa_signal_value_t initial_value, uint32_t num_consumers, + const hsa_agent_t* consumers, hsa_signal_t* signal) { + return ROCR_DYN(hsa_signal_create)(initial_value, num_consumers, consumers, signal); + } + static hsa_status_t signal_destroy(hsa_signal_t signal) { + return ROCR_DYN(hsa_signal_destroy)(signal); + } + static hsa_signal_value_t signal_load_relaxed(hsa_signal_t signal) { + return ROCR_DYN(hsa_signal_load_relaxed)(signal); + } + static void signal_silent_store_relaxed(hsa_signal_t signal, hsa_signal_value_t value) { + ROCR_DYN(hsa_signal_silent_store_relaxed)(signal, value); + } + static void signal_store_relaxed(hsa_signal_t signal, hsa_signal_value_t value) { + ROCR_DYN(hsa_signal_store_relaxed)(signal, value); + } + static void signal_store_screlease(hsa_signal_t signal, hsa_signal_value_t value) { + ROCR_DYN(hsa_signal_store_screlease)(signal, value); + } + static hsa_signal_value_t signal_wait_scacquire(hsa_signal_t signal, + hsa_signal_condition_t condition, + hsa_signal_value_t compare_value, + uint64_t timeout_hint, + hsa_wait_state_t wait_state_hint) { + return ROCR_DYN(hsa_signal_wait_scacquire)(signal, condition, compare_value, timeout_hint, + wait_state_hint); + } + static void signal_add_relaxed(hsa_signal_t signal, hsa_signal_value_t value) { + ROCR_DYN(hsa_signal_add_relaxed)(signal, value); + } + static void signal_subtract_relaxed(hsa_signal_t signal, hsa_signal_value_t value) { + ROCR_DYN(hsa_signal_subtract_relaxed)(signal, value); + } + static hsa_status_t isa_get_info_alt(hsa_isa_t isa, hsa_isa_info_t attribute, void* value) { + return ROCR_DYN(hsa_isa_get_info_alt)(isa, attribute, value); + } + static hsa_status_t agent_iterate_isas(hsa_agent_t agent, + hsa_status_t (*callback)(hsa_isa_t isa, void* data), void* data) { + return ROCR_DYN(hsa_agent_iterate_isas)(agent, callback, data); + } + static hsa_status_t system_get_major_extension_table(uint16_t extension, uint16_t version_major, + size_t table_length, void* table) { + return ROCR_DYN(hsa_system_get_major_extension_table)(extension, version_major, + table_length, table); + } + static hsa_status_t status_string(hsa_status_t status, const char** status_string) { + return ROCR_DYN(hsa_status_string)(status, status_string); + } + static hsa_status_t executable_create_alt( + hsa_profile_t profile, hsa_default_float_rounding_mode_t default_float_rounding_mode, + const char* options, hsa_executable_t* executable) { + return ROCR_DYN(hsa_executable_create_alt)(profile, default_float_rounding_mode, options, + executable); + } + static hsa_status_t executable_destroy(hsa_executable_t executable) { + return ROCR_DYN(hsa_executable_destroy)(executable); + } + static hsa_status_t executable_get_info(hsa_executable_t executable, + hsa_executable_info_t attribute, void* value) { + return ROCR_DYN(hsa_executable_get_info)(executable, attribute, value); + } + static hsa_status_t code_object_reader_destroy(hsa_code_object_reader_t code_object_reader) { + return ROCR_DYN(hsa_code_object_reader_destroy)(code_object_reader); + } + static hsa_status_t code_object_reader_create_from_memory( + const void* code_object, size_t size, hsa_code_object_reader_t* code_object_reader) { + return ROCR_DYN(hsa_code_object_reader_create_from_memory)(code_object, size, + code_object_reader); + } + static hsa_status_t executable_load_agent_code_object( + hsa_executable_t executable, hsa_agent_t agent, hsa_code_object_reader_t code_object_reader, + const char* options, hsa_loaded_code_object_t* loaded_code_object) { + return ROCR_DYN(hsa_executable_load_agent_code_object)(executable, agent, code_object_reader, + options, loaded_code_object); + } + static hsa_status_t executable_agent_global_variable_define(hsa_executable_t executable, + hsa_agent_t agent, const char* variable_name, void* address) { + return ROCR_DYN(hsa_executable_agent_global_variable_define)(executable, agent, + variable_name, address); + } + static hsa_status_t executable_get_symbol_by_name(hsa_executable_t executable, + const char* symbol_name, const hsa_agent_t* agent, hsa_executable_symbol_t* symbol) { + return ROCR_DYN(hsa_executable_get_symbol_by_name)(executable, symbol_name, agent, symbol); + } + static hsa_status_t executable_symbol_get_info(hsa_executable_symbol_t executable_symbol, + hsa_executable_symbol_info_t attribute, void* value) { + return ROCR_DYN(hsa_executable_symbol_get_info)(executable_symbol, attribute, value); + } + static hsa_status_t executable_freeze(hsa_executable_t executable, const char* options) { + return ROCR_DYN(hsa_executable_freeze)(executable, options); + } + // AMD extensions + static hsa_status_t coherency_set_type(hsa_agent_t agent, hsa_amd_coherency_type_t type) { + return ROCR_DYN(hsa_amd_coherency_set_type)(agent, type); + } + static hsa_status_t profiling_set_profiler_enabled(hsa_queue_t* queue, int enable) { + return ROCR_DYN(hsa_amd_profiling_set_profiler_enabled)(queue, enable); + } + static hsa_status_t profiling_async_copy_enable(bool enable) { + return ROCR_DYN(hsa_amd_profiling_async_copy_enable)(enable); + } + static hsa_status_t profiling_get_dispatch_time(hsa_agent_t agent, hsa_signal_t signal, + hsa_amd_profiling_dispatch_time_t* time) { + return ROCR_DYN(hsa_amd_profiling_get_dispatch_time)(agent, signal, time); + } + static hsa_status_t profiling_get_async_copy_time(hsa_signal_t signal, + hsa_amd_profiling_async_copy_time_t* time) { + return ROCR_DYN(hsa_amd_profiling_get_async_copy_time)(signal, time); + } + static hsa_status_t signal_async_handler(hsa_signal_t signal, hsa_signal_condition_t cond, + hsa_signal_value_t value, hsa_amd_signal_handler handler, + void* arg) { + return ROCR_DYN(hsa_amd_signal_async_handler)(signal, cond, value, handler, arg); + } + static hsa_status_t queue_cu_set_mask(const hsa_queue_t* queue, uint32_t num_cu_mask_count, + const uint32_t* cu_mask) { + return ROCR_DYN(hsa_amd_queue_cu_set_mask)(queue, num_cu_mask_count, cu_mask); + } + static hsa_status_t memory_pool_get_info(hsa_amd_memory_pool_t memory_pool, + hsa_amd_memory_pool_info_t attribute, void* value) { + return ROCR_DYN(hsa_amd_memory_pool_get_info)(memory_pool, attribute, value); + } + static hsa_status_t agent_iterate_memory_pools( + hsa_agent_t agent, hsa_status_t (*callback)(hsa_amd_memory_pool_t memory_pool, void* data), + void* data) { + return ROCR_DYN(hsa_amd_agent_iterate_memory_pools)(agent, callback, data); + } + static hsa_status_t memory_pool_allocate(hsa_amd_memory_pool_t memory_pool, size_t size, + uint32_t flags, void** ptr) { + return ROCR_DYN(hsa_amd_memory_pool_allocate)(memory_pool, size, flags, ptr); + } + static hsa_status_t memory_pool_free(void* ptr) { + return ROCR_DYN(hsa_amd_memory_pool_free)(ptr); + } + static hsa_status_t memory_async_copy(void* dst, hsa_agent_t dst_agent, const void* src, + hsa_agent_t src_agent, size_t size, + uint32_t num_dep_signals, const hsa_signal_t* dep_signals, + hsa_signal_t completion_signal) { + return ROCR_DYN(hsa_amd_memory_async_copy)(dst, dst_agent, src, src_agent, size, + num_dep_signals, dep_signals, completion_signal); + } + static hsa_status_t memory_async_copy_on_engine( + void* dst, hsa_agent_t dst_agent, const void* src, hsa_agent_t src_agent, size_t size, + uint32_t num_dep_signals, const hsa_signal_t* dep_signals, hsa_signal_t completion_signal, + hsa_amd_sdma_engine_id_t engine_id, bool force_copy_on_sdma) { + return ROCR_DYN(hsa_amd_memory_async_copy_on_engine)( + dst, dst_agent, src, src_agent, size, num_dep_signals, dep_signals, completion_signal, + engine_id, force_copy_on_sdma); + } + static hsa_status_t memory_copy_engine_status(hsa_agent_t dst_agent, + hsa_agent_t src_agent, uint32_t* engine_ids_mask) { + return ROCR_DYN(hsa_amd_memory_copy_engine_status)(dst_agent, src_agent, engine_ids_mask); + } + static hsa_status_t agent_memory_pool_get_info(hsa_agent_t agent, + hsa_amd_memory_pool_t memory_pool, hsa_amd_agent_memory_pool_info_t attribute, void* value) { + return ROCR_DYN(hsa_amd_agent_memory_pool_get_info)(agent, memory_pool, attribute, value); + } + static hsa_status_t agents_allow_access(uint32_t num_agents, const hsa_agent_t* agents, + const uint32_t* flags, const void* ptr) { + return ROCR_DYN(hsa_amd_agents_allow_access)(num_agents, agents, flags, ptr); + } + static hsa_status_t memory_lock_to_pool(void* host_ptr, size_t size, hsa_agent_t* agents, + int num_agent, hsa_amd_memory_pool_t pool, uint32_t flags, void** agent_ptr) { + return ROCR_DYN(hsa_amd_memory_lock_to_pool)(host_ptr, size, agents, num_agent, pool, flags, + agent_ptr); + } + static hsa_status_t memory_unlock(void* host_ptr) { + return ROCR_DYN(hsa_amd_memory_unlock)(host_ptr); + } + static hsa_status_t interop_map_buffer(uint32_t num_agents, hsa_agent_t* agents, + int interop_handle, uint32_t flags, size_t* size, + void** ptr, size_t* metadata_size, const void** metadata) { + return ROCR_DYN(hsa_amd_interop_map_buffer)(num_agents, agents, interop_handle, flags, size, + ptr, metadata_size, metadata); + } + static hsa_status_t interop_unmap_buffer(void* ptr) { + return ROCR_DYN(hsa_amd_interop_unmap_buffer)(ptr); + } + static hsa_status_t pointer_info(const void* ptr, hsa_amd_pointer_info_t* info, + void* (*alloc)(size_t), uint32_t* num_agents_accessible, hsa_agent_t** accessible) { + return ROCR_DYN(hsa_amd_pointer_info)(ptr, info, alloc, num_agents_accessible, accessible); + } + static hsa_status_t ipc_memory_create(void* ptr, size_t len, hsa_amd_ipc_memory_t* handle) { + return ROCR_DYN(hsa_amd_ipc_memory_create)(ptr, len, handle); + } + static hsa_status_t ipc_memory_attach(const hsa_amd_ipc_memory_t* handle, size_t len, + uint32_t num_agents, const hsa_agent_t* mapping_agents, void** mapped_ptr) { + return ROCR_DYN(hsa_amd_ipc_memory_attach)( + handle, len, num_agents, mapping_agents, mapped_ptr); + } + static hsa_status_t ipc_memory_detach(void* mapped_ptr) { + return ROCR_DYN(hsa_amd_ipc_memory_detach)(mapped_ptr); + } + static hsa_status_t signal_create(hsa_signal_value_t initial_value, uint32_t num_consumers, + const hsa_agent_t* consumers, uint64_t attributes, hsa_signal_t* signal) { + return ROCR_DYN(hsa_amd_signal_create)(initial_value, num_consumers, consumers, attributes, + signal); + } + static hsa_status_t register_system_event_handler(hsa_amd_system_event_callback_t callback, + void* data) { + return ROCR_DYN(hsa_amd_register_system_event_handler)(callback, data); + } + static hsa_status_t queue_set_priority(hsa_queue_t* queue, hsa_amd_queue_priority_t priority) { + return ROCR_DYN(hsa_amd_queue_set_priority)(queue, priority); + } + static hsa_status_t memory_async_copy_rect( + const hsa_pitched_ptr_t* dst, const hsa_dim3_t* dst_offset, const hsa_pitched_ptr_t* src, + const hsa_dim3_t* src_offset, const hsa_dim3_t* range, hsa_agent_t copy_agent, + hsa_amd_copy_direction_t dir, uint32_t num_dep_signals, const hsa_signal_t* dep_signals, + hsa_signal_t completion_signal) { + return ROCR_DYN(hsa_amd_memory_async_copy_rect)(dst, dst_offset, src, src_offset, range, + copy_agent, dir, num_dep_signals, dep_signals, + completion_signal); + } + static hsa_status_t signal_value_pointer(hsa_signal_t signal, + volatile hsa_signal_value_t** value_ptr) { + return ROCR_DYN(hsa_amd_signal_value_pointer)(signal, value_ptr); + } + static hsa_status_t svm_attributes_set(void* ptr, size_t size, + hsa_amd_svm_attribute_pair_t* attribute_list, size_t attribute_count) { + return ROCR_DYN(hsa_amd_svm_attributes_set)(ptr, size, attribute_list, attribute_count); + } + static hsa_status_t svm_attributes_get(void* ptr, size_t size, + hsa_amd_svm_attribute_pair_t* attribute_list, size_t attribute_count) { + return ROCR_DYN(hsa_amd_svm_attributes_get)(ptr, size, attribute_list, attribute_count); + } + static hsa_status_t svm_prefetch_async(void* ptr, size_t size, hsa_agent_t agent, + uint32_t num_dep_signals, const hsa_signal_t* dep_signals, hsa_signal_t completion_signal) { + return ROCR_DYN(hsa_amd_svm_prefetch_async)(ptr, size, agent, num_dep_signals, + dep_signals, completion_signal); + } + static hsa_status_t portable_export_dmabuf(const void* ptr, size_t size, int* dmabuf, + uint64_t* offset) { + return ROCR_DYN(hsa_amd_portable_export_dmabuf)(ptr, size, dmabuf, offset); + } + static hsa_status_t vmem_address_reserve(void** ptr, size_t size, uint64_t address, + uint64_t flags) { + return ROCR_DYN(hsa_amd_vmem_address_reserve)(ptr, size, address, flags); + } + static hsa_status_t vmem_address_free(void* ptr, size_t size) { + return ROCR_DYN(hsa_amd_vmem_address_free)(ptr, size); + } + static hsa_status_t vmem_handle_create(hsa_amd_memory_pool_t pool, size_t size, + hsa_amd_memory_type_t type, uint64_t flags, hsa_amd_vmem_alloc_handle_t* memory_handle) { + return ROCR_DYN(hsa_amd_vmem_handle_create)(pool, size, type, flags, memory_handle); + } + static hsa_status_t vmem_handle_release(hsa_amd_vmem_alloc_handle_t memory_handle) { + return ROCR_DYN(hsa_amd_vmem_handle_release)(memory_handle); + } + static hsa_status_t vmem_map(void* va, size_t size, size_t in_offset, + hsa_amd_vmem_alloc_handle_t memory_handle, uint64_t flags) { + return ROCR_DYN(hsa_amd_vmem_map)(va, size, in_offset, memory_handle, flags); + } + static hsa_status_t vmem_unmap(void* va, size_t size) { + return ROCR_DYN(hsa_amd_vmem_unmap)(va, size); + } + static hsa_status_t vmem_set_access(void* va, size_t size, + const hsa_amd_memory_access_desc_t* desc, const size_t desc_cnt) { + return ROCR_DYN(hsa_amd_vmem_set_access)(va, size, desc, desc_cnt); + } + static hsa_status_t vmem_get_access(void* va, hsa_access_permission_t* flags, + const hsa_agent_t agent_handle) { + return ROCR_DYN(hsa_amd_vmem_get_access)(va, flags, agent_handle); + } + static hsa_status_t vmem_export_shareable_handle(int* dmabuf_fd, + hsa_amd_vmem_alloc_handle_t handle, uint64_t flags) { + return ROCR_DYN(hsa_amd_vmem_export_shareable_handle)(dmabuf_fd, handle, flags); + } + static hsa_status_t vmem_import_shareable_handle(int dmabuf_fd, + hsa_amd_vmem_alloc_handle_t* handle) { + return ROCR_DYN(hsa_amd_vmem_import_shareable_handle)(dmabuf_fd, handle); + } + static hsa_status_t vmem_retain_alloc_handle(hsa_amd_vmem_alloc_handle_t* allocHandle, + void* addr) { + return ROCR_DYN(hsa_amd_vmem_retain_alloc_handle)(allocHandle, addr); + } + static hsa_status_t agent_set_async_scratch_limit(hsa_agent_t agent, size_t threshold) { + return ROCR_DYN(hsa_amd_agent_set_async_scratch_limit)(agent, threshold); + } + static hsa_status_t vmem_address_reserve_align(void** ptr, size_t size, uint64_t address, + uint64_t alignment, uint64_t flags) { + return ROCR_DYN(hsa_amd_vmem_address_reserve_align)(ptr, size, address, alignment, flags); + } + static hsa_status_t enable_logging(uint8_t* flags, void* file) { + return ROCR_DYN(hsa_amd_enable_logging)(flags, file); + } + static hsa_status_t memory_get_preferred_copy_engine(hsa_agent_t dst_agent, + hsa_agent_t src_agent, uint32_t* recommended_ids_mask) { + return ROCR_DYN(hsa_amd_memory_get_preferred_copy_engine)( + dst_agent, src_agent, recommended_ids_mask); + } + + // Image extensions + static hsa_status_t image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const hsa_amd_image_descriptor_t* image_layout, + const void* image_data, hsa_access_permission_t access_permission, + hsa_ext_image_t* image) { + return ROCR_DYN(hsa_amd_image_create)(agent, image_descriptor, image_layout, image_data, + access_permission, image); + } + static hsa_status_t image_data_get_info( + hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, + hsa_access_permission_t access_permission, hsa_ext_image_data_info_t* image_data_info) { + return ROCR_DYN(hsa_ext_image_data_get_info)(agent, image_descriptor, access_permission, + image_data_info); + } + static hsa_status_t image_create(hsa_agent_t agent, + const hsa_ext_image_descriptor_t* image_descriptor, + const void* image_data, + hsa_access_permission_t access_permission, + hsa_ext_image_t* image) { + return ROCR_DYN(hsa_ext_image_create)(agent, image_descriptor, image_data, + access_permission, image); + } + static hsa_status_t image_import(hsa_agent_t agent, const void* src_memory, + size_t src_row_pitch, size_t src_slice_pitch, + hsa_ext_image_t dst_image, + const hsa_ext_image_region_t* image_region) { + return ROCR_DYN(hsa_ext_image_import)(agent, src_memory, src_row_pitch, src_slice_pitch, + dst_image, image_region); + } + static hsa_status_t image_export(hsa_agent_t agent, hsa_ext_image_t src_image, + void* dst_memory, size_t dst_row_pitch, + size_t dst_slice_pitch, + const hsa_ext_image_region_t* image_region) { + return ROCR_DYN(hsa_ext_image_export)(agent, src_image, dst_memory, dst_row_pitch, + dst_slice_pitch, image_region); + } + static hsa_status_t image_destroy(hsa_agent_t agent, hsa_ext_image_t image) { + return ROCR_DYN(hsa_ext_image_destroy)(agent, image); + } + static hsa_status_t sampler_create(hsa_agent_t agent, + const hsa_ext_sampler_descriptor_v2_t* sampler_descriptor, hsa_ext_sampler_t* sampler) { + return ROCR_DYN(hsa_ext_sampler_create_v2)(agent, sampler_descriptor, sampler); + } + static hsa_status_t sampler_destroy(hsa_agent_t agent, hsa_ext_sampler_t sampler) { + return ROCR_DYN(hsa_ext_sampler_destroy)(agent, sampler); + } + static hsa_status_t image_create_with_layout( + hsa_agent_t agent, const hsa_ext_image_descriptor_t* image_descriptor, const void* image_data, + hsa_access_permission_t access_permission, hsa_ext_image_data_layout_t image_data_layout, + size_t image_data_row_pitch, size_t image_data_slice_pitch, hsa_ext_image_t* image) { + return ROCR_DYN(hsa_ext_image_create_with_layout)( + agent, image_descriptor, image_data, access_permission, image_data_layout, + image_data_row_pitch, image_data_slice_pitch, image); + } + + private: + static RocrEntryPoints cep_; + static bool is_ready_; +}; + +} // namespace roc +} // namespace amd diff --git a/projects/clr/rocclr/device/rocm/rocsignal.cpp b/projects/clr/rocclr/device/rocm/rocsignal.cpp index 05d9bcfd29..22b5668bf1 100644 --- a/projects/clr/rocclr/device/rocm/rocsignal.cpp +++ b/projects/clr/rocclr/device/rocm/rocsignal.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -22,12 +22,14 @@ #include "utils/flags.hpp" #include "utils/debug.hpp" #include "rocsignal.hpp" +#include "device/rocm/rocrctx.hpp" + namespace amd::roc { -Signal::~Signal() { hsa_signal_destroy(signal_); } +Signal::~Signal() { Hsa::signal_destroy(signal_); } bool Signal::Init(const amd::Device& dev, uint64_t init, device::Signal::WaitState ws) { - hsa_status_t status = hsa_signal_create(init, 0, nullptr, &signal_); + hsa_status_t status = Hsa::signal_create(init, 0, nullptr, &signal_); if (status != HSA_STATUS_SUCCESS) { return false; } @@ -38,10 +40,10 @@ bool Signal::Init(const amd::Device& dev, uint64_t init, device::Signal::WaitSta } uint64_t Signal::Wait(uint64_t value, device::Signal::Condition c, uint64_t timeout) { - return hsa_signal_wait_scacquire(signal_, static_cast(c), value, timeout, - static_cast(ws_)); + return Hsa::signal_wait_scacquire(signal_, static_cast(c), value, timeout, + static_cast(ws_)); } -void Signal::Reset(uint64_t value) { hsa_signal_store_screlease(signal_, value); } +void Signal::Reset(uint64_t value) { Hsa::signal_store_screlease(signal_, value); } }; // namespace amd::roc \ No newline at end of file diff --git a/projects/clr/rocclr/device/rocm/rocsignal.hpp b/projects/clr/rocclr/device/rocm/rocsignal.hpp index 0f7e4093c0..c120c1204d 100644 --- a/projects/clr/rocclr/device/rocm/rocsignal.hpp +++ b/projects/clr/rocclr/device/rocm/rocsignal.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -20,10 +20,9 @@ #pragma once +#include "device/rocm/rocdevice.hpp" #include "device/devsignal.hpp" -#include "hsa/hsa.h" - namespace amd::roc { class Signal : public device::Signal { diff --git a/projects/clr/rocclr/device/rocm/rocurilocator.cpp b/projects/clr/rocclr/device/rocm/rocurilocator.cpp index f9221c459e..9e81db9abe 100644 --- a/projects/clr/rocclr/device/rocm/rocurilocator.cpp +++ b/projects/clr/rocclr/device/rocm/rocurilocator.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2021 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2021 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28,7 +28,7 @@ hsa_status_t UriLocator::createUriRangeTable() { auto execCb = [](hsa_executable_t exec, void* data) -> hsa_status_t { int execState = 0; hsa_status_t status; - status = hsa_executable_get_info(exec, HSA_EXECUTABLE_INFO_STATE, &execState); + status = Hsa::executable_get_info(exec, HSA_EXECUTABLE_INFO_STATE, &execState); if (status != HSA_STATUS_SUCCESS) return status; if (execState != HSA_EXECUTABLE_STATE_FROZEN) return status; @@ -146,8 +146,8 @@ UriLocator::UriInfo UriLocator::lookUpUri(uint64_t device_pc) { if (!init_) { hsa_status_t result; - result = hsa_system_get_major_extension_table(HSA_EXTENSION_AMD_LOADER, 1, sizeof(fn_table_), - &fn_table_); + result = Hsa::system_get_major_extension_table(HSA_EXTENSION_AMD_LOADER, 1, sizeof(fn_table_), + &fn_table_); if (result != HSA_STATUS_SUCCESS) return errorstate; result = createUriRangeTable(); if (result != HSA_STATUS_SUCCESS) { diff --git a/projects/clr/rocclr/device/rocm/rocurilocator.hpp b/projects/clr/rocclr/device/rocm/rocurilocator.hpp index ff41cddfe5..94a14f93d0 100644 --- a/projects/clr/rocclr/device/rocm/rocurilocator.hpp +++ b/projects/clr/rocclr/device/rocm/rocurilocator.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019 - 2021 Advanced Micro Devices, Inc. +/* Copyright (c) 2019 - 2025 Advanced Micro Devices, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -22,7 +22,6 @@ #if defined(__clang__) #if __has_feature(address_sanitizer) #include "device/devurilocator.hpp" -#include "hsa/hsa_ven_amd_loader.h" #include namespace amd::roc { diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.cpp b/projects/clr/rocclr/device/rocm/rocvirtual.cpp index 89153e20fc..339fec50c6 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.cpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.cpp @@ -34,9 +34,6 @@ #include "platform/sampler.hpp" #include "utils/debug.hpp" #include "os/os.hpp" -#include "hsa/amd_hsa_kernel_code.h" -#include "hsa/amd_hsa_queue.h" -#include "hsa/amd_hsa_signal.h" #include #include @@ -146,10 +143,10 @@ void Timestamp::checkGpuTime() { amd_signal_t* amdSignal = reinterpret_cast(it->signal_.handle); if (it->engine_ == HwQueueEngine::Compute) { - hsa_amd_profiling_get_dispatch_time(gpu()->gpu_device(), it->signal_, &time); + Hsa::profiling_get_dispatch_time(gpu()->gpu_device(), it->signal_, &time); } else { hsa_amd_profiling_async_copy_time_t time_sdma = {}; - hsa_amd_profiling_get_async_copy_time(it->signal_, &time_sdma); + Hsa::profiling_get_async_copy_time(it->signal_, &time_sdma); time.start = time_sdma.start; time.end = time_sdma.end; } @@ -198,8 +195,8 @@ bool HsaAmdSignalHandler(hsa_signal_value_t value, void* arg) { ts->setParsedCommand(head); for (auto it : headTs->Signals()) { hsa_signal_value_t complete_val = (headTs->GetCallbackSignal().handle != 0) ? 1 : 0; - if (int64_t val = hsa_signal_load_relaxed(it->signal_) > complete_val) { - hsa_status_t result = hsa_amd_signal_async_handler( + if (int64_t val = Hsa::signal_load_relaxed(it->signal_) > complete_val) { + hsa_status_t result = Hsa::signal_async_handler( headTs->Signals()[0]->signal_, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, &HsaAmdSignalHandler, ts); if (HSA_STATUS_SUCCESS != result) { @@ -239,7 +236,7 @@ bool HsaAmdSignalHandler(hsa_signal_value_t value, void* arg) { // Reset API callback signal. It will release AQL queue and start commands processing if (callback_signal.handle != 0 && isBlocking) { - hsa_signal_subtract_relaxed(callback_signal, 1); + Hsa::signal_subtract_relaxed(callback_signal, 1); } // Return false, so the callback will not be called again for this signal @@ -379,12 +376,12 @@ bool VirtualGPU::HwQueueTracker::CreateSignal(ProfilingSignal* signal, bool inte interrupt |= !AMD_DIRECT_DISPATCH || !gpu_.dev().ActiveWait(); // Check if the interrupt was requested for the signal if (interrupt && settings.system_scope_signal_) { - if (HSA_STATUS_SUCCESS != hsa_signal_create(0, 0, nullptr, &signal->signal_)) { + if (HSA_STATUS_SUCCESS != Hsa::signal_create(0, 0, nullptr, &signal->signal_)) { return false; } } else { if (HSA_STATUS_SUCCESS != - hsa_amd_signal_create(0, 0, nullptr, HSA_AMD_SIGNAL_AMD_GPU_ONLY, &signal->signal_)) { + Hsa::signal_create(0, 0, nullptr, HSA_AMD_SIGNAL_AMD_GPU_ONLY, &signal->signal_)) { return false; } } @@ -436,9 +433,10 @@ hsa_signal_t VirtualGPU::HwQueueTracker::ActiveSignal(hsa_signal_value_t init_va // Peep signal +2 ahead to see if its done auto temp_id = (current_id_ + 2) % signal_list_.size(); + // If GPU is still busy with processing or if timestamps havent been saved out, // then add more signals to avoid more frequent stalls - if (hsa_signal_load_relaxed(signal_list_[temp_id]->signal_) > 0 || + if (Hsa::signal_load_relaxed(signal_list_[temp_id]->signal_) > 0 || !signal_list_[temp_id]->flags_.done_) { std::unique_ptr signal(new ProfilingSignal()); if ((signal != nullptr) && CreateSignal(signal.get())) { @@ -509,7 +507,7 @@ hsa_signal_t VirtualGPU::HwQueueTracker::ActiveSignal(hsa_signal_value_t init_va } ProfilingSignal* prof_signal = signal_list_[current_id_]; // Reset the signal and return - hsa_signal_silent_store_relaxed(prof_signal->signal_, init_val); + Hsa::signal_silent_store_relaxed(prof_signal->signal_, init_val); prof_signal->flags_.done_ = false; prof_signal->engine_ = engine_; prof_signal->flags_.isPacketDispatch_ = false; @@ -542,12 +540,12 @@ hsa_signal_t VirtualGPU::HwQueueTracker::ActiveSignal(hsa_signal_value_t init_va ts->SetCallbackSignal(prof_signal->signal_, blocking); // Blocks AQL queue from further processing if (blocking) { - hsa_signal_add_relaxed(prof_signal->signal_, 1); + Hsa::signal_add_relaxed(prof_signal->signal_, 1); init_value += 1; } } gpu_.QueuedAsyncHandlers()++; - hsa_status_t result = hsa_amd_signal_async_handler( + hsa_status_t result = Hsa::signal_async_handler( prof_signal->signal_, HSA_SIGNAL_CONDITION_LT, init_value, &HsaAmdSignalHandler, ts); if (HSA_STATUS_SUCCESS != result) { LogError("hsa_amd_signal_async_handler() failed to set the handler!"); @@ -605,7 +603,7 @@ std::vector& VirtualGPU::HwQueueTracker::WaitingSignal(HwQueueEngi // Validate all signals for the wait and skip already completed for (uint32_t i = 0; i < external_signals_.size(); ++i) { // Early signal status check - if (hsa_signal_load_relaxed(external_signals_[i]->signal_) > 0) { + if (Hsa::signal_load_relaxed(external_signals_[i]->signal_) > 0) { const Settings& settings = gpu_.dev().settings(); if (settings.cpu_wait_for_signal_) { // Wait on CPU for completion if requested @@ -631,7 +629,7 @@ bool VirtualGPU::HwQueueTracker::CpuWaitForSignal(ProfilingSignal* signal) { ts->checkGpuTime(); ts->release(); signal->ts_ = nullptr; - } else if (hsa_signal_load_relaxed(signal->signal_) > 0) { + } else if (Hsa::signal_load_relaxed(signal->signal_) > 0) { amd::ScopedLock lock(signal->LockSignalOps()); ClPrint(amd::LOG_DEBUG, amd::LOG_COPY, "Host wait on completion_signal=0x%zx", signal->signal_.handle); @@ -647,7 +645,7 @@ bool VirtualGPU::HwQueueTracker::CpuWaitForSignal(ProfilingSignal* signal) { // ================================================================================================ void VirtualGPU::HwQueueTracker::ResetCurrentSignal() { // Reset the signal and return - hsa_signal_silent_store_relaxed(signal_list_[current_id_]->signal_, 0); + Hsa::signal_silent_store_relaxed(signal_list_[current_id_]->signal_, 0); // Fallback to the previous signal current_id_ = (current_id_ == 0) ? (signal_list_.size() - 1) : (current_id_ - 1); } @@ -936,8 +934,8 @@ void VirtualGPU::AnalyzeAqlQueue() const { const uint32_t queueSize = gpu_queue_->size; const uint32_t queueMask = queueSize - 1; const uint32_t sw_queue_size = queueMask; - uint64_t index = hsa_queue_load_write_index_relaxed(gpu_queue_); - uint64_t read = hsa_queue_load_read_index_relaxed(gpu_queue_); + uint64_t index = Hsa::queue_load_write_index_relaxed(gpu_queue_); + uint64_t read = Hsa::queue_load_read_index_relaxed(gpu_queue_); if (index > read) { int valid_packet_idx = 0; constexpr int kAqlSearchWindow = 32; @@ -1010,7 +1008,7 @@ bool VirtualGPU::dispatchGenericAqlPacket(AqlPacket* packet, uint16_t header, ui const uint32_t sw_queue_size = queueMask; // Check for queue full and wait if needed. - uint64_t index = hsa_queue_add_write_index_screlease(gpu_queue_, 1); + uint64_t index = Hsa::queue_add_write_index_screlease(gpu_queue_, 1); fence_dirty_ = true; if (addSystemScope_) { @@ -1057,7 +1055,7 @@ bool VirtualGPU::dispatchGenericAqlPacket(AqlPacket* packet, uint16_t header, ui } // Make sure the slot is free for usage - while ((index - hsa_queue_load_read_index_scacquire(gpu_queue_)) >= sw_queue_size) { + while ((index - Hsa::queue_load_read_index_scacquire(gpu_queue_)) >= sw_queue_size) { // Active spin - no yield } @@ -1104,9 +1102,9 @@ bool VirtualGPU::dispatchGenericAqlPacket(AqlPacket* packet, uint16_t header, ui reinterpret_cast(packet)->kernarg_address, reinterpret_cast(packet)->completion_signal, reinterpret_cast(packet)->reserved2, - hsa_queue_load_read_index_scacquire(gpu_queue_), index); + Hsa::queue_load_read_index_scacquire(gpu_queue_), index); - hsa_signal_store_screlease(gpu_queue_->doorbell_signal, index); + Hsa::signal_store_screlease(gpu_queue_->doorbell_signal, index); // Mark the flag indicating if a dispatch is outstanding. // We are not waiting after every dispatch. @@ -1180,8 +1178,8 @@ bool VirtualGPU::dispatchGenericAqlPacketBatch(const std::vector& pa size_t batchSize = 1; while (processedPackets < numPackets) { - uint64_t currentReadIndex = hsa_queue_load_read_index_scacquire(gpu_queue_); - uint64_t currentWriteIndex = hsa_queue_load_write_index_relaxed(gpu_queue_); + uint64_t currentReadIndex = Hsa::queue_load_read_index_scacquire(gpu_queue_); + uint64_t currentWriteIndex = Hsa::queue_load_write_index_relaxed(gpu_queue_); if (currentWriteIndex - currentReadIndex >= kGpuLagPackets) { //GPU is busy, so we can copy more packets @@ -1200,10 +1198,10 @@ bool VirtualGPU::dispatchGenericAqlPacketBatch(const std::vector& pa } // Now reserve space for the batch - uint64_t startIndex = hsa_queue_add_write_index_screlease(gpu_queue_, batchSize); + uint64_t startIndex = Hsa::queue_add_write_index_screlease(gpu_queue_, batchSize); // Make sure the slot is free for usage - while ((startIndex - hsa_queue_load_read_index_scacquire(gpu_queue_)) >= sw_queue_size) { + while ((startIndex - Hsa::queue_load_read_index_scacquire(gpu_queue_)) >= sw_queue_size) { // Active spin - no yield } @@ -1321,7 +1319,7 @@ bool VirtualGPU::dispatchGenericAqlPacketBatch(const std::vector& pa reinterpret_cast(packet)->kernarg_address, reinterpret_cast(packet)->completion_signal, reinterpret_cast(packet)->reserved2, - hsa_queue_load_read_index_scacquire(gpu_queue_), index); + Hsa::queue_load_read_index_scacquire(gpu_queue_), index); } } } @@ -1331,7 +1329,7 @@ bool VirtualGPU::dispatchGenericAqlPacketBatch(const std::vector& pa packet_store_release(reinterpret_cast(aql_loc), firstPacketHeader, firstPacketRest); // Ring doorbell for this batch - hsa_signal_store_screlease(gpu_queue_->doorbell_signal, startIndex); + Hsa::signal_store_screlease(gpu_queue_->doorbell_signal, startIndex); processedPackets += batchSize; @@ -1429,8 +1427,8 @@ void VirtualGPU::dispatchBarrierPacket(uint16_t packetHeader, bool skipSignal, } } - uint64_t index = hsa_queue_add_write_index_screlease(gpu_queue_, 1); - uint64_t read = hsa_queue_load_read_index_relaxed(gpu_queue_); + uint64_t index = Hsa::queue_add_write_index_screlease(gpu_queue_, 1); + uint64_t read = Hsa::queue_load_read_index_relaxed(gpu_queue_); fence_dirty_ = true; auto cache_state = extractAqlBits(packetHeader, HSA_PACKET_HEADER_SCRELEASE_FENCE_SCOPE, @@ -1450,13 +1448,13 @@ void VirtualGPU::dispatchBarrierPacket(uint16_t packetHeader, bool skipSignal, fence_dirty_ = false; } - while ((index - hsa_queue_load_read_index_scacquire(gpu_queue_)) >= queueMask); + while ((index - Hsa::queue_load_read_index_scacquire(gpu_queue_)) >= queueMask); hsa_barrier_and_packet_t* aql_loc = &(reinterpret_cast(gpu_queue_->base_address))[index & queueMask]; *aql_loc = barrier_packet_; packet_store_release(reinterpret_cast(aql_loc), packetHeader, 0); - hsa_signal_store_screlease(gpu_queue_->doorbell_signal, index); + Hsa::signal_store_screlease(gpu_queue_->doorbell_signal, index); ClPrint(amd::LOG_DEBUG, amd::LOG_AQL, "SWq=0x%zx, HWq=0x%zx, id=%d, BarrierAND Header = 0x%x (type=%d, barrier=%d, acquire=%d," " release=%d), " @@ -1534,18 +1532,18 @@ void VirtualGPU::dispatchBarrierValuePacket(uint16_t packetHeader, bool resolveD fence_dirty_ = false; } - uint64_t index = hsa_queue_add_write_index_screlease(gpu_queue_, 1); - uint64_t read = hsa_queue_load_read_index_relaxed(gpu_queue_); + uint64_t index = Hsa::queue_add_write_index_screlease(gpu_queue_, 1); + uint64_t read = Hsa::queue_load_read_index_relaxed(gpu_queue_); TrackQueueProgress(barrier_value_packet_, index); - while ((index - hsa_queue_load_read_index_scacquire(gpu_queue_)) >= queueMask); + while ((index - Hsa::queue_load_read_index_scacquire(gpu_queue_)) >= queueMask); hsa_amd_barrier_value_packet_t* aql_loc = &(reinterpret_cast( gpu_queue_->base_address))[index & queueMask]; *aql_loc = barrier_value_packet_; packet_store_release(reinterpret_cast(aql_loc), packetHeader, rest); - hsa_signal_store_screlease(gpu_queue_->doorbell_signal, index); + Hsa::signal_store_screlease(gpu_queue_->doorbell_signal, index); ClPrint(amd::LOG_DEBUG, amd::LOG_AQL, "SWq=0x%zx, HWq=0x%zx, id=%d, BarrierValue Header = 0x%x AmdFormat = 0x%x " @@ -1687,7 +1685,7 @@ VirtualGPU::~VirtualGPU() { delete printfdbg_; if (nullptr != schedulerQueue_) { - hsa_queue_destroy(schedulerQueue_); + Hsa::queue_destroy(schedulerQueue_); } if (nullptr != virtualQueue_) { @@ -1742,7 +1740,7 @@ bool VirtualGPU::create() { // Initialize timestamp conversion factor if (Timestamp::getGpuTicksToTime() == 0) { uint64_t frequency; - hsa_system_get_info(HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY, &frequency); + Hsa::system_get_info(HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY, &frequency); Timestamp::setGpuTicksToTime(1e9 / double(frequency)); } @@ -1771,7 +1769,7 @@ bool VirtualGPU::create() { VirtualGPU::ManagedBuffer::~ManagedBuffer() { for (auto& it : pool_signal_) { if (it.handle != 0) { - hsa_signal_destroy(it); + Hsa::signal_destroy(it); } } if (pool_base_ != nullptr) { @@ -1803,7 +1801,7 @@ bool VirtualGPU::ManagedBuffer::Create(Device::MemorySegment mem_segment) { } hsa_agent_t agent = gpu_.dev().getBackendDevice(); for (auto& it : pool_signal_) { - if (HSA_STATUS_SUCCESS != hsa_signal_create(0, 1, &agent, &it)) { + if (HSA_STATUS_SUCCESS != Hsa::signal_create(0, 1, &agent, &it)) { return false; } } @@ -1827,7 +1825,7 @@ address VirtualGPU::ManagedBuffer::Acquire(uint32_t size, uint32_t alignment) { return result; } else { // Reset the signal for the barrier packet - hsa_signal_silent_store_relaxed(pool_signal_[active_chunk_], kInitSignalValueOne); + Hsa::signal_silent_store_relaxed(pool_signal_[active_chunk_], kInitSignalValueOne); ClPrint(amd::LOG_DETAIL_DEBUG, amd::LOG_KERN, "Issue barrier to flush chunk %d", active_chunk_); // Currently don't skip wait signal check, because SDMA engine cna be used in staging copy @@ -2306,8 +2304,8 @@ void VirtualGPU::submitSvmPrefetchAsync(amd::SvmPrefetchAsyncCommand& cmd) { // Initiate a prefetch command hsa_status_t status = - hsa_amd_svm_prefetch_async(const_cast(cmd.dev_ptr()), cmd.count(), agent, - wait_events.size(), wait_events.data(), active); + Hsa::svm_prefetch_async(const_cast(cmd.dev_ptr()), cmd.count(), agent, + wait_events.size(), wait_events.data(), active); ClPrint(amd::LOG_DEBUG, amd::LOG_COPY, "HSA prefetch async dev_ptr=0x%zx, count=%d, wait_event=0x%zx, " "completion_signal=0x%zx", @@ -3157,7 +3155,7 @@ void VirtualGPU::submitVirtualMap(amd::VirtualMapCommand& vcmd) { // Map the physical to virtual address the hsa api hsa_amd_vmem_alloc_handle_t opaque_hsa_handle; opaque_hsa_handle.handle = phys_mem_obj->getUserData().hsa_handle; - if ((hsa_status = hsa_amd_vmem_map(vaddr_sub_obj->getSvmPtr(), vcmd.size(), + if ((hsa_status = Hsa::vmem_map(vaddr_sub_obj->getSvmPtr(), vcmd.size(), vaddr_sub_obj->getOffset(), opaque_hsa_handle, 0)) == HSA_STATUS_SUCCESS) { assert(amd::MemObjMap::FindMemObj(vcmd.ptr()) == nullptr); @@ -3175,7 +3173,7 @@ void VirtualGPU::submitVirtualMap(amd::VirtualMapCommand& vcmd) { assert(vaddr_sub_obj != nullptr); // Unmap the object, since the physical addr is set. - if ((hsa_status = hsa_amd_vmem_unmap(vaddr_sub_obj->getSvmPtr(), vcmd.size())) == + if ((hsa_status = Hsa::vmem_unmap(vaddr_sub_obj->getSvmPtr(), vcmd.size())) == HSA_STATUS_SUCCESS) { // assert the va is mapped and needs to be removed vaddr_sub_obj->getContext().devices()[0]->DestroyVirtualBuffer(vaddr_sub_obj); @@ -3273,9 +3271,9 @@ bool VirtualGPU::createSchedulerParam() { while (true) { // The queue is written by multiple threads of the scheduler kernel if (HSA_STATUS_SUCCESS != - hsa_queue_create(gpu_device(), 2048, HSA_QUEUE_TYPE_MULTI, callbackQueue, &roc_device_, - std::numeric_limits::max(), std::numeric_limits::max(), - &schedulerQueue_)) { + Hsa::queue_create(gpu_device(), 2048, HSA_QUEUE_TYPE_MULTI, callbackQueue, &roc_device_, + std::numeric_limits::max(), std::numeric_limits::max(), + &schedulerQueue_)) { break; } @@ -3283,7 +3281,7 @@ bool VirtualGPU::createSchedulerParam() { } if (nullptr != schedulerQueue_) { - hsa_queue_destroy(schedulerQueue_); + Hsa::queue_destroy(schedulerQueue_); schedulerQueue_ = nullptr; } diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.hpp b/projects/clr/rocclr/device/rocm/rocvirtual.hpp index 3ade98d3a7..987a1fc826 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.hpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.hpp @@ -25,11 +25,7 @@ #include "rocdevice.hpp" #include "utils/flags.hpp" #include "utils/util.hpp" -#include "hsa/hsa.h" -#include "hsa/hsa_ext_image.h" -#include "hsa/hsa_ext_amd.h" #include "rocprintf.hpp" -#include "hsa/hsa_ven_amd_aqlprofile.h" #include "rocsched.hpp" #include "device/device.hpp" #include "os/os.hpp" @@ -56,13 +52,13 @@ inline bool WaitForSignal(hsa_signal_t signal, bool active_wait = false, bool yi wait_state = HSA_WAIT_STATE_ACTIVE; } - if (hsa_signal_load_relaxed(signal) > 0) { + if (Hsa::signal_load_relaxed(signal) > 0) { // When it is blocked wait, we wait in active state for 100 us before proceeding to wait in // blocked state indefinitely. if (!active_wait) { ClPrint(amd::LOG_INFO, amd::LOG_SIG, "Host active wait for Signal = (0x%lx) for %d ns", signal.handle, kTimeout100us); - if (hsa_signal_wait_scacquire(signal, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, + if (Hsa::signal_wait_scacquire(signal, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, kTimeout100us, HSA_WAIT_STATE_ACTIVE) != 0) { if (HIP_SKIP_ABORT_ON_GPU_ERROR && amd::Device::IsGPUInError()) { ClPrint(amd::LOG_ERROR, amd::LOG_SIG, @@ -76,7 +72,7 @@ inline bool WaitForSignal(hsa_signal_t signal, bool active_wait = false, bool yi // This is unlimited wait, but we wait for 4 secs and check if the device is // unstable, if so we return, otherwise we continue to wait in the while loop. - while (hsa_signal_wait_scacquire(signal, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, + while (Hsa::signal_wait_scacquire(signal, HSA_SIGNAL_CONDITION_LT, kInitSignalValueOne, kTimeout4Secs, wait_state) != 0) { if (HIP_SKIP_ABORT_ON_GPU_ERROR && amd::Device::IsGPUInError()) { ClPrint(amd::LOG_ERROR, amd::LOG_SIG, @@ -98,7 +94,7 @@ inline void fetchSignalTime(hsa_signal_t signal, hsa_agent_t gpu_device, uint64_ uint64_t* end) { if (start != nullptr && end != nullptr) { hsa_amd_profiling_dispatch_time_t time = {}; - hsa_amd_profiling_get_dispatch_time(gpu_device, signal, &time); + Hsa::profiling_get_dispatch_time(gpu_device, signal, &time); *start = time.start; *end = time.end; } @@ -307,7 +303,7 @@ class VirtualGPU : public device::VirtualDevice { bool GetSDMAProfiling() { return sdma_profiling_; } void SetSDMAProfiling(bool profile) { sdma_profiling_ = profile; - hsa_amd_profiling_async_copy_enable(profile); + Hsa::profiling_async_copy_enable(profile); } private: @@ -558,7 +554,7 @@ class VirtualGPU : public device::VirtualDevice { if ((last_write_index_ == 0) && (last_completion_signal_.handle == 0)) { result = true; } else { - result = (hsa_signal_load_relaxed(last_completion_signal_) == 0); + result = (Hsa::signal_load_relaxed(last_completion_signal_) == 0); } } return result;