From f4b4110dfae5bf88f7fbe6eaebad4e9adaff247b Mon Sep 17 00:00:00 2001 From: Aravind Gopalakrishnan Date: Thu, 3 Feb 2022 23:42:51 +0000 Subject: [PATCH] [5/n] L0 immediate commandlist improvements - Allow flushTask usage for XeHp+ only - Fix black box test to only use Copy queue if found Related-To: LOCI-1988 Signed-off-by: Aravind Gopalakrishnan --- level_zero/core/source/cmdlist/cmdlist_hw.h | 1 + level_zero/core/source/cmdlist/cmdlist_hw.inl | 2 +- .../core/source/cmdlist/cmdlist_hw_base.inl | 5 +++ .../cmdlist/cmdlist_hw_xehp_and_later.inl | 5 +++ .../black_box_tests/common/zello_common.h | 4 +- .../test/black_box_tests/zello_copy_only.cpp | 37 ++++++++++++++++--- .../test/black_box_tests/zello_immediate.cpp | 12 +++++- .../sources/cmdlist/test_cmdlist_4.cpp | 10 ++++- 8 files changed, 65 insertions(+), 11 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.h b/level_zero/core/source/cmdlist/cmdlist_hw.h index 4eb08cba23..dd103d67ac 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.h +++ b/level_zero/core/source/cmdlist/cmdlist_hw.h @@ -245,6 +245,7 @@ struct CommandListCoreFamily : CommandListImp { NEO::PipeControlArgs createBarrierFlags(); void appendMultiTileBarrier(NEO::Device &neoDevice); size_t estimateBufferSizeMultiTileBarrier(const NEO::HardwareInfo &hwInfo); + bool isFlushTaskSupported(); uint64_t getInputBufferSize(NEO::ImageType imageType, uint64_t bytesPerPixel, const ze_image_region_t *region); MOCKABLE_VIRTUAL AlignedAllocationData getAlignedAllocation(Device *device, const void *buffer, uint64_t bufferSize, bool hostCopyAllowed); diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 214d781a76..b050365fc7 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -136,7 +136,7 @@ ze_result_t CommandListCoreFamily::initialize(Device *device, NEO } if (this->cmdListType == CommandListType::TYPE_IMMEDIATE && !isCopyOnly() && !isInternal()) { - this->isFlushTaskSubmissionEnabled = true; + this->isFlushTaskSubmissionEnabled = this->isFlushTaskSupported(); if (NEO::DebugManager.flags.EnableFlushTaskSubmission.get() != -1) { this->isFlushTaskSubmissionEnabled = !!NEO::DebugManager.flags.EnableFlushTaskSubmission.get(); } diff --git a/level_zero/core/source/cmdlist/cmdlist_hw_base.inl b/level_zero/core/source/cmdlist/cmdlist_hw_base.inl index 53e3a7ff7a..0edf8cde1a 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw_base.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw_base.inl @@ -202,4 +202,9 @@ inline size_t CommandListCoreFamily::estimateBufferSizeMultiTileB return 0; } +template +inline bool CommandListCoreFamily::isFlushTaskSupported() { + return false; +} + } // namespace L0 diff --git a/level_zero/core/source/cmdlist/cmdlist_hw_xehp_and_later.inl b/level_zero/core/source/cmdlist/cmdlist_hw_xehp_and_later.inl index 59458b434b..20c6fd73ed 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw_xehp_and_later.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw_xehp_and_later.inl @@ -348,4 +348,9 @@ inline size_t CommandListCoreFamily::estimateBufferSizeMultiTileB false); } +template +inline bool CommandListCoreFamily::isFlushTaskSupported() { + return true; +} + } // namespace L0 diff --git a/level_zero/core/test/black_box_tests/common/zello_common.h b/level_zero/core/test/black_box_tests/common/zello_common.h index a917a684bb..b619d6a0df 100644 --- a/level_zero/core/test/black_box_tests/common/zello_common.h +++ b/level_zero/core/test/black_box_tests/common/zello_common.h @@ -111,7 +111,7 @@ uint32_t getCommandQueueOrdinal(ze_device_handle_t &device) { return computeQueueGroupOrdinal; } -uint32_t getCopyOnlyCommandQueueOrdinal(ze_device_handle_t &device) { +int32_t getCopyOnlyCommandQueueOrdinal(ze_device_handle_t &device) { uint32_t numQueueGroups = 0; SUCCESS_OR_TERMINATE(zeDeviceGetCommandQueueGroupProperties(device, &numQueueGroups, nullptr)); if (numQueueGroups == 0) { @@ -121,7 +121,7 @@ uint32_t getCopyOnlyCommandQueueOrdinal(ze_device_handle_t &device) { std::vector queueProperties(numQueueGroups); SUCCESS_OR_TERMINATE(zeDeviceGetCommandQueueGroupProperties(device, &numQueueGroups, queueProperties.data())); - uint32_t copyOnlyQueueGroupOrdinal = 0; + int32_t copyOnlyQueueGroupOrdinal = -1; for (uint32_t i = 0; i < numQueueGroups; i++) { if (!(queueProperties[i].flags & ZE_COMMAND_QUEUE_GROUP_PROPERTY_FLAG_COMPUTE) && (queueProperties[i].flags & ZE_COMMAND_QUEUE_GROUP_PROPERTY_FLAG_COPY)) { copyOnlyQueueGroupOrdinal = i; diff --git a/level_zero/core/test/black_box_tests/zello_copy_only.cpp b/level_zero/core/test/black_box_tests/zello_copy_only.cpp index 05646a34a3..8bc3bf05b4 100644 --- a/level_zero/core/test/black_box_tests/zello_copy_only.cpp +++ b/level_zero/core/test/black_box_tests/zello_copy_only.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -28,7 +28,12 @@ void testCopyBetweenHeapDeviceAndStack(ze_context_handle_t &context, ze_device_h ze_command_list_handle_t cmdList; ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } cmdQueueDesc.pNext = nullptr; cmdQueueDesc.flags = 0; @@ -98,7 +103,12 @@ void testCopyBetweenHostMemAndDeviceMem(ze_context_handle_t &context, ze_device_ ze_command_list_handle_t cmdList; ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } cmdQueueDesc.pNext = nullptr; cmdQueueDesc.flags = 0; @@ -166,7 +176,12 @@ void testRegionCopyOf2DSharedMem(ze_context_handle_t &context, ze_device_handle_ ze_command_list_handle_t cmdList; ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } cmdQueueDesc.pNext = nullptr; cmdQueueDesc.flags = 0; @@ -293,7 +308,12 @@ void testSharedMemDataAccessWithoutCopy(ze_context_handle_t &context, ze_device_ ze_command_list_handle_t cmdList; ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } cmdQueueDesc.pNext = nullptr; cmdQueueDesc.flags = 0; @@ -398,7 +418,12 @@ void testRegionCopyOf3DSharedMem(ze_context_handle_t &context, ze_device_handle_ ze_command_list_handle_t cmdList; ze_command_queue_desc_t cmdQueueDesc = {ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC}; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } cmdQueueDesc.pNext = nullptr; cmdQueueDesc.flags = 0; diff --git a/level_zero/core/test/black_box_tests/zello_immediate.cpp b/level_zero/core/test/black_box_tests/zello_immediate.cpp index 21397e0137..a3652d19e1 100644 --- a/level_zero/core/test/black_box_tests/zello_immediate.cpp +++ b/level_zero/core/test/black_box_tests/zello_immediate.cpp @@ -47,7 +47,12 @@ void testCopyBetweenHostMemAndDeviceMem(ze_context_handle_t &context, ze_device_ char *stackBuffer = new char[allocSize]; ze_command_list_handle_t cmdList; - uint32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + int32_t copyQueueGroup = getCopyOnlyCommandQueueOrdinal(device); + if (copyQueueGroup < 0) { + std::cout << "No Copy queue group found. Skipping test run\n"; + validRet = true; + return; + } createImmediateCommandList(device, context, copyQueueGroup, syncMode, cmdList); @@ -275,6 +280,11 @@ int main(int argc, char *argv[]) { std::cout << "\nTest case: Sync mode copy queue for memory copy\n"; testCopyBetweenHostMemAndDeviceMem(context, device, true, outputValidationSuccessful); } + if (outputValidationSuccessful) { + //Async mode with Copy queue + std::cout << "\nTest case: Async mode copy queue for memory copy\n"; + testCopyBetweenHostMemAndDeviceMem(context, device, false, outputValidationSuccessful); + } SUCCESS_OR_TERMINATE(zeContextDestroy(context)); std::cout << "\nZello Immediate Results validation " << (outputValidationSuccessful ? "PASSED" : "FAILED") << "\n"; diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_4.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_4.cpp index bce89aa280..be023202bb 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_4.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_4.cpp @@ -244,7 +244,7 @@ class CommandListImmediateFlushTaskTests : public DeviceFixture { }; using CommandListImmediateFlushTaskComputeTests = Test; -HWTEST_F(CommandListImmediateFlushTaskComputeTests, givenCommandListIsInititalizedThenByDefaultFlushTaskSubmissionEnabled) { +HWTEST2_F(CommandListImmediateFlushTaskComputeTests, givenCommandListIsInititalizedThenByDefaultFlushTaskSubmissionEnabled, IsAtLeastXeHpCore) { ze_command_queue_desc_t queueDesc = {}; ze_result_t returnValue; std::unique_ptr commandList(CommandList::createImmediate(productFamily, device, &queueDesc, false, NEO::EngineGroupType::Compute, returnValue)); @@ -252,6 +252,14 @@ HWTEST_F(CommandListImmediateFlushTaskComputeTests, givenCommandListIsInititaliz EXPECT_EQ(true, commandList->isFlushTaskSubmissionEnabled); } +HWTEST2_F(CommandListImmediateFlushTaskComputeTests, givenCommandListIsInititalizedThenByDefaultFlushTaskSubmissionDisabled, IsAtMostGen12lp) { + ze_command_queue_desc_t queueDesc = {}; + ze_result_t returnValue; + std::unique_ptr commandList(CommandList::createImmediate(productFamily, device, &queueDesc, false, NEO::EngineGroupType::Compute, returnValue)); + + EXPECT_EQ(false, commandList->isFlushTaskSubmissionEnabled); +} + HWTEST_F(CommandListImmediateFlushTaskComputeTests, givenFlushTaskSubmissionDisabledWhenCommandListIsInititalizedThenFlushTaskIsSetToFalse) { NEO::DebugManager.flags.EnableFlushTaskSubmission.set(0);