From f8d04b1e665a3db7c0739aee1e5032167d199c2e Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Thu, 5 Aug 2021 15:51:25 +0000 Subject: [PATCH] Add method to adjust device bitfield Signed-off-by: Bartosz Dunajski --- .../helpers/memory_properties_helpers.cpp | 8 +--- .../helpers/memory_properties_helpers.h | 3 +- .../memory_properties_helpers_base.inl | 12 ++++- .../memory_properties_helpers_tests.cpp | 47 +++++++++++++++++++ .../memory_properties_flags.h | 5 +- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/opencl/source/helpers/memory_properties_helpers.cpp b/opencl/source/helpers/memory_properties_helpers.cpp index 08b3135e9d..513495739c 100644 --- a/opencl/source/helpers/memory_properties_helpers.cpp +++ b/opencl/source/helpers/memory_properties_helpers.cpp @@ -12,13 +12,7 @@ namespace NEO { -void MemoryPropertiesHelper::addExtraMemoryProperties(MemoryProperties &properties, cl_mem_flags flags, cl_mem_flags_intel flagsIntel, - const Device *pDevice) { -} - -DeviceBitfield MemoryPropertiesHelper::adjustDeviceBitfield(uint32_t rootDeviceIndex, const MemoryProperties &memoryProperties, - DeviceBitfield deviceBitfield) { - return deviceBitfield; +void MemoryPropertiesHelper::addExtraMemoryProperties(MemoryProperties &properties, cl_mem_flags flags, cl_mem_flags_intel flagsIntel) { } bool MemoryPropertiesHelper::parseMemoryProperties(const cl_mem_properties_intel *properties, MemoryProperties &memoryProperties, diff --git a/opencl/source/helpers/memory_properties_helpers.h b/opencl/source/helpers/memory_properties_helpers.h index 5996342666..54e19f628f 100644 --- a/opencl/source/helpers/memory_properties_helpers.h +++ b/opencl/source/helpers/memory_properties_helpers.h @@ -25,8 +25,7 @@ class MemoryPropertiesHelper { IMAGE, }; - static void addExtraMemoryProperties(MemoryProperties &properties, cl_mem_flags flags, cl_mem_flags_intel flagsIntel, - const Device *pDevice); + static void addExtraMemoryProperties(MemoryProperties &properties, cl_mem_flags flags, cl_mem_flags_intel flagsIntel); static MemoryProperties createMemoryProperties(cl_mem_flags flags, cl_mem_flags_intel flagsIntel, cl_mem_alloc_flags_intel allocflags, const Device *pDevice); diff --git a/opencl/source/helpers/memory_properties_helpers_base.inl b/opencl/source/helpers/memory_properties_helpers_base.inl index 5b2a9a3f0d..61b980a132 100644 --- a/opencl/source/helpers/memory_properties_helpers_base.inl +++ b/opencl/source/helpers/memory_properties_helpers_base.inl @@ -85,7 +85,9 @@ MemoryProperties MemoryPropertiesHelper::createMemoryProperties(cl_mem_flags fla memoryProperties.flags.resource48Bit = true; } - addExtraMemoryProperties(memoryProperties, flags, flagsIntel, pDevice); + memoryProperties.pDevice = pDevice; + + addExtraMemoryProperties(memoryProperties, flags, flagsIntel); return memoryProperties; } @@ -110,4 +112,12 @@ void MemoryPropertiesHelper::fillCachePolicyInProperties(AllocationProperties &a allocationProperties.cacheRegion = cacheRegion; } +DeviceBitfield MemoryPropertiesHelper::adjustDeviceBitfield(uint32_t rootDeviceIndex, const MemoryProperties &memoryProperties, + DeviceBitfield deviceBitfieldIn) { + if (rootDeviceIndex == memoryProperties.pDevice->getRootDeviceIndex()) { + return deviceBitfieldIn & memoryProperties.pDevice->getDeviceBitfield(); + } + return deviceBitfieldIn; +} + } // namespace NEO diff --git a/opencl/test/unit_test/helpers/memory_properties_helpers_tests.cpp b/opencl/test/unit_test/helpers/memory_properties_helpers_tests.cpp index e28a749d0a..8ba9147b4f 100644 --- a/opencl/test/unit_test/helpers/memory_properties_helpers_tests.cpp +++ b/opencl/test/unit_test/helpers/memory_properties_helpers_tests.cpp @@ -11,6 +11,7 @@ #include "opencl/source/helpers/memory_properties_helpers.h" #include "opencl/source/mem_obj/mem_obj_helper.h" +#include "opencl/test/unit_test/mocks/mock_cl_device.h" #include "opencl/test/unit_test/mocks/mock_context.h" #include "CL/cl_ext_intel.h" @@ -334,3 +335,49 @@ TEST_F(MemoryPropertiesHelperTests, givenMemFlagsWithFlagsAndPropertiesWhenParsi EXPECT_EQ(testInput.expectedResult, flags); } } + +TEST_F(MemoryPropertiesHelperTests, WhenAdjustingDeviceBitfieldThenCorrectBitfieldIsReturned) { + UltClDeviceFactory deviceFactory{2, 4}; + auto memoryPropertiesRootDevice0 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.rootDevices[0]->getDevice()); + auto memoryPropertiesRootDevice0Tile0 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.subDevices[0]->getDevice()); + auto memoryPropertiesRootDevice0Tile1 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.subDevices[1]->getDevice()); + auto memoryPropertiesRootDevice1 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.rootDevices[1]->getDevice()); + auto memoryPropertiesRootDevice1Tile0 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.subDevices[4]->getDevice()); + auto memoryPropertiesRootDevice1Tile1 = MemoryPropertiesHelper::createMemoryProperties(0, 0, 0, &deviceFactory.subDevices[5]->getDevice()); + + DeviceBitfield devicesInContextBitfield0001{0b1}; + DeviceBitfield devicesInContextBitfield0101{0b101}; + DeviceBitfield devicesInContextBitfield1010{0b1010}; + DeviceBitfield devicesInContextBitfield1111{0b1111}; + + MemoryProperties memoryPropertiesToProcess[] = { + memoryPropertiesRootDevice0, memoryPropertiesRootDevice0Tile0, memoryPropertiesRootDevice0Tile1, + memoryPropertiesRootDevice1, memoryPropertiesRootDevice1Tile0, memoryPropertiesRootDevice1Tile1}; + + DeviceBitfield devicesInContextBitfields[] = {devicesInContextBitfield0001, devicesInContextBitfield0101, + devicesInContextBitfield1010, devicesInContextBitfield1111}; + uint32_t rootDevicesToProcess[] = {0, 1, 2}; + + EXPECT_EQ(0b1u, MemoryPropertiesHelper::adjustDeviceBitfield(0, memoryPropertiesRootDevice0Tile0, devicesInContextBitfield1111).to_ulong()); + EXPECT_EQ(0b10u, MemoryPropertiesHelper::adjustDeviceBitfield(0, memoryPropertiesRootDevice0Tile1, devicesInContextBitfield1111).to_ulong()); + EXPECT_EQ(0b1111u, MemoryPropertiesHelper::adjustDeviceBitfield(1, memoryPropertiesRootDevice0Tile0, devicesInContextBitfield1111).to_ulong()); + EXPECT_EQ(0b1111u, MemoryPropertiesHelper::adjustDeviceBitfield(1, memoryPropertiesRootDevice0Tile1, devicesInContextBitfield1111).to_ulong()); + + EXPECT_EQ(0b101u, MemoryPropertiesHelper::adjustDeviceBitfield(0, memoryPropertiesRootDevice0, devicesInContextBitfield0101).to_ulong()); + EXPECT_EQ(0b1010u, MemoryPropertiesHelper::adjustDeviceBitfield(0, memoryPropertiesRootDevice0, devicesInContextBitfield1010).to_ulong()); + EXPECT_EQ(0b1111u, MemoryPropertiesHelper::adjustDeviceBitfield(0, memoryPropertiesRootDevice0, devicesInContextBitfield1111).to_ulong()); + + for (auto processedRootDevice : rootDevicesToProcess) { + for (auto devicesInContextBitfield : devicesInContextBitfields) { + for (auto &memoryProperties : memoryPropertiesToProcess) { + auto expectedDeviceBitfield = devicesInContextBitfield; + if (processedRootDevice == memoryProperties.pDevice->getRootDeviceIndex()) { + expectedDeviceBitfield &= memoryProperties.pDevice->getDeviceBitfield(); + } + auto adjustedDeviceBitfield = MemoryPropertiesHelper::adjustDeviceBitfield( + processedRootDevice, memoryProperties, devicesInContextBitfield); + EXPECT_EQ(expectedDeviceBitfield, adjustedDeviceBitfield); + } + } + } +} \ No newline at end of file diff --git a/shared/source/memory_properties/memory_properties_flags.h b/shared/source/memory_properties/memory_properties_flags.h index 4cf3349829..18c3e0fb86 100644 --- a/shared/source/memory_properties/memory_properties_flags.h +++ b/shared/source/memory_properties/memory_properties_flags.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2020 Intel Corporation + * Copyright (C) 2019-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -10,7 +10,10 @@ namespace NEO { +class Device; + struct MemoryProperties { + const Device *pDevice = nullptr; union { MemoryFlags flags; uint32_t allFlags = 0;