From 2661fd9522c98bbadecc03cb91133cf0425850a7 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Tue, 8 Jul 2025 15:04:19 +0000 Subject: [PATCH] feature: define default descriptors for counter based event and USM user can use default descriptor to simplify creation Related-To: NEO-14560 Signed-off-by: Mateusz Jablonski --- .../driver_experimental/public/zex_event.cpp | 2 +- .../core/source/context/context_imp.cpp | 8 +-- .../source/helpers/default_descriptors.cpp | 21 ------ .../core/source/helpers/default_descriptors.h | 3 - .../unit_tests/sources/event/test_event.cpp | 15 +++++ .../unit_tests/sources/memory/test_memory.cpp | 64 ++++++++++++++++++- .../driver_experimental/zex_common.h | 10 +++ level_zero/include/level_zero/ze_intel_gpu.h | 11 ++++ 8 files changed, 102 insertions(+), 32 deletions(-) diff --git a/level_zero/api/driver_experimental/public/zex_event.cpp b/level_zero/api/driver_experimental/public/zex_event.cpp index 0a871f6abb..f17c3240e0 100644 --- a/level_zero/api/driver_experimental/public/zex_event.cpp +++ b/level_zero/api/driver_experimental/public/zex_event.cpp @@ -49,7 +49,7 @@ zexCounterBasedEventCreate2(ze_context_handle_t hContext, ze_device_handle_t hDe constexpr uint32_t supportedBasedFlags = (ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE); auto device = Device::fromHandle(toInternalType(hDevice)); - auto counterBasedEventDesc = desc ? desc : &DefaultDescriptors::counterBasedEventDesc; + auto counterBasedEventDesc = desc ? desc : &defaultCounterBasedEventDesc; if (!hDevice || !phEvent) { return ZE_RESULT_ERROR_INVALID_ARGUMENT; diff --git a/level_zero/core/source/context/context_imp.cpp b/level_zero/core/source/context/context_imp.cpp index aa15d61f7b..ff2fee5e89 100644 --- a/level_zero/core/source/context/context_imp.cpp +++ b/level_zero/core/source/context/context_imp.cpp @@ -75,7 +75,7 @@ ze_result_t ContextImp::allocHostMem(const ze_host_mem_alloc_desc_t *hostDesc, size_t alignment, void **ptr) { - auto hostMemDesc = hostDesc ? hostDesc : &DefaultDescriptors::hostMemDesc; + auto hostMemDesc = hostDesc ? hostDesc : &defaultHostMemDesc; if (NEO::debugManager.flags.ForceExtendedUSMBufferSize.get() >= 1) { size += (MemoryConstants::pageSize * NEO::debugManager.flags.ForceExtendedUSMBufferSize.get()); @@ -214,7 +214,7 @@ ze_result_t ContextImp::allocDeviceMem(ze_device_handle_t hDevice, size_t size, size_t alignment, void **ptr) { - auto deviceMemDesc = deviceDesc ? deviceDesc : &DefaultDescriptors::deviceMemDesc; + auto deviceMemDesc = deviceDesc ? deviceDesc : &defaultDeviceMemDesc; if (NEO::debugManager.flags.ForceExtendedUSMBufferSize.get() >= 1) { size += (MemoryConstants::pageSize * NEO::debugManager.flags.ForceExtendedUSMBufferSize.get()); @@ -337,8 +337,8 @@ ze_result_t ContextImp::allocSharedMem(ze_device_handle_t hDevice, size_t alignment, void **ptr) { - auto deviceMemDesc = deviceDesc ? deviceDesc : &DefaultDescriptors::deviceMemDesc; - auto hostMemDesc = hostDesc ? hostDesc : &DefaultDescriptors::hostMemDesc; + auto deviceMemDesc = deviceDesc ? deviceDesc : &defaultDeviceMemDesc; + auto hostMemDesc = hostDesc ? hostDesc : &defaultHostMemDesc; if (NEO::debugManager.flags.ForceExtendedUSMBufferSize.get() >= 1) { size += (MemoryConstants::pageSize * NEO::debugManager.flags.ForceExtendedUSMBufferSize.get()); diff --git a/level_zero/core/source/helpers/default_descriptors.cpp b/level_zero/core/source/helpers/default_descriptors.cpp index 460b978c01..f878c74d5a 100644 --- a/level_zero/core/source/helpers/default_descriptors.cpp +++ b/level_zero/core/source/helpers/default_descriptors.cpp @@ -32,27 +32,6 @@ const ze_command_queue_desc_t commandQueueDesc = { .mode = ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS, .priority = ZE_COMMAND_QUEUE_PRIORITY_NORMAL, }; - -const ze_device_mem_alloc_desc_t deviceMemDesc = { - .stype = ze_structure_type_t::ZE_STRUCTURE_TYPE_DEVICE_MEM_ALLOC_DESC, - .pNext = nullptr, - .flags = static_cast(ZE_DEVICE_MEM_ALLOC_FLAG_BIAS_CACHED), - .ordinal = 0}; - -const ze_host_mem_alloc_desc_t hostMemDesc = { - .stype = ze_structure_type_t::ZE_STRUCTURE_TYPE_HOST_MEM_ALLOC_DESC, - .pNext = nullptr, - .flags = static_cast(ZE_HOST_MEM_ALLOC_FLAG_BIAS_CACHED | ZE_HOST_MEM_ALLOC_FLAG_BIAS_INITIAL_PLACEMENT)}; - -const zex_counter_based_event_desc_t counterBasedEventDesc = { - .stype = ZEX_STRUCTURE_COUNTER_BASED_EVENT_DESC, - .pNext = nullptr, - .flags = static_cast( - ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | - ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE | - ZEX_COUNTER_BASED_EVENT_FLAG_HOST_VISIBLE), - .signalScope = static_cast(ZE_EVENT_SCOPE_FLAG_HOST), - .waitScope = static_cast(ZE_EVENT_SCOPE_FLAG_DEVICE)}; } // namespace DefaultDescriptors } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/source/helpers/default_descriptors.h b/level_zero/core/source/helpers/default_descriptors.h index a08d69989b..4c4733101f 100644 --- a/level_zero/core/source/helpers/default_descriptors.h +++ b/level_zero/core/source/helpers/default_descriptors.h @@ -14,8 +14,5 @@ namespace L0 { namespace DefaultDescriptors { extern const ze_context_desc_t contextDesc; extern const ze_command_queue_desc_t commandQueueDesc; -extern const ze_device_mem_alloc_desc_t deviceMemDesc; -extern const ze_host_mem_alloc_desc_t hostMemDesc; -extern const zex_counter_based_event_desc_t counterBasedEventDesc; } // namespace DefaultDescriptors } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/test/unit_tests/sources/event/test_event.cpp b/level_zero/core/test/unit_tests/sources/event/test_event.cpp index 769f51da81..bb07dd46e0 100644 --- a/level_zero/core/test/unit_tests/sources/event/test_event.cpp +++ b/level_zero/core/test/unit_tests/sources/event/test_event.cpp @@ -5148,6 +5148,21 @@ HWTEST2_F(EventTimestampTest, givenAppendMemoryCopyIsCalledWhenCpuCopyIsUsedAndC context->freeMem(devicePtr); } +TEST_F(EventTests, givenDefaultDescriptorWhenCreatingCbEvent2ThenEventWithNoProfilingAndSignalScopeHostAndDeviceScopeWaitIsCreated) { + ze_event_handle_t handle = nullptr; + + EXPECT_EQ(ZE_RESULT_SUCCESS, zexCounterBasedEventCreate2(context, device, &defaultCounterBasedEventDesc, &handle)); + + auto eventObj = Event::fromHandle(handle); + EXPECT_TRUE(eventObj->isCounterBasedExplicitlyEnabled()); + EXPECT_FALSE(eventObj->isIpcImported()); + EXPECT_FALSE(eventObj->isEventTimestampFlagSet()); + EXPECT_TRUE(eventObj->isSignalScope(ZE_EVENT_SCOPE_FLAG_HOST)); + EXPECT_TRUE(eventObj->isWaitScope(ZE_EVENT_SCOPE_FLAG_DEVICE)); + EXPECT_EQ(static_cast(ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE), eventObj->getCounterBasedFlags()); + zeEventDestroy(handle); +} + TEST_F(EventTests, givenNullDescriptorWhenCreatingCbEvent2ThenEventWithNoProfilingAndSignalScopeHostAndDeviceScopeWaitIsCreated) { ze_event_handle_t handle = nullptr; diff --git a/level_zero/core/test/unit_tests/sources/memory/test_memory.cpp b/level_zero/core/test/unit_tests/sources/memory/test_memory.cpp index 7cd2a7fe84..85c8082b7b 100644 --- a/level_zero/core/test/unit_tests/sources/memory/test_memory.cpp +++ b/level_zero/core/test/unit_tests/sources/memory/test_memory.cpp @@ -743,7 +743,7 @@ TEST_F(MemoryTest, whenAllocatingSharedMemoryWithUncachedFlagThenLocallyUncached ASSERT_EQ(result, ZE_RESULT_SUCCESS); } -TEST_F(MemoryTest, whenAllocatingHostMemoryWithoutDescriptorThenThenCachedResourceIsCreated) { +TEST_F(MemoryTest, whenAllocatingHostMemoryWithoutDescriptorThenCachedResourceIsCreated) { size_t size = 10; size_t alignment = 1u; void *ptr = nullptr; @@ -760,7 +760,7 @@ TEST_F(MemoryTest, whenAllocatingHostMemoryWithoutDescriptorThenThenCachedResour ASSERT_EQ(result, ZE_RESULT_SUCCESS); } -TEST_F(MemoryTest, whenAllocatingDeviceMemoryWithoutDescriptorThenThenCachedResourceIsCreated) { +TEST_F(MemoryTest, whenAllocatingDeviceMemoryWithoutDescriptorThenCachedResourceIsCreated) { size_t size = 10; size_t alignment = 1u; void *ptr = nullptr; @@ -779,7 +779,7 @@ TEST_F(MemoryTest, whenAllocatingDeviceMemoryWithoutDescriptorThenThenCachedReso ASSERT_EQ(result, ZE_RESULT_SUCCESS); } -TEST_F(MemoryTest, whenAllocatingSharedMemoryWithoutDescriptorThenCachedResourceWithCpuInitialPlacementIsCreated) { +TEST_F(MemoryTest, whenAllocatingSharedMemoryWithoutDescriptorsThenCachedResourceWithCpuInitialPlacementIsCreated) { size_t size = 10; size_t alignment = 1u; void *ptr = nullptr; @@ -801,6 +801,64 @@ TEST_F(MemoryTest, whenAllocatingSharedMemoryWithoutDescriptorThenCachedResource ASSERT_EQ(result, ZE_RESULT_SUCCESS); } +TEST_F(MemoryTest, whenAllocatingHostMemoryWithDefaultDescriptorThenCachedResourceIsCreated) { + size_t size = 10; + size_t alignment = 1u; + void *ptr = nullptr; + + ze_result_t result = context->allocHostMem(&defaultHostMemDesc, size, alignment, &ptr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_NE(nullptr, ptr); + + auto allocData = driverHandle->getSvmAllocsManager()->getSVMAlloc(ptr); + EXPECT_NE(nullptr, allocData); + EXPECT_EQ(allocData->allocationFlagsProperty.flags.locallyUncachedResource, 0u); + + result = context->freeMem(ptr); + ASSERT_EQ(result, ZE_RESULT_SUCCESS); +} + +TEST_F(MemoryTest, whenAllocatingDeviceMemoryWithDefaultDescriptorThenCachedResourceIsCreated) { + size_t size = 10; + size_t alignment = 1u; + void *ptr = nullptr; + + ze_result_t result = context->allocDeviceMem(device->toHandle(), + &defaultDeviceMemDesc, + size, alignment, &ptr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_NE(nullptr, ptr); + + auto allocData = driverHandle->getSvmAllocsManager()->getSVMAlloc(ptr); + EXPECT_NE(nullptr, allocData); + EXPECT_EQ(allocData->allocationFlagsProperty.flags.locallyUncachedResource, 0u); + + result = context->freeMem(ptr); + ASSERT_EQ(result, ZE_RESULT_SUCCESS); +} + +TEST_F(MemoryTest, whenAllocatingSharedMemoryWithDefaultDescriptorsThenCachedResourceWithCpuInitialPlacementIsCreated) { + size_t size = 10; + size_t alignment = 1u; + void *ptr = nullptr; + + ze_result_t result = context->allocSharedMem(device->toHandle(), + &defaultDeviceMemDesc, + &defaultHostMemDesc, + size, alignment, &ptr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_NE(nullptr, ptr); + + auto allocData = driverHandle->getSvmAllocsManager()->getSVMAlloc(ptr); + EXPECT_NE(nullptr, allocData); + EXPECT_EQ(allocData->allocationFlagsProperty.flags.locallyUncachedResource, 0u); + EXPECT_EQ(allocData->allocationFlagsProperty.allocFlags.usmInitialPlacementCpu, 1u); + EXPECT_EQ(allocData->allocationFlagsProperty.allocFlags.usmInitialPlacementGpu, 0u); + + result = context->freeMem(ptr); + ASSERT_EQ(result, ZE_RESULT_SUCCESS); +} + TEST_F(MemoryTest, whenAllocatingSharedMemoryWithUseHostPtrFlagThenExternalHostPtrIsSet) { size_t size = 10; size_t alignment = 1u; diff --git a/level_zero/include/level_zero/driver_experimental/zex_common.h b/level_zero/include/level_zero/driver_experimental/zex_common.h index 5af6e5119a..c9a69d9726 100644 --- a/level_zero/include/level_zero/driver_experimental/zex_common.h +++ b/level_zero/include/level_zero/driver_experimental/zex_common.h @@ -199,6 +199,16 @@ typedef struct _zex_counter_based_event_desc_t { ///< additional cache hierarchies are invalidated. } zex_counter_based_event_desc_t; +const zex_counter_based_event_desc_t defaultCounterBasedEventDesc = { + .stype = ZEX_STRUCTURE_COUNTER_BASED_EVENT_DESC, + .pNext = nullptr, + .flags = static_cast( + ZEX_COUNTER_BASED_EVENT_FLAG_IMMEDIATE | + ZEX_COUNTER_BASED_EVENT_FLAG_NON_IMMEDIATE | + ZEX_COUNTER_BASED_EVENT_FLAG_HOST_VISIBLE), + .signalScope = static_cast(ZE_EVENT_SCOPE_FLAG_HOST), + .waitScope = static_cast(ZE_EVENT_SCOPE_FLAG_DEVICE)}; + /////////////////////////////////////////////////////////////////////////////// /// @brief Initial Counter Based Event synchronization parameters. This structure may be /// passed as pNext member of ::zex_counter_based_event_desc_t. diff --git a/level_zero/include/level_zero/ze_intel_gpu.h b/level_zero/include/level_zero/ze_intel_gpu.h index 420ce17213..3ef1054b4c 100644 --- a/level_zero/include/level_zero/ze_intel_gpu.h +++ b/level_zero/include/level_zero/ze_intel_gpu.h @@ -599,4 +599,15 @@ ze_result_t ZE_APICALL zeCommandListAppendLaunchKernelWithArguments( } // extern "C" #endif +const ze_device_mem_alloc_desc_t defaultDeviceMemDesc = { + .stype = ze_structure_type_t::ZE_STRUCTURE_TYPE_DEVICE_MEM_ALLOC_DESC, + .pNext = nullptr, + .flags = static_cast(ZE_DEVICE_MEM_ALLOC_FLAG_BIAS_CACHED), + .ordinal = 0}; + +const ze_host_mem_alloc_desc_t defaultHostMemDesc = { + .stype = ze_structure_type_t::ZE_STRUCTURE_TYPE_HOST_MEM_ALLOC_DESC, + .pNext = nullptr, + .flags = static_cast(ZE_HOST_MEM_ALLOC_FLAG_BIAS_CACHED | ZE_HOST_MEM_ALLOC_FLAG_BIAS_INITIAL_PLACEMENT)}; + #endif