diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index c968ee5c68..8ded554c47 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -374,12 +374,23 @@ ze_result_t DeviceImp::getMemoryAccessProperties(ze_device_memory_access_propert auto &hwInfoConfig = *NEO::HwInfoConfig::get(hwInfo.platform.eProductFamily); pMemAccessProperties->hostAllocCapabilities = static_cast(hwInfoConfig.getHostMemCapabilities(&hwInfo)); + pMemAccessProperties->deviceAllocCapabilities = - ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC; + static_cast(hwInfoConfig.getDeviceMemCapabilities()); + pMemAccessProperties->sharedSingleDeviceAllocCapabilities = - ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC; - pMemAccessProperties->sharedCrossDeviceAllocCapabilities = 0; - pMemAccessProperties->sharedSystemAllocCapabilities = 0; + static_cast(hwInfoConfig.getSingleDeviceSharedMemCapabilities()); + + pMemAccessProperties->sharedCrossDeviceAllocCapabilities = {}; + if (this->getNEODevice()->getHardwareInfo().capabilityTable.p2pAccessSupported) { + pMemAccessProperties->sharedCrossDeviceAllocCapabilities |= ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT; + if (this->getNEODevice()->getHardwareInfo().capabilityTable.p2pAtomicAccessSupported) { + pMemAccessProperties->sharedCrossDeviceAllocCapabilities |= ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT_ATOMIC; + } + } + + pMemAccessProperties->sharedSystemAllocCapabilities = + static_cast(hwInfoConfig.getSharedSystemMemCapabilities(&hwInfo)); return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/test/unit_tests/sources/device/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_device.cpp index f84f180fa5..553ac493a5 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_device.cpp @@ -1755,6 +1755,28 @@ TEST_F(MultipleDevicesTest, givenTwoRootDevicesFromSameFamilyThenCanAccessPeerSu EXPECT_EQ(ZE_RESULT_SUCCESS, res); } +using DeviceTests = Test; + +TEST_F(DeviceTests, WhenGettingMemoryAccessPropertiesThenSuccessIsReturned) { + ze_device_memory_access_properties_t properties; + auto result = device->getMemoryAccessProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + auto &hwInfo = device->getHwInfo(); + auto &hwInfoConfig = *NEO::HwInfoConfig::get(hwInfo.platform.eProductFamily); + auto expectedHostAllocCapabilities = static_cast(hwInfoConfig.getHostMemCapabilities(&hwInfo)); + EXPECT_EQ(expectedHostAllocCapabilities, properties.hostAllocCapabilities); + + auto expectedDeviceAllocCapabilities = static_cast(hwInfoConfig.getDeviceMemCapabilities()); + EXPECT_EQ(expectedDeviceAllocCapabilities, properties.deviceAllocCapabilities); + + auto expectedSharedSingleDeviceAllocCapabilities = static_cast(hwInfoConfig.getSingleDeviceSharedMemCapabilities()); + EXPECT_EQ(expectedSharedSingleDeviceAllocCapabilities, properties.sharedSingleDeviceAllocCapabilities); + + auto expectedSharedSystemAllocCapabilities = static_cast(hwInfoConfig.getSharedSystemMemCapabilities(&hwInfo)); + EXPECT_EQ(expectedSharedSystemAllocCapabilities, properties.sharedSystemAllocCapabilities); +} + template struct MultipleDevicesP2PFixture : public ::testing::Test { void SetUp() override { @@ -1806,6 +1828,42 @@ struct MultipleDevicesP2PFixture : public ::testing::Test { const uint32_t numSubDevices = 2u; }; +using MemoryAccessPropertieP2PAccess0Atomic0 = MultipleDevicesP2PFixture<0, 0, 0, 0>; +TEST_F(MemoryAccessPropertieP2PAccess0Atomic0, WhenCallingGetMemoryAccessPropertiesWithDevicesHavingNoAccessSupportThenNoSupportIsReturned) { + L0::Device *device = driverHandle->devices[0]; + ze_device_memory_access_properties_t properties; + auto result = device->getMemoryAccessProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities = {}; + EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities); +} + +using MemoryAccessPropertieP2PAccess1Atomic0 = MultipleDevicesP2PFixture<1, 0, 0, 0>; +TEST_F(MemoryAccessPropertieP2PAccess1Atomic0, WhenCallingGetMemoryAccessPropertiesWithDevicesHavingP2PAccessSupportThenSupportIsReturned) { + L0::Device *device = driverHandle->devices[0]; + ze_device_memory_access_properties_t properties; + auto result = device->getMemoryAccessProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities = + ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT; + EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities); +} + +using MemoryAccessPropertieP2PAccess1Atomic1 = MultipleDevicesP2PFixture<1, 1, 0, 0>; +TEST_F(MemoryAccessPropertieP2PAccess1Atomic1, WhenCallingGetMemoryAccessPropertiesWithDevicesHavingP2PAndAtomicAccessSupportThenSupportIsReturned) { + L0::Device *device = driverHandle->devices[0]; + ze_device_memory_access_properties_t properties; + auto result = device->getMemoryAccessProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + ze_memory_access_cap_flags_t expectedSharedCrossDeviceAllocCapabilities = + ZE_MEMORY_ACCESS_CAP_FLAG_RW | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT | + ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT_ATOMIC; + EXPECT_EQ(expectedSharedCrossDeviceAllocCapabilities, properties.sharedCrossDeviceAllocCapabilities); +} + using MultipleDevicesP2PDevice0Access0Atomic0Device1Access0Atomic0Test = MultipleDevicesP2PFixture<0, 0, 0, 0>; TEST_F(MultipleDevicesP2PDevice0Access0Atomic0Device1Access0Atomic0Test, WhenCallingGetP2PPropertiesWithBothDevicesHavingNoAccessSupportThenNoSupportIsReturned) { L0::Device *device0 = driverHandle->devices[0];