diff --git a/level_zero/api/core/ze_fence.cpp b/level_zero/api/core/ze_fence.cpp index 7a8aa8cfff..9d85e32822 100644 --- a/level_zero/api/core/ze_fence.cpp +++ b/level_zero/api/core/ze_fence.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -38,5 +38,5 @@ zeFenceQueryStatus( ZE_APIEXPORT ze_result_t ZE_APICALL zeFenceReset( ze_fence_handle_t hFence) { - return L0::Fence::fromHandle(hFence)->reset(); + return L0::Fence::fromHandle(hFence)->reset(false); } diff --git a/level_zero/core/source/fence/fence.cpp b/level_zero/core/source/fence/fence.cpp index 7c76837508..98b520e89d 100644 --- a/level_zero/core/source/fence/fence.cpp +++ b/level_zero/core/source/fence/fence.cpp @@ -17,7 +17,7 @@ namespace L0 { Fence *Fence::create(CommandQueueImp *cmdQueue, const ze_fence_desc_t *desc) { auto fence = new Fence(cmdQueue); UNRECOVERABLE_IF(fence == nullptr); - fence->reset(); + fence->reset(!!(desc->flags & ZE_FENCE_FLAG_SIGNALED)); return fence; } @@ -36,8 +36,12 @@ ze_result_t Fence::assignTaskCountFromCsr() { return ZE_RESULT_SUCCESS; } -ze_result_t Fence::reset() { - taskCount = std::numeric_limits::max(); +ze_result_t Fence::reset(bool signaled) { + if (signaled) { + taskCount = 0; + } else { + taskCount = std::numeric_limits::max(); + } return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/source/fence/fence.h b/level_zero/core/source/fence/fence.h index 15d9aa34df..dd2139cfac 100644 --- a/level_zero/core/source/fence/fence.h +++ b/level_zero/core/source/fence/fence.h @@ -30,7 +30,7 @@ struct Fence : _ze_fence_handle_t { MOCKABLE_VIRTUAL ze_result_t hostSynchronize(uint64_t timeout); MOCKABLE_VIRTUAL ze_result_t queryStatus(); MOCKABLE_VIRTUAL ze_result_t assignTaskCountFromCsr(); - MOCKABLE_VIRTUAL ze_result_t reset(); + MOCKABLE_VIRTUAL ze_result_t reset(bool signaled); static Fence *fromHandle(ze_fence_handle_t handle) { return static_cast(handle); } diff --git a/level_zero/core/test/unit_tests/mocks/mock_fence.h b/level_zero/core/test/unit_tests/mocks/mock_fence.h index 9a7f05846d..3f23df53ea 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_fence.h +++ b/level_zero/core/test/unit_tests/mocks/mock_fence.h @@ -36,7 +36,7 @@ struct Mock : public Fence { ADDMETHOD_NOBASE(hostSynchronize, ze_result_t, ZE_RESULT_SUCCESS, (uint64_t timeout)); ADDMETHOD_NOBASE(queryStatus, ze_result_t, ZE_RESULT_SUCCESS, ()); ADDMETHOD_NOBASE(assignTaskCountFromCsr, ze_result_t, ZE_RESULT_SUCCESS, ()); - ADDMETHOD_NOBASE(reset, ze_result_t, ZE_RESULT_SUCCESS, ()); + ADDMETHOD_NOBASE(reset, ze_result_t, ZE_RESULT_SUCCESS, (bool signaled)); }; } // namespace ult diff --git a/level_zero/core/test/unit_tests/sources/fence/test_fence.cpp b/level_zero/core/test/unit_tests/sources/fence/test_fence.cpp index d5583c2a50..60079c9453 100644 --- a/level_zero/core/test/unit_tests/sources/fence/test_fence.cpp +++ b/level_zero/core/test/unit_tests/sources/fence/test_fence.cpp @@ -38,7 +38,8 @@ TEST_F(FenceTest, whenQueryingStatusThenCsrAllocationsAreDownloaded) { auto csr = std::make_unique(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield()); *csr->tagAddress = 0; Mock cmdQueue(device, csr.get()); - auto fence = Fence::create(&cmdQueue, nullptr); + ze_fence_desc_t fenceDesc = {}; + auto fence = Fence::create(&cmdQueue, &fenceDesc); EXPECT_NE(nullptr, fence); @@ -52,11 +53,34 @@ TEST_F(FenceTest, whenQueryingStatusThenCsrAllocationsAreDownloaded) { EXPECT_EQ(ZE_RESULT_SUCCESS, status); } +TEST_F(FenceTest, givenFenceSignalFlagUsedWhenQueryingFenceAfterCreationThenReturnReadyStatus) { + auto csr = std::make_unique(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield()); + *csr->tagAddress = 0; + Mock cmdQueue(device, csr.get()); + + ze_fence_desc_t fenceDesc = {}; + fenceDesc.stype = ZE_STRUCTURE_TYPE_FENCE_DESC; + fenceDesc.pNext = nullptr; + fenceDesc.flags = ZE_FENCE_FLAG_SIGNALED; + + auto fence = Fence::create(&cmdQueue, &fenceDesc); + EXPECT_NE(nullptr, fence); + + EXPECT_FALSE(csr->downloadAllocationsCalled); + + auto status = fence->queryStatus(); + EXPECT_EQ(ZE_RESULT_SUCCESS, status); + + status = fence->destroy(); + EXPECT_EQ(ZE_RESULT_SUCCESS, status); +} + TEST_F(FenceTest, whenQueryingStatusWithoutCsrAndFenceUnsignaledThenReturnsNotReady) { auto csr = std::make_unique(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield()); *csr->tagAddress = 0; Mock cmdQueue(device, csr.get()); - auto fence = Fence::create(&cmdQueue, nullptr); + ze_fence_desc_t fenceDesc = {}; + auto fence = Fence::create(&cmdQueue, &fenceDesc); EXPECT_NE(nullptr, fence); auto status = fence->queryStatus(); @@ -70,7 +94,7 @@ TEST_F(FenceTest, GivenGpuHangWhenHostSynchronizeIsCalledThenDeviceLostIsReturne csr->testTaskCountReadyReturnValue = false; Mock cmdqueue(device, csr.get()); - ze_fence_desc_t desc; + ze_fence_desc_t desc = {}; std::unique_ptr> fence; fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc))); @@ -91,7 +115,7 @@ TEST_F(FenceTest, GivenNoGpuHangAndOneNanosecondTimeoutWhenHostSynchronizeIsCall csr->testTaskCountReadyReturnValue = false; Mock cmdqueue(device, csr.get()); - ze_fence_desc_t desc; + ze_fence_desc_t desc = {}; std::unique_ptr> fence; fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc))); @@ -111,7 +135,7 @@ TEST_F(FenceTest, GivenLongPeriodOfGpuCheckAndOneNanosecondTimeoutWhenHostSynchr csr->testTaskCountReadyReturnValue = false; Mock cmdqueue(device, csr.get()); - ze_fence_desc_t desc; + ze_fence_desc_t desc = {}; std::unique_ptr> fence; fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc))); @@ -131,7 +155,7 @@ TEST_F(FenceTest, GivenSuccessfulQueryResultAndNoTimeoutWhenHostSynchronizeIsCal csr->testTaskCountReadyReturnValue = true; Mock cmdqueue(device, csr.get()); - ze_fence_desc_t desc; + ze_fence_desc_t desc = {}; std::unique_ptr> fence; fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc))); @@ -153,7 +177,8 @@ TEST_F(FenceSynchronizeTest, givenCallToFenceHostSynchronizeWithTimeoutZeroAndSt Mock cmdQueue(device, csr.get()); std::unique_ptr fence; - fence = std::unique_ptr(L0::Fence::create(&cmdQueue, nullptr)); + ze_fence_desc_t fenceDesc = {}; + fence = std::unique_ptr(L0::Fence::create(&cmdQueue, &fenceDesc)); EXPECT_NE(nullptr, fence); *csr->tagAddress = 0; ze_result_t result = fence->hostSynchronize(0); @@ -166,7 +191,8 @@ TEST_F(FenceSynchronizeTest, givenCallToFenceHostSynchronizeWithNonZeroTimeoutAn Mock cmdQueue(device, csr.get()); std::unique_ptr fence; - fence = std::unique_ptr(L0::Fence::create(&cmdQueue, nullptr)); + ze_fence_desc_t fenceDesc = {}; + fence = std::unique_ptr(L0::Fence::create(&cmdQueue, &fenceDesc)); EXPECT_NE(nullptr, fence); *csr->tagAddress = 0; ze_result_t result = fence->hostSynchronize(10); @@ -178,7 +204,8 @@ TEST_F(FenceSynchronizeTest, givenCallToFenceHostSynchronizeWithTimeoutZeroAndTa csr = std::make_unique(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield()); Mock cmdQueue(device, csr.get()); - auto fence = std::unique_ptr(whitebox_cast(Fence::create(&cmdQueue, nullptr))); + ze_fence_desc_t fenceDesc = {}; + auto fence = std::unique_ptr(whitebox_cast(Fence::create(&cmdQueue, &fenceDesc))); EXPECT_NE(nullptr, fence); fence->taskCount = 1; @@ -192,7 +219,8 @@ TEST_F(FenceSynchronizeTest, givenCallToFenceHostSynchronizeWithTimeoutNonZeroAn csr = std::make_unique(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield()); Mock cmdQueue(device, csr.get()); - auto fence = std::unique_ptr(whitebox_cast(Fence::create(&cmdQueue, nullptr))); + ze_fence_desc_t fenceDesc = {}; + auto fence = std::unique_ptr(whitebox_cast(Fence::create(&cmdQueue, &fenceDesc))); EXPECT_NE(nullptr, fence); fence->taskCount = 1; @@ -267,7 +295,8 @@ HWTEST_F(FenceAubCsrTest, givenCallToFenceHostSynchronizeWithAubModeCsrReturnsSu neoDevice->resetCommandStreamReceiver(aubCsr); Mock cmdQueue(device, aubCsr); - auto fence = std::unique_ptr(Fence::create(&cmdQueue, nullptr)); + ze_fence_desc_t fenceDesc = {}; + auto fence = std::unique_ptr(Fence::create(&cmdQueue, &fenceDesc)); ze_result_t result = fence->hostSynchronize(10); EXPECT_EQ(ZE_RESULT_SUCCESS, result); diff --git a/level_zero/experimental/test/unit_tests/sources/tracing/test_fence_api_tracing.cpp b/level_zero/experimental/test/unit_tests/sources/tracing/test_fence_api_tracing.cpp index 97e565d748..6b610d97b6 100644 --- a/level_zero/experimental/test/unit_tests/sources/tracing/test_fence_api_tracing.cpp +++ b/level_zero/experimental/test/unit_tests/sources/tracing/test_fence_api_tracing.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -86,10 +86,10 @@ TEST_F(zeAPITracingRuntimeTests, WhenCallingFenceResetTracingWrapperWithOneSetOf struct { ze_command_queue_handle_t hCommandQueue0; - ze_fence_desc_t desc0; + ze_fence_desc_t desc0{}; ze_fence_handle_t hFence0; ze_command_queue_handle_t hCommandQueue1; - ze_fence_desc_t desc1; + ze_fence_desc_t desc1{}; ze_fence_handle_t hFence1; ze_fence_handle_t hFenceAPI; void *instanceData0;