mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 21:18:24 +08:00
Add support for USM shared in WSL for dGPU
This patch force KMD allocation path for USM shared Related-To: NEO-6913 Signed-off-by: Kamil Diedrich kamil.diedrich@intel.com
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
f27dcbfb85
commit
b0c97e49ea
@@ -11,6 +11,7 @@
|
||||
|
||||
namespace NEO {
|
||||
struct ImageInfo;
|
||||
|
||||
struct AllocationProperties {
|
||||
union {
|
||||
struct {
|
||||
@@ -40,6 +41,8 @@ struct AllocationProperties {
|
||||
AllocationType allocationType = AllocationType::UNKNOWN;
|
||||
GraphicsAllocation::UsmInitialPlacement usmInitialPlacement = GraphicsAllocation::UsmInitialPlacement::DEFAULT;
|
||||
ImageInfo *imgInfo = nullptr;
|
||||
bool forceKMDAllocation = false;
|
||||
bool makeGPUVaDifferentThanCPUPtr = false;
|
||||
bool multiStorageResource = false;
|
||||
ColouringPolicy colouringPolicy = ColouringPolicy::DeviceCountBased;
|
||||
size_t colouringGranularity = MemoryConstants::pageSize64k;
|
||||
@@ -122,6 +125,8 @@ struct AllocationData {
|
||||
size_t alignment = 0;
|
||||
StorageInfo storageInfo = {};
|
||||
ImageInfo *imgInfo = nullptr;
|
||||
bool forceKMDAllocation = false;
|
||||
bool makeGPUVaDifferentThanCPUPtr = false;
|
||||
uint32_t rootDeviceIndex = 0;
|
||||
OsContext *osContext = nullptr;
|
||||
bool useMmapObject = true;
|
||||
|
||||
@@ -447,6 +447,8 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo
|
||||
allocationData.storageInfo = storageInfo;
|
||||
allocationData.alignment = properties.alignment ? properties.alignment : MemoryConstants::preferredAlignment;
|
||||
allocationData.imgInfo = properties.imgInfo;
|
||||
allocationData.forceKMDAllocation = properties.forceKMDAllocation;
|
||||
allocationData.makeGPUVaDifferentThanCPUPtr = properties.makeGPUVaDifferentThanCPUPtr;
|
||||
|
||||
if (allocationData.flags.allocateMemory) {
|
||||
allocationData.hostPtr = nullptr;
|
||||
|
||||
@@ -493,9 +493,12 @@ void *SVMAllocsManager::createUnifiedAllocationWithDeviceStorage(size_t size, co
|
||||
subDevices};
|
||||
cpuProperties.alignment = MemoryConstants::pageSize2Mb;
|
||||
cpuProperties.flags.isUSMHostAllocation = useExternalHostPtrForCpu;
|
||||
cpuProperties.forceKMDAllocation = true;
|
||||
cpuProperties.makeGPUVaDifferentThanCPUPtr = true;
|
||||
auto cacheRegion = MemoryPropertiesHelper::getCacheRegion(unifiedMemoryProperties.allocationFlags);
|
||||
MemoryPropertiesHelper::fillCachePolicyInProperties(cpuProperties, false, svmProperties.readOnly, false, cacheRegion);
|
||||
GraphicsAllocation *allocationCpu = memoryManager->allocateGraphicsMemoryWithProperties(cpuProperties, externalPtr);
|
||||
|
||||
if (!allocationCpu) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC
|
||||
|
||||
[[maybe_unused]] auto status = true;
|
||||
|
||||
if (executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHardwareInfo()->capabilityTable.gpuAddressSpace >= MemoryConstants::max64BitAppAddress || is32bit) {
|
||||
if ((!(preferredAllocationMethod == GfxMemoryAllocationMethod::AllocateByKmd && allocationData.makeGPUVaDifferentThanCPUPtr) && executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getHardwareInfo()->capabilityTable.gpuAddressSpace >= MemoryConstants::max64BitAppAddress) || is32bit) {
|
||||
status = mapGpuVirtualAddress(wddmAllocation.get(), cpuPtr);
|
||||
} else {
|
||||
status = mapGpuVirtualAddress(wddmAllocation.get(), nullptr);
|
||||
@@ -224,7 +224,7 @@ GraphicsAllocation *WddmMemoryManager::allocateUSMHostGraphicsMemory(const Alloc
|
||||
GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryWithAlignment(const AllocationData &allocationData) {
|
||||
auto pageSize = NEO::OSInterface::osEnabled64kbPages ? MemoryConstants::pageSize64k : MemoryConstants::pageSize;
|
||||
bool requiresNonStandardAlignment = allocationData.alignment > pageSize;
|
||||
if ((preferredAllocationMethod == GfxMemoryAllocationMethod::UseUmdSystemPtr) || requiresNonStandardAlignment) {
|
||||
if ((preferredAllocationMethod == GfxMemoryAllocationMethod::UseUmdSystemPtr) || (requiresNonStandardAlignment && allocationData.forceKMDAllocation == false)) {
|
||||
return allocateSystemMemoryAndCreateGraphicsAllocationFromIt(allocationData);
|
||||
} else {
|
||||
return allocateGraphicsMemoryUsingKmdAndMapItToCpuVA(allocationData, NEO::OSInterface::osEnabled64kbPages);
|
||||
|
||||
@@ -107,7 +107,7 @@ class WddmMemoryManager : public MemoryManager {
|
||||
GraphicsAllocation *createAllocationFromHandle(osHandle handle, bool requireSpecificBitness, bool ntHandle, AllocationType allocationType, uint32_t rootDeviceIndex);
|
||||
static bool validateAllocation(WddmAllocation *alloc);
|
||||
MOCKABLE_VIRTUAL bool createWddmAllocation(WddmAllocation *allocation, void *requiredGpuPtr);
|
||||
bool mapGpuVirtualAddress(WddmAllocation *graphicsAllocation, const void *requiredGpuPtr);
|
||||
MOCKABLE_VIRTUAL bool mapGpuVirtualAddress(WddmAllocation *graphicsAllocation, const void *requiredGpuPtr);
|
||||
bool mapGpuVaForOneHandleAllocation(WddmAllocation *graphicsAllocation, const void *requiredGpuPtr);
|
||||
bool mapMultiHandleAllocationWithRetry(WddmAllocation *allocation, const void *requiredGpuPtr);
|
||||
bool createGpuAllocationsWithRetry(WddmAllocation *graphicsAllocation);
|
||||
|
||||
Reference in New Issue
Block a user