SWDEV-539145 - Support extended fine grained system memory pool (#603)
* Add hipHostMalloc() new flag hipHostMallocUncached which will force to allocate pinned host memory on extended fine grained system memory pool. * Add hipHostAlloc() new flag hipHostAllocUncached which will force to allocate pinned host memory on extended fine grained system memory pool. * Add hipHostRegister() new flag hipHostRegisterUncached which will force to map host memory onto extended fine grained system momory pool.
This commit is contained in:
@@ -825,7 +825,10 @@ bool Buffer::create(bool alloc_local) {
|
||||
deviceMemory_ = dev().hostAlloc(size(), 1, Device::MemorySegment::kNoAtomics);
|
||||
}
|
||||
} else if (memFlags & CL_MEM_FOLLOW_USER_NUMA_POLICY) {
|
||||
deviceMemory_ = dev().hostNumaAlloc(size(), 1, (memFlags & CL_MEM_SVM_ATOMICS) != 0);
|
||||
deviceMemory_ = dev().hostNumaAlloc(size(), 1, (memFlags & CL_MEM_SVM_ATOMICS) == 0
|
||||
? Device::MemorySegment::kNoAtomics :
|
||||
((memFlags & ROCCLR_MEM_HSA_UNCACHED) != 0 ?
|
||||
Device::MemorySegment::kUncachedAtomics : Device::MemorySegment::kAtomics));
|
||||
} 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.
|
||||
@@ -849,9 +852,10 @@ bool Buffer::create(bool alloc_local) {
|
||||
// Disable host access to force blit path for memeory writes.
|
||||
flags_ &= ~HostMemoryDirectAccess;
|
||||
} else {
|
||||
deviceMemory_ = dev().hostAlloc(size(), 1, ((memFlags & CL_MEM_SVM_ATOMICS) != 0)
|
||||
? Device::MemorySegment::kAtomics
|
||||
: Device::MemorySegment::kNoAtomics);
|
||||
deviceMemory_ = dev().hostAlloc(size(), 1, (memFlags & CL_MEM_SVM_ATOMICS) == 0
|
||||
? Device::MemorySegment::kNoAtomics :
|
||||
((memFlags & ROCCLR_MEM_HSA_UNCACHED) != 0 ?
|
||||
Device::MemorySegment::kUncachedAtomics : Device::MemorySegment::kAtomics));
|
||||
}
|
||||
} else {
|
||||
assert(!isHostMemDirectAccess() && "Runtime doesn't support direct access to GPU memory!");
|
||||
@@ -1008,15 +1012,24 @@ bool Buffer::create(bool alloc_local) {
|
||||
owner()->setHostMem(deviceMemory_);
|
||||
} else if (owner()->getSvmPtr() != owner()->getHostMem()) {
|
||||
if (memFlags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)) {
|
||||
hsa_amd_memory_pool_t pool = (memFlags & CL_MEM_SVM_ATOMICS) ?
|
||||
dev().SystemSegment() :
|
||||
(dev().SystemCoarseSegment().handle != 0 ?
|
||||
dev().SystemCoarseSegment() : dev().SystemSegment());
|
||||
hsa_amd_memory_pool_t pool = dev().SystemSegment(); // Default
|
||||
if ((memFlags & CL_MEM_SVM_ATOMICS) == 0) {
|
||||
if (dev().SystemCoarseSegment().handle != 0) {
|
||||
pool = dev().SystemCoarseSegment();
|
||||
}
|
||||
} else if ((memFlags & ROCCLR_MEM_HSA_UNCACHED) != 0) {
|
||||
if (dev().SystemExtSegment().handle != 0) {
|
||||
pool = dev().SystemExtSegment();
|
||||
ClPrint(amd::LOG_DEBUG, amd::LOG_MEM,
|
||||
"Using extended fine grained access system memory pool to lock");
|
||||
}
|
||||
}
|
||||
hsa_agent_t hsa_agent = dev().getBackendDevice();
|
||||
hsa_status_t status = hsa_amd_memory_lock_to_pool(owner()->getHostMem(),
|
||||
owner()->getSize(), &hsa_agent, 1, pool, 0, &deviceMemory_);
|
||||
ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Locking to pool %p, size 0x%zx, HostPtr = %p,"
|
||||
" DevPtr = %p", pool, owner()->getSize(), owner()->getHostMem(), deviceMemory_ );
|
||||
" DevPtr = %p, memFlags = 0x%xh", pool, owner()->getSize(),
|
||||
owner()->getHostMem(), deviceMemory_, memFlags);
|
||||
if (status != HSA_STATUS_SUCCESS) {
|
||||
DevLogPrintfError("Failed to lock memory to pool, failed with hsa_status: %d \n", status);
|
||||
deviceMemory_ = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user