From add47dc79f451777ce39682462ce23ef2de1d92f Mon Sep 17 00:00:00 2001 From: Zbigniew Zdanowicz Date: Thu, 6 Oct 2022 18:22:05 +0000 Subject: [PATCH] Add support for cooperative kernels to immediate command lists Signed-off-by: Zbigniew Zdanowicz --- level_zero/core/source/cmdlist/cmdlist.h | 4 +-- level_zero/core/source/cmdlist/cmdlist_hw.h | 4 +-- level_zero/core/source/cmdlist/cmdlist_hw.inl | 10 +++---- .../source/cmdlist/cmdlist_hw_immediate.h | 6 ++++ .../source/cmdlist/cmdlist_hw_immediate.inl | 13 ++++++++ .../core/test/unit_tests/mocks/mock_cmdlist.h | 4 +-- .../test_cmdlist_append_launch_kernel_1.cpp | 30 +++++++++++++++++++ 7 files changed, 60 insertions(+), 11 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist.h b/level_zero/core/source/cmdlist/cmdlist.h index cabc7f94fb..ae779883af 100644 --- a/level_zero/core/source/cmdlist/cmdlist.h +++ b/level_zero/core/source/cmdlist/cmdlist.h @@ -99,9 +99,9 @@ struct CommandList : _ze_command_list_handle_t { const CmdListKernelLaunchParams &launchParams) = 0; virtual ze_result_t appendLaunchCooperativeKernel(ze_kernel_handle_t kernelHandle, const ze_group_count_t *launchKernelArgs, - ze_event_handle_t hSignalEvent, + ze_event_handle_t signalEvent, uint32_t numWaitEvents, - ze_event_handle_t *phWaitEvents) = 0; + ze_event_handle_t *waitEventHandles) = 0; virtual ze_result_t appendLaunchKernelIndirect(ze_kernel_handle_t kernelHandle, const ze_group_count_t *pDispatchArgumentsBuffer, ze_event_handle_t hEvent, uint32_t numWaitEvents, diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.h b/level_zero/core/source/cmdlist/cmdlist_hw.h index a39c016e10..66ac6bdc66 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.h +++ b/level_zero/core/source/cmdlist/cmdlist_hw.h @@ -88,9 +88,9 @@ struct CommandListCoreFamily : CommandListImp { const CmdListKernelLaunchParams &launchParams) override; ze_result_t appendLaunchCooperativeKernel(ze_kernel_handle_t kernelHandle, const ze_group_count_t *launchKernelArgs, - ze_event_handle_t hSignalEvent, + ze_event_handle_t signalEvent, uint32_t numWaitEvents, - ze_event_handle_t *phWaitEvents) override; + ze_event_handle_t *waitEventHandles) override; ze_result_t appendLaunchKernelIndirect(ze_kernel_handle_t kernelHandle, const ze_group_count_t *pDispatchArgumentsBuffer, ze_event_handle_t hEvent, uint32_t numWaitEvents, diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 97861fb0b7..51f848c3dd 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -266,18 +266,18 @@ ze_result_t CommandListCoreFamily::appendLaunchKernel(ze_kernel_h template ze_result_t CommandListCoreFamily::appendLaunchCooperativeKernel(ze_kernel_handle_t kernelHandle, const ze_group_count_t *launchKernelArgs, - ze_event_handle_t hSignalEvent, + ze_event_handle_t signalEvent, uint32_t numWaitEvents, - ze_event_handle_t *phWaitEvents) { + ze_event_handle_t *waitEventHandles) { - ze_result_t ret = addEventsToCmdList(numWaitEvents, phWaitEvents); + ze_result_t ret = addEventsToCmdList(numWaitEvents, waitEventHandles); if (ret) { return ret; } Event *event = nullptr; - if (hSignalEvent) { - event = Event::fromHandle(hSignalEvent); + if (signalEvent) { + event = Event::fromHandle(signalEvent); } CmdListKernelLaunchParams launchParams = {}; diff --git a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h index 86aab502c0..b831941833 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h +++ b/level_zero/core/source/cmdlist/cmdlist_hw_immediate.h @@ -118,6 +118,12 @@ struct CommandListCoreFamilyImmediate : public CommandListCoreFamily::appendMemoryRangesBar return flushImmediate(ret, true, hSignalEvent); } +template +ze_result_t CommandListCoreFamilyImmediate::appendLaunchCooperativeKernel(ze_kernel_handle_t kernelHandle, + const ze_group_count_t *launchKernelArgs, + ze_event_handle_t signalEvent, + uint32_t numWaitEvents, + ze_event_handle_t *waitEventHandles) { + if (this->isFlushTaskSubmissionEnabled) { + checkAvailableSpace(); + } + auto ret = CommandListCoreFamily::appendLaunchCooperativeKernel(kernelHandle, launchKernelArgs, signalEvent, numWaitEvents, waitEventHandles); + return flushImmediate(ret, true, signalEvent); +} + template ze_result_t CommandListCoreFamilyImmediate::flushImmediate(ze_result_t inputRet, bool performMigration, ze_event_handle_t signalEvent) { if (inputRet == ZE_RESULT_SUCCESS) { diff --git a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h index a4f7688640..e2076df183 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h +++ b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h @@ -186,9 +186,9 @@ struct MockCommandList : public CommandList { ADDMETHOD_NOBASE(appendLaunchCooperativeKernel, ze_result_t, ZE_RESULT_SUCCESS, (ze_kernel_handle_t kernelHandle, const ze_group_count_t *launchKernelArgs, - ze_event_handle_t hSignalEvent, + ze_event_handle_t signalEvent, uint32_t numWaitEvents, - ze_event_handle_t *phWaitEvents)); + ze_event_handle_t *waitEventHandles)); ADDMETHOD_NOBASE(appendLaunchKernelIndirect, ze_result_t, ZE_RESULT_SUCCESS, (ze_kernel_handle_t kernelHandle, diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_1.cpp index 68d36ecd2b..033a20c69f 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_1.cpp @@ -784,5 +784,35 @@ HWTEST_F(CommandListAppendLaunchKernel, givenInvalidEventListWhenAppendLaunchCoo EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, returnValue); } +HWTEST2_F(CommandListAppendLaunchKernel, givenImmediateCommandListWhenAppendLaunchCooperativeKernelUsingFlushTaskThenExpectCorrectExecuteCall, IsAtLeastSkl) { + createKernel(); + MockCommandListImmediateHw cmdList; + cmdList.isFlushTaskSubmissionEnabled = true; + cmdList.cmdListType = CommandList::CommandListType::TYPE_IMMEDIATE; + cmdList.csr = device->getNEODevice()->getDefaultEngine().commandStreamReceiver; + cmdList.initialize(device, NEO::EngineGroupType::RenderCompute, 0u); + ze_group_count_t groupCount{1, 1, 1}; + ze_result_t returnValue; + returnValue = cmdList.appendLaunchCooperativeKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr); + EXPECT_EQ(0u, cmdList.executeCommandListImmediateCalledCount); + EXPECT_EQ(1u, cmdList.executeCommandListImmediateWithFlushTaskCalledCount); + EXPECT_EQ(ZE_RESULT_SUCCESS, returnValue); +} + +HWTEST2_F(CommandListAppendLaunchKernel, givenImmediateCommandListWhenAppendLaunchCooperativeKernelNotUsingFlushTaskThenExpectCorrectExecuteCall, IsAtLeastSkl) { + createKernel(); + MockCommandListImmediateHw cmdList; + cmdList.isFlushTaskSubmissionEnabled = false; + cmdList.cmdListType = CommandList::CommandListType::TYPE_IMMEDIATE; + cmdList.csr = device->getNEODevice()->getDefaultEngine().commandStreamReceiver; + cmdList.initialize(device, NEO::EngineGroupType::RenderCompute, 0u); + ze_group_count_t groupCount{1, 1, 1}; + ze_result_t returnValue; + returnValue = cmdList.appendLaunchCooperativeKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr); + EXPECT_EQ(1u, cmdList.executeCommandListImmediateCalledCount); + EXPECT_EQ(0u, cmdList.executeCommandListImmediateWithFlushTaskCalledCount); + EXPECT_EQ(ZE_RESULT_SUCCESS, returnValue); +} + } // namespace ult } // namespace L0