Implement fence creation flag

Related-To: NEO-6242

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2022-03-17 09:43:17 +00:00
committed by Compute-Runtime-Automation
parent bb753784cc
commit e4d8dfcdd9
6 changed files with 54 additions and 21 deletions

View File

@@ -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);
}

View File

@@ -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<uint32_t>::max();
ze_result_t Fence::reset(bool signaled) {
if (signaled) {
taskCount = 0;
} else {
taskCount = std::numeric_limits<uint32_t>::max();
}
return ZE_RESULT_SUCCESS;
}

View File

@@ -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<Fence *>(handle); }

View File

@@ -36,7 +36,7 @@ struct Mock<Fence> : 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

View File

@@ -38,7 +38,8 @@ TEST_F(FenceTest, whenQueryingStatusThenCsrAllocationsAreDownloaded) {
auto csr = std::make_unique<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
*csr->tagAddress = 0;
Mock<CommandQueue> 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<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
*csr->tagAddress = 0;
Mock<CommandQueue> 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<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
*csr->tagAddress = 0;
Mock<CommandQueue> 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<CommandQueue> cmdqueue(device, csr.get());
ze_fence_desc_t desc;
ze_fence_desc_t desc = {};
std::unique_ptr<WhiteBox<L0::Fence>> fence;
fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc)));
@@ -91,7 +115,7 @@ TEST_F(FenceTest, GivenNoGpuHangAndOneNanosecondTimeoutWhenHostSynchronizeIsCall
csr->testTaskCountReadyReturnValue = false;
Mock<CommandQueue> cmdqueue(device, csr.get());
ze_fence_desc_t desc;
ze_fence_desc_t desc = {};
std::unique_ptr<WhiteBox<L0::Fence>> fence;
fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc)));
@@ -111,7 +135,7 @@ TEST_F(FenceTest, GivenLongPeriodOfGpuCheckAndOneNanosecondTimeoutWhenHostSynchr
csr->testTaskCountReadyReturnValue = false;
Mock<CommandQueue> cmdqueue(device, csr.get());
ze_fence_desc_t desc;
ze_fence_desc_t desc = {};
std::unique_ptr<WhiteBox<L0::Fence>> fence;
fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc)));
@@ -131,7 +155,7 @@ TEST_F(FenceTest, GivenSuccessfulQueryResultAndNoTimeoutWhenHostSynchronizeIsCal
csr->testTaskCountReadyReturnValue = true;
Mock<CommandQueue> cmdqueue(device, csr.get());
ze_fence_desc_t desc;
ze_fence_desc_t desc = {};
std::unique_ptr<WhiteBox<L0::Fence>> fence;
fence.reset(whitebox_cast(Fence::create(&cmdqueue, &desc)));
@@ -153,7 +177,8 @@ TEST_F(FenceSynchronizeTest, givenCallToFenceHostSynchronizeWithTimeoutZeroAndSt
Mock<CommandQueue> cmdQueue(device, csr.get());
std::unique_ptr<L0::Fence> fence;
fence = std::unique_ptr<L0::Fence>(L0::Fence::create(&cmdQueue, nullptr));
ze_fence_desc_t fenceDesc = {};
fence = std::unique_ptr<L0::Fence>(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<CommandQueue> cmdQueue(device, csr.get());
std::unique_ptr<L0::Fence> fence;
fence = std::unique_ptr<L0::Fence>(L0::Fence::create(&cmdQueue, nullptr));
ze_fence_desc_t fenceDesc = {};
fence = std::unique_ptr<L0::Fence>(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<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
Mock<CommandQueue> cmdQueue(device, csr.get());
auto fence = std::unique_ptr<Fence>(whitebox_cast(Fence::create(&cmdQueue, nullptr)));
ze_fence_desc_t fenceDesc = {};
auto fence = std::unique_ptr<Fence>(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<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
Mock<CommandQueue> cmdQueue(device, csr.get());
auto fence = std::unique_ptr<Fence>(whitebox_cast(Fence::create(&cmdQueue, nullptr)));
ze_fence_desc_t fenceDesc = {};
auto fence = std::unique_ptr<Fence>(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<CommandQueue> cmdQueue(device, aubCsr);
auto fence = std::unique_ptr<L0::Fence>(Fence::create(&cmdQueue, nullptr));
ze_fence_desc_t fenceDesc = {};
auto fence = std::unique_ptr<L0::Fence>(Fence::create(&cmdQueue, &fenceDesc));
ze_result_t result = fence->hostSynchronize(10);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);

View File

@@ -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;