mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 05:24:02 +08:00
Support for Mapping Physical with Virtual Memory
Related-To: LOCI-3422, LOCI-3421 Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
47be5d04b3
commit
f928d695e7
@@ -536,6 +536,34 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo
|
||||
return true;
|
||||
}
|
||||
|
||||
GraphicsAllocation *MemoryManager::allocatePhysicalGraphicsMemory(const AllocationProperties &properties) {
|
||||
AllocationData allocationData;
|
||||
GraphicsAllocation *allocation = nullptr;
|
||||
getAllocationData(allocationData, properties, nullptr, createStorageInfoFromProperties(properties));
|
||||
|
||||
AllocationStatus status = AllocationStatus::Error;
|
||||
if (this->localMemorySupported[allocationData.rootDeviceIndex]) {
|
||||
allocation = allocatePhysicalLocalDeviceMemory(allocationData, status);
|
||||
if (allocation) {
|
||||
getLocalMemoryUsageBankSelector(properties.allocationType, properties.rootDeviceIndex)->reserveOnBanks(allocationData.storageInfo.getMemoryBanks(), allocation->getUnderlyingBufferSize());
|
||||
status = this->registerLocalMemAlloc(allocation, properties.rootDeviceIndex);
|
||||
}
|
||||
} else {
|
||||
allocation = allocatePhysicalDeviceMemory(allocationData, status);
|
||||
}
|
||||
if (allocation && status != AllocationStatus::Success) {
|
||||
freeGraphicsMemory(allocation);
|
||||
allocation = nullptr;
|
||||
}
|
||||
if (!allocation) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
fileLoggerInstance().logAllocation(allocation);
|
||||
registerAllocationInOs(allocation);
|
||||
return allocation;
|
||||
}
|
||||
|
||||
GraphicsAllocation *MemoryManager::allocateGraphicsMemoryInPreferredPool(const AllocationProperties &properties, const void *hostPtr) {
|
||||
AllocationData allocationData;
|
||||
getAllocationData(allocationData, properties, hostPtr, createStorageInfoFromProperties(properties));
|
||||
|
||||
@@ -58,10 +58,15 @@ struct AddressRange {
|
||||
struct VirtualMemoryReservation {
|
||||
AddressRange virtualAddressRange;
|
||||
MemoryFlags flags;
|
||||
bool mapped;
|
||||
struct PhysicalMemoryAllocation *mappedAllocation;
|
||||
uint32_t rootDeviceIndex;
|
||||
};
|
||||
|
||||
struct PhysicalMemoryAllocation {
|
||||
GraphicsAllocation *allocation;
|
||||
Device *device;
|
||||
};
|
||||
|
||||
constexpr size_t paddingBufferSize = 2 * MemoryConstants::megaByte;
|
||||
|
||||
namespace MemoryTransferHelper {
|
||||
@@ -99,6 +104,7 @@ class MemoryManager {
|
||||
GraphicsAllocation *allocateInternalGraphicsMemoryWithHostCopy(uint32_t rootDeviceIndex, DeviceBitfield bitField, const void *ptr, size_t size);
|
||||
|
||||
MOCKABLE_VIRTUAL GraphicsAllocation *allocateGraphicsMemoryInPreferredPool(const AllocationProperties &properties, const void *hostPtr);
|
||||
MOCKABLE_VIRTUAL GraphicsAllocation *allocatePhysicalGraphicsMemory(const AllocationProperties &properties);
|
||||
|
||||
virtual bool verifyHandle(osHandle handle, uint32_t rootDeviceIndex, bool) { return true; }
|
||||
virtual bool isNTHandle(osHandle handle, uint32_t rootDeviceIndex) { return false; }
|
||||
@@ -257,6 +263,10 @@ class MemoryManager {
|
||||
[[nodiscard]] std::unique_lock<std::mutex> lockKernelAllocationMap() { return std::unique_lock<std::mutex>(this->kernelAllocationMutex); };
|
||||
std::map<void *, VirtualMemoryReservation *> &getVirtualMemoryReservationMap() { return this->virtualMemoryReservationMap; };
|
||||
[[nodiscard]] std::unique_lock<std::mutex> lockVirtualMemoryReservationMap() { return std::unique_lock<std::mutex>(this->virtualMemoryReservationMapMutex); };
|
||||
std::map<void *, PhysicalMemoryAllocation *> &getPhysicalMemoryAllocationMap() { return this->physicalMemoryAllocationMap; };
|
||||
[[nodiscard]] std::unique_lock<std::mutex> lockPhysicalMemoryAllocationMap() { return std::unique_lock<std::mutex>(this->physicalMemoryAllocationMapMutex); };
|
||||
virtual bool mapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize) = 0;
|
||||
virtual void unMapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize, OsContext *osContext, uint32_t rootDeviceIndex) = 0;
|
||||
|
||||
protected:
|
||||
bool getAllocationData(AllocationData &allocationData, const AllocationProperties &properties, const void *hostPtr, const StorageInfo &storageInfo);
|
||||
@@ -282,6 +292,8 @@ class MemoryManager {
|
||||
MOCKABLE_VIRTUAL GraphicsAllocation *allocateGraphicsMemoryForImage(const AllocationData &allocationData);
|
||||
virtual GraphicsAllocation *allocateGraphicsMemoryForImageImpl(const AllocationData &allocationData, std::unique_ptr<Gmm> gmm) = 0;
|
||||
virtual GraphicsAllocation *allocateMemoryByKMD(const AllocationData &allocationData) = 0;
|
||||
virtual GraphicsAllocation *allocatePhysicalLocalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) = 0;
|
||||
virtual GraphicsAllocation *allocatePhysicalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) = 0;
|
||||
virtual void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
||||
virtual void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
||||
virtual void freeAssociatedResourceImpl(GraphicsAllocation &graphicsAllocation) { return unlockResourceImpl(graphicsAllocation); };
|
||||
@@ -320,6 +332,8 @@ class MemoryManager {
|
||||
std::mutex kernelAllocationMutex;
|
||||
std::map<void *, VirtualMemoryReservation *> virtualMemoryReservationMap;
|
||||
std::mutex virtualMemoryReservationMapMutex;
|
||||
std::map<void *, PhysicalMemoryAllocation *> physicalMemoryAllocationMap;
|
||||
std::mutex physicalMemoryAllocationMapMutex;
|
||||
};
|
||||
|
||||
std::unique_ptr<DeferredDeleter> createDeferredDeleter();
|
||||
|
||||
@@ -372,6 +372,80 @@ void OsAgnosticMemoryManager::cleanOsHandles(OsHandleStorage &handleStorage, uin
|
||||
}
|
||||
}
|
||||
|
||||
void OsAgnosticMemoryManager::unMapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize, OsContext *osContext, uint32_t rootDeviceIndex) {
|
||||
physicalAllocation->setCpuPtrAndGpuAddress(nullptr, 0u);
|
||||
physicalAllocation->setReservedAddressRange(nullptr, 0u);
|
||||
}
|
||||
|
||||
bool OsAgnosticMemoryManager::mapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize) {
|
||||
physicalAllocation->setCpuPtrAndGpuAddress(nullptr, gpuRange);
|
||||
physicalAllocation->setReservedAddressRange(reinterpret_cast<void *>(gpuRange), bufferSize);
|
||||
return true;
|
||||
}
|
||||
|
||||
GraphicsAllocation *OsAgnosticMemoryManager::allocatePhysicalLocalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) {
|
||||
status = AllocationStatus::Error;
|
||||
MemoryAllocation *allocation = nullptr;
|
||||
auto numHandles = allocationData.storageInfo.getNumBanks();
|
||||
|
||||
std::unique_ptr<Gmm> gmm;
|
||||
size_t sizeAligned64k = 0;
|
||||
sizeAligned64k = alignUp(allocationData.size, MemoryConstants::pageSize64k);
|
||||
|
||||
auto hwInfo = executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHardwareInfo();
|
||||
gmm = std::make_unique<Gmm>(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(),
|
||||
nullptr,
|
||||
sizeAligned64k,
|
||||
MemoryConstants::pageSize64k,
|
||||
CacheSettingsHelper::getGmmUsageType(allocationData.type, allocationData.flags.uncacheable, *hwInfo),
|
||||
allocationData.flags.preferCompressed,
|
||||
allocationData.storageInfo,
|
||||
true);
|
||||
|
||||
auto systemMemory = allocateSystemMemory(sizeAligned64k, MemoryConstants::pageSize64k);
|
||||
if (systemMemory) {
|
||||
auto sizeOfHeapChunk = sizeAligned64k;
|
||||
allocation = new MemoryAllocation(allocationData.rootDeviceIndex, numHandles, allocationData.type, systemMemory, systemMemory,
|
||||
0u, sizeAligned64k, counter,
|
||||
MemoryPool::LocalMemory, false, allocationData.flags.flushL3, maxOsContextCount);
|
||||
counter++;
|
||||
allocation->setDefaultGmm(gmm.release());
|
||||
allocation->sizeToFree = sizeOfHeapChunk;
|
||||
}
|
||||
|
||||
if (allocation) {
|
||||
allocation->overrideMemoryPool(MemoryPool::LocalMemory);
|
||||
allocation->storageInfo = allocationData.storageInfo;
|
||||
status = AllocationStatus::Success;
|
||||
}
|
||||
|
||||
return allocation;
|
||||
}
|
||||
|
||||
GraphicsAllocation *OsAgnosticMemoryManager::allocatePhysicalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) {
|
||||
status = AllocationStatus::Error;
|
||||
auto hwInfo = executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHardwareInfo();
|
||||
|
||||
auto gmm = std::make_unique<Gmm>(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), allocationData.hostPtr,
|
||||
allocationData.size, 0u, CacheSettingsHelper::getGmmUsageType(allocationData.type, allocationData.flags.uncacheable, *hwInfo),
|
||||
allocationData.flags.preferCompressed, allocationData.storageInfo, true);
|
||||
|
||||
GraphicsAllocation *alloc = nullptr;
|
||||
|
||||
auto ptr = allocateSystemMemory(alignUp(allocationData.size, MemoryConstants::pageSize), MemoryConstants::pageSize);
|
||||
if (ptr != nullptr) {
|
||||
alloc = new MemoryAllocation(allocationData.rootDeviceIndex, allocationData.type, ptr, ptr, 0u, allocationData.size,
|
||||
counter, MemoryPool::SystemCpuInaccessible, allocationData.flags.uncacheable, allocationData.flags.flushL3, maxOsContextCount);
|
||||
counter++;
|
||||
}
|
||||
|
||||
if (alloc) {
|
||||
alloc->setDefaultGmm(gmm.release());
|
||||
status = AllocationStatus::Success;
|
||||
}
|
||||
return alloc;
|
||||
}
|
||||
|
||||
GraphicsAllocation *OsAgnosticMemoryManager::allocateMemoryByKMD(const AllocationData &allocationData) {
|
||||
auto hwInfo = executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHardwareInfo();
|
||||
|
||||
|
||||
@@ -55,6 +55,10 @@ class OsAgnosticMemoryManager : public MemoryManager {
|
||||
GraphicsAllocation *allocateUSMHostGraphicsMemory(const AllocationData &allocationData) override;
|
||||
GraphicsAllocation *allocateGraphicsMemory64kb(const AllocationData &allocationData) override;
|
||||
GraphicsAllocation *allocateMemoryByKMD(const AllocationData &allocationData) override;
|
||||
GraphicsAllocation *allocatePhysicalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) override;
|
||||
GraphicsAllocation *allocatePhysicalLocalDeviceMemory(const AllocationData &allocationData, AllocationStatus &status) override;
|
||||
bool mapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize) override;
|
||||
void unMapPhysicalToVirtualMemory(GraphicsAllocation *physicalAllocation, uint64_t gpuRange, size_t bufferSize, OsContext *osContext, uint32_t rootDeviceIndex) override;
|
||||
GraphicsAllocation *allocateGraphicsMemoryForImageImpl(const AllocationData &allocationData, std::unique_ptr<Gmm> gmm) override;
|
||||
GraphicsAllocation *allocateGraphicsMemoryWithGpuVa(const AllocationData &allocationData) override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user