mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Extend createMultiHostAllocation, allocWithAlignment
Signed-off-by: Daniel Chabrowski daniel.chabrowski@intel.com Related-To: NEO-6591
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
e0c892ed55
commit
2e9925c231
@ -39,9 +39,9 @@ set(NEO_CORE_OS_INTERFACE_LINUX
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_operations_handler_bind.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_operations_handler_default.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_operations_handler_default.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_manager_create_multi_host_allocation.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_create_multi_host_allocation.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_manager_local_memory.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_operations_handler_create.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_operations_handler_create.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_query.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_drm.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hw_device_id.h
|
||||
|
@ -1538,4 +1538,82 @@ void DrmMemoryManager::waitOnCompletionFence(GraphicsAllocation *allocation) {
|
||||
}
|
||||
}
|
||||
|
||||
DrmAllocation *DrmMemoryManager::createAllocWithAlignment(const AllocationData &allocationData, size_t size, size_t alignment, size_t alignedSize, uint64_t gpuAddress) {
|
||||
bool useBooMmap = this->getDrm(allocationData.rootDeviceIndex).getMemoryInfo() && allocationData.useMmapObject;
|
||||
|
||||
if (DebugManager.flags.EnableBOMmapCreate.get() != -1) {
|
||||
useBooMmap = DebugManager.flags.EnableBOMmapCreate.get();
|
||||
}
|
||||
|
||||
if (useBooMmap) {
|
||||
auto totalSizeToAlloc = alignedSize + alignment;
|
||||
auto cpuPointer = this->mmapFunction(0, totalSizeToAlloc, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||
|
||||
auto cpuBasePointer = cpuPointer;
|
||||
cpuPointer = alignUp(cpuPointer, alignment);
|
||||
|
||||
auto pointerDiff = ptrDiff(cpuPointer, cpuBasePointer);
|
||||
std::unique_ptr<BufferObject, BufferObject::Deleter> bo(this->createBufferObjectInMemoryRegion(&this->getDrm(allocationData.rootDeviceIndex), reinterpret_cast<uintptr_t>(cpuPointer), alignedSize, 0u, maxOsContextCount));
|
||||
|
||||
if (!bo) {
|
||||
this->munmapFunction(cpuBasePointer, totalSizeToAlloc);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint64_t offset = 0;
|
||||
if (!retrieveMmapOffsetForBufferObject(allocationData.rootDeviceIndex, *bo, I915_MMAP_OFFSET_WB, offset)) {
|
||||
this->munmapFunction(cpuPointer, size);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto retPtr = this->mmapFunction(cpuPointer, alignedSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, getDrm(allocationData.rootDeviceIndex).getFileDescriptor(), static_cast<off_t>(offset));
|
||||
DEBUG_BREAK_IF(retPtr != cpuPointer);
|
||||
|
||||
obtainGpuAddress(allocationData, bo.get(), gpuAddress);
|
||||
emitPinningRequest(bo.get(), allocationData);
|
||||
|
||||
auto allocation = std::make_unique<DrmAllocation>(allocationData.rootDeviceIndex, allocationData.type, bo.get(), cpuPointer, bo->peekAddress(), alignedSize, MemoryPool::System4KBPages);
|
||||
allocation->setMmapPtr(cpuPointer);
|
||||
allocation->setMmapSize(alignedSize);
|
||||
if (pointerDiff != 0) {
|
||||
allocation->registerMemoryToUnmap(cpuBasePointer, pointerDiff, this->munmapFunction);
|
||||
}
|
||||
[[maybe_unused]] int retCode = this->munmapFunction(ptrOffset(cpuPointer, alignedSize), alignment - pointerDiff);
|
||||
DEBUG_BREAK_IF(retCode != 0);
|
||||
allocation->setReservedAddressRange(reinterpret_cast<void *>(gpuAddress), alignedSize);
|
||||
if (!allocation->setCacheRegion(&this->getDrm(allocationData.rootDeviceIndex), static_cast<CacheRegion>(allocationData.cacheRegion))) {
|
||||
if (pointerDiff == 0) {
|
||||
allocation->registerMemoryToUnmap(cpuBasePointer, totalSizeToAlloc, this->munmapFunction);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bo.release();
|
||||
|
||||
return allocation.release();
|
||||
} else {
|
||||
return createAllocWithAlignmentFromUserptr(allocationData, size, alignment, alignedSize, gpuAddress);
|
||||
}
|
||||
}
|
||||
|
||||
void *DrmMemoryManager::lockResourceInLocalMemoryImpl(BufferObject *bo) {
|
||||
if (bo == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto rootDeviceIndex = this->getRootDeviceIndex(bo->peekDrm());
|
||||
|
||||
uint64_t offset = 0;
|
||||
if (!retrieveMmapOffsetForBufferObject(rootDeviceIndex, *bo, I915_MMAP_OFFSET_WC, offset)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto addr = mmapFunction(nullptr, bo->peekSize(), PROT_WRITE | PROT_READ, MAP_SHARED, getDrm(rootDeviceIndex).getFileDescriptor(), static_cast<off_t>(offset));
|
||||
DEBUG_BREAK_IF(addr == MAP_FAILED);
|
||||
|
||||
bo->setLockedAddress(addr);
|
||||
|
||||
return bo->peekLockedAddress();
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
@ -5,10 +5,56 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "shared/source/gmm_helper/gmm.h"
|
||||
#include "shared/source/gmm_helper/gmm_helper.h"
|
||||
#include "shared/source/memory_manager/memory_pool.h"
|
||||
#include "shared/source/os_interface/linux/drm_memory_manager.h"
|
||||
|
||||
namespace NEO {
|
||||
|
||||
DrmAllocation *DrmMemoryManager::createMultiHostAllocation(const AllocationData &allocationData) {
|
||||
return allocateGraphicsMemoryWithAlignmentImpl(allocationData);
|
||||
if (!isAligned<MemoryConstants::pageSize>(allocationData.size)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto numTiles = allocationData.storageInfo.getNumBanks();
|
||||
auto sizePerTile = allocationData.size;
|
||||
auto hostSizeToAllocate = numTiles * sizePerTile;
|
||||
|
||||
auto cpuBasePointer = alignedMallocWrapper(hostSizeToAllocate, MemoryConstants::pageSize);
|
||||
if (!cpuBasePointer) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
zeroCpuMemoryIfRequested(allocationData, cpuBasePointer, hostSizeToAllocate);
|
||||
|
||||
auto gpuAddress = acquireGpuRange(sizePerTile, allocationData.rootDeviceIndex, HeapIndex::HEAP_STANDARD);
|
||||
auto allocation = new DrmAllocation(allocationData.rootDeviceIndex, numTiles, allocationData.type,
|
||||
nullptr /*bo*/, cpuBasePointer, gpuAddress, sizePerTile, MemoryPool::System4KBPages);
|
||||
|
||||
allocation->storageInfo = allocationData.storageInfo;
|
||||
allocation->setFlushL3Required(true);
|
||||
allocation->setUncacheable(true);
|
||||
allocation->setReservedAddressRange(reinterpret_cast<void *>(gpuAddress), sizePerTile);
|
||||
allocation->setDriverAllocatedCpuPtr(cpuBasePointer);
|
||||
|
||||
for (auto tile = 0u, currentBank = 0u; tile < numTiles; ++tile, ++currentBank) {
|
||||
while (!allocationData.storageInfo.memoryBanks.test(currentBank)) {
|
||||
++currentBank;
|
||||
}
|
||||
|
||||
auto boHostPtr = static_cast<uint8_t *>(cpuBasePointer) + tile * sizePerTile;
|
||||
auto bo = allocUserptr(reinterpret_cast<uintptr_t>(boHostPtr), sizePerTile, 0, allocationData.rootDeviceIndex);
|
||||
if (!bo) {
|
||||
freeGraphicsMemoryImpl(allocation);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bo->setAddress(gpuAddress);
|
||||
allocation->getBufferObjectToModify(currentBank) = bo;
|
||||
}
|
||||
|
||||
return allocation;
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
@ -30,80 +30,8 @@ DrmAllocation *DrmMemoryManager::createUSMHostAllocationFromSharedHandle(osHandl
|
||||
handle, MemoryPool::SystemCpuInaccessible);
|
||||
}
|
||||
|
||||
DrmAllocation *DrmMemoryManager::createAllocWithAlignment(const AllocationData &allocationData, size_t size, size_t alignment, size_t alignedSize, uint64_t gpuAddress) {
|
||||
bool useBooMmap = this->getDrm(allocationData.rootDeviceIndex).getMemoryInfo() && allocationData.useMmapObject;
|
||||
|
||||
if (DebugManager.flags.EnableBOMmapCreate.get() != -1) {
|
||||
useBooMmap = DebugManager.flags.EnableBOMmapCreate.get();
|
||||
}
|
||||
|
||||
if (useBooMmap) {
|
||||
auto totalSizeToAlloc = alignedSize + alignment;
|
||||
auto cpuPointer = this->mmapFunction(0, totalSizeToAlloc, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
|
||||
|
||||
auto cpuBasePointer = cpuPointer;
|
||||
cpuPointer = alignUp(cpuPointer, alignment);
|
||||
|
||||
auto pointerDiff = ptrDiff(cpuPointer, cpuBasePointer);
|
||||
std::unique_ptr<BufferObject, BufferObject::Deleter> bo(this->createBufferObjectInMemoryRegion(&this->getDrm(allocationData.rootDeviceIndex), reinterpret_cast<uintptr_t>(cpuPointer), alignedSize, 0u, maxOsContextCount));
|
||||
|
||||
if (!bo) {
|
||||
this->munmapFunction(cpuBasePointer, totalSizeToAlloc);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint64_t offset = 0;
|
||||
if (!retrieveMmapOffsetForBufferObject(allocationData.rootDeviceIndex, *bo, I915_MMAP_OFFSET_WB, offset)) {
|
||||
this->munmapFunction(cpuPointer, size);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto retPtr = this->mmapFunction(cpuPointer, alignedSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, getDrm(allocationData.rootDeviceIndex).getFileDescriptor(), static_cast<off_t>(offset));
|
||||
DEBUG_BREAK_IF(retPtr != cpuPointer);
|
||||
|
||||
obtainGpuAddress(allocationData, bo.get(), gpuAddress);
|
||||
emitPinningRequest(bo.get(), allocationData);
|
||||
|
||||
auto allocation = new DrmAllocation(allocationData.rootDeviceIndex, allocationData.type, bo.get(), cpuPointer, bo->peekAddress(), alignedSize, MemoryPool::System4KBPages);
|
||||
allocation->setMmapPtr(cpuPointer);
|
||||
allocation->setMmapSize(alignedSize);
|
||||
if (pointerDiff != 0) {
|
||||
allocation->registerMemoryToUnmap(cpuBasePointer, pointerDiff, this->munmapFunction);
|
||||
}
|
||||
[[maybe_unused]] int retCode = this->munmapFunction(ptrOffset(cpuPointer, alignedSize), alignment - pointerDiff);
|
||||
DEBUG_BREAK_IF(retCode != 0);
|
||||
allocation->setReservedAddressRange(reinterpret_cast<void *>(gpuAddress), alignedSize);
|
||||
|
||||
bo.release();
|
||||
|
||||
return allocation;
|
||||
} else {
|
||||
return createAllocWithAlignmentFromUserptr(allocationData, size, alignment, alignedSize, gpuAddress);
|
||||
}
|
||||
}
|
||||
|
||||
GraphicsAllocation *DrmMemoryManager::createSharedUnifiedMemoryAllocation(const AllocationData &allocationData) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void *DrmMemoryManager::lockResourceInLocalMemoryImpl(BufferObject *bo) {
|
||||
if (bo == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto rootDeviceIndex = this->getRootDeviceIndex(bo->peekDrm());
|
||||
|
||||
uint64_t offset = 0;
|
||||
if (!retrieveMmapOffsetForBufferObject(rootDeviceIndex, *bo, I915_MMAP_OFFSET_WC, offset)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto addr = mmapFunction(nullptr, bo->peekSize(), PROT_WRITE | PROT_READ, MAP_SHARED, getDrm(rootDeviceIndex).getFileDescriptor(), static_cast<off_t>(offset));
|
||||
DEBUG_BREAK_IF(addr == MAP_FAILED);
|
||||
|
||||
bo->setLockedAddress(addr);
|
||||
|
||||
return bo->peekLockedAddress();
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
@ -5,11 +5,20 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "shared/source/execution_environment/root_device_environment.h"
|
||||
#include "shared/source/os_interface/linux/drm_memory_operations_handler_bind.h"
|
||||
#include "shared/source/os_interface/linux/drm_memory_operations_handler_default.h"
|
||||
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||
|
||||
namespace NEO {
|
||||
|
||||
std::unique_ptr<DrmMemoryOperationsHandler> DrmMemoryOperationsHandler::create(Drm &drm, uint32_t rootDeviceIndex) {
|
||||
bool useVmBind = drm.isVmBindAvailable();
|
||||
|
||||
if (useVmBind) {
|
||||
return std::make_unique<DrmMemoryOperationsHandlerBind>(drm.getRootDeviceEnvironment(), rootDeviceIndex);
|
||||
}
|
||||
|
||||
return std::make_unique<DrmMemoryOperationsHandlerDefault>();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user