Skip to content

Commit 90eb1af

Browse files
fix: correct shared cross device alloc capabilities
allow for access in case of multiple exposed devices when there is only one root device Related-To: HSD-18042639532 Signed-off-by: Mateusz Jablonski <[email protected]> Source: 645de5a
1 parent 3b1f8a3 commit 90eb1af

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

level_zero/core/source/context/context_imp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,9 @@ struct ContextImp : Context, NEO::NonCopyableAndNonMovableClass {
194194
ContextExt *getContextExt() override {
195195
return contextExt;
196196
}
197+
uint32_t getNumDevices() const {
198+
return numDevices;
199+
}
197200

198201
protected:
199202
ze_result_t getIpcMemHandlesImpl(const void *ptr, uint32_t *numIpcHandles, ze_ipc_mem_handle_t *pIpcHandles);

level_zero/core/source/device/device_imp.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -837,10 +837,13 @@ ze_result_t DeviceImp::getMemoryAccessProperties(ze_device_memory_access_propert
837837
pMemAccessProperties->sharedSingleDeviceAllocCapabilities =
838838
static_cast<ze_memory_access_cap_flags_t>(productHelper.getSingleDeviceSharedMemCapabilities(isKmdMigrationAvailable));
839839

840+
auto defaultContext = static_cast<ContextImp *>(getDriverHandle()->getDefaultContext());
841+
auto multiDeviceWithSingleRoot = defaultContext->getNumDevices() > 1 && defaultContext->rootDeviceIndices.size() == 1;
842+
840843
pMemAccessProperties->sharedCrossDeviceAllocCapabilities = {};
841-
if (isKmdMigrationAvailable &&
842-
memoryManager->hasPageFaultsEnabled(*this->getNEODevice()) &&
843-
NEO::debugManager.flags.EnableConcurrentSharedCrossP2PDeviceAccess.get() == 1) {
844+
if (multiDeviceWithSingleRoot || (isKmdMigrationAvailable &&
845+
memoryManager->hasPageFaultsEnabled(*this->getNEODevice()) &&
846+
NEO::debugManager.flags.EnableConcurrentSharedCrossP2PDeviceAccess.get() == 1)) {
844847
pMemAccessProperties->sharedCrossDeviceAllocCapabilities = ZE_MEMORY_ACCESS_CAP_FLAG_RW |
845848
ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT |
846849
ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC |

level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,6 +3036,62 @@ TEST_F(MemoryAccessPropertiesSharedCrossDeviceCapsTest,
30363036
EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities);
30373037
}
30383038

3039+
struct MemoryAccessPropertiesMultiDevicesSingleRootDeviceTest : public Test<MultiDeviceFixtureHierarchy> {
3040+
void SetUp() override {
3041+
this->deviceHierarchyMode = NEO::DeviceHierarchyMode::flat;
3042+
this->numRootDevices = 1;
3043+
MultiDeviceFixtureHierarchy::setUp();
3044+
}
3045+
};
3046+
TEST_F(MemoryAccessPropertiesMultiDevicesSingleRootDeviceTest,
3047+
givenSingleRootAndMultiDevicesWhenCallingGetMemoryAccessPropertiesThenSharedCrossDeviceAccessSupportIsReturned) {
3048+
L0::Device *device = driverHandle->devices[0];
3049+
ze_device_memory_access_properties_t properties;
3050+
auto result = device->getMemoryAccessProperties(&properties);
3051+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
3052+
3053+
ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities =
3054+
ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT |
3055+
ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT_ATOMIC;
3056+
EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities);
3057+
}
3058+
3059+
struct MemoryAccessPropertiesMultiDevicesMultiRootDeviceTest : public Test<MultiDeviceFixtureHierarchy> {
3060+
void SetUp() override {
3061+
this->deviceHierarchyMode = NEO::DeviceHierarchyMode::flat;
3062+
this->numRootDevices = 2;
3063+
MultiDeviceFixtureHierarchy::setUp();
3064+
}
3065+
};
3066+
TEST_F(MemoryAccessPropertiesMultiDevicesMultiRootDeviceTest,
3067+
givenMultiRootAndMultiSubDevicesWhenCallingGetMemoryAccessPropertiesThenSharedCrossDeviceAccessSupportIsNotExposed) {
3068+
L0::Device *device = driverHandle->devices[0];
3069+
ze_device_memory_access_properties_t properties;
3070+
auto result = device->getMemoryAccessProperties(&properties);
3071+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
3072+
3073+
ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities = 0;
3074+
EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities);
3075+
}
3076+
3077+
struct MemoryAccessPropertiesSingleExposedDeviceTest : public Test<MultiDeviceFixtureHierarchy> {
3078+
void SetUp() override {
3079+
this->deviceHierarchyMode = NEO::DeviceHierarchyMode::composite;
3080+
this->numRootDevices = 1;
3081+
MultiDeviceFixtureHierarchy::setUp();
3082+
}
3083+
};
3084+
TEST_F(MemoryAccessPropertiesSingleExposedDeviceTest,
3085+
givenSingleExposedDevicesWhenCallingGetMemoryAccessPropertiesThenSharedCrossDeviceAccessSupportIsNotExposed) {
3086+
L0::Device *device = driverHandle->devices[0];
3087+
ze_device_memory_access_properties_t properties;
3088+
auto result = device->getMemoryAccessProperties(&properties);
3089+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
3090+
3091+
ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities = 0;
3092+
EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities);
3093+
}
3094+
30393095
using MultipleDevicesP2PDevice0Access0Atomic0Device1Access0Atomic0Test = MultipleDevicesP2PFixture<0, 0>;
30403096
TEST_F(MultipleDevicesP2PDevice0Access0Atomic0Device1Access0Atomic0Test, WhenCallingGetP2PPropertiesWithBothDevicesHavingNoAccessSupportThenNoSupportIsReturned) {
30413097
L0::Device *device0 = driverHandle->devices[0];

0 commit comments

Comments
 (0)