From a2c41e47491696721a4f574de4fd2ca5c070baa4 Mon Sep 17 00:00:00 2001 From: Szymon Morek Date: Wed, 21 May 2025 15:02:22 +0000 Subject: [PATCH] fix: add mock for staging buffer size No need to allocate 2MB in unit tests. This commit changes this size to 4KB. Signed-off-by: Szymon Morek --- .../enqueue_read_buffer_tests.cpp | 2 +- .../enqueue_read_image_tests.cpp | 25 ++++++++-------- .../command_queue/enqueue_svm_tests.cpp | 2 +- .../enqueue_write_buffer_tests.cpp | 2 +- .../enqueue_write_image_tests.cpp | 23 ++++++++------- opencl/test/unit_test/linux/CMakeLists.txt | 1 + opencl/test/unit_test/windows/CMakeLists.txt | 1 + shared/source/dll/CMakeLists.txt | 1 + shared/source/dll/get_staging_buffer_size.cpp | 15 ++++++++++ .../utilities/staging_buffer_manager.cpp | 3 +- .../source/utilities/staging_buffer_manager.h | 4 ++- shared/test/common/libult/CMakeLists.txt | 2 ++ .../mocks/mock_get_staging_buffer_size.cpp | 15 ++++++++++ .../staging_buffer_manager_tests.cpp | 29 ++++++++++--------- 14 files changed, 83 insertions(+), 42 deletions(-) create mode 100644 shared/source/dll/get_staging_buffer_size.cpp create mode 100644 shared/test/common/mocks/mock_get_staging_buffer_size.cpp diff --git a/opencl/test/unit_test/command_queue/enqueue_read_buffer_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_read_buffer_tests.cpp index 8e1d2897e5..3366ab45da 100644 --- a/opencl/test/unit_test/command_queue/enqueue_read_buffer_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_read_buffer_tests.cpp @@ -865,7 +865,7 @@ struct ReadBufferStagingBufferTest : public EnqueueReadBufferHw { void TearDown() override { EnqueueReadBufferHw::TearDown(); } - constexpr static size_t chunkSize = MemoryConstants::megaByte * 2; + constexpr static size_t chunkSize = MemoryConstants::pageSize; unsigned char ptr[MemoryConstants::cacheLineSize]; MockBuffer buffer; diff --git a/opencl/test/unit_test/command_queue/enqueue_read_image_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_read_image_tests.cpp index cb22d3880c..c3aaef6e10 100644 --- a/opencl/test/unit_test/command_queue/enqueue_read_image_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_read_image_tests.cpp @@ -1113,7 +1113,8 @@ struct ReadImageStagingBufferTest : public EnqueueReadImageTest { EnqueueReadImageTest::TearDown(); } - static constexpr size_t stagingBufferSize = MemoryConstants::megaByte * 2; + static constexpr size_t stagingBufferSize = MemoryConstants::pageSize; + static constexpr size_t pitchSize = stagingBufferSize / 2; static constexpr size_t readSize = stagingBufferSize * 4; unsigned char *ptr; size_t origin[3] = {0, 0, 0}; @@ -1124,7 +1125,7 @@ struct ReadImageStagingBufferTest : public EnqueueReadImageTest { HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledThenReturnSuccess) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_TRUE(mockCommandQueueHw.flushCalled); EXPECT_EQ(res, CL_SUCCESS); EXPECT_EQ(4ul, mockCommandQueueHw.enqueueReadImageCounter); @@ -1134,8 +1135,8 @@ HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledThenReturn HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledWithoutRowPitchNorSlicePitchThenReturnSuccess) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - region[0] = MemoryConstants::megaByte / srcImage->getSurfaceFormatInfo().surfaceFormat.imageElementSizeInBytes; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, 0u, 0u, ptr, nullptr); + region[0] = pitchSize / srcImage->getSurfaceFormatInfo().surfaceFormat.imageElementSizeInBytes; + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); EXPECT_EQ(4ul, mockCommandQueueHw.enqueueReadImageCounter); @@ -1145,7 +1146,7 @@ HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledWithoutRow HWTEST_F(ReadImageStagingBufferTest, whenBlockingEnqueueStagingReadImageCalledThenFinishCalled) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, true, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, true, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); EXPECT_EQ(1u, mockCommandQueueHw.finishCalledCount); @@ -1155,7 +1156,7 @@ HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledWithEventT constexpr cl_command_type expectedCmd = CL_COMMAND_READ_IMAGE; MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); cl_event event; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(expectedCmd, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(expectedCmd, srcImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -1169,7 +1170,7 @@ HWTEST_F(ReadImageStagingBufferTest, givenOutOfOrderQueueWhenEnqueueStagingReadI MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.setOoqEnabled(); cl_event event; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -1185,7 +1186,7 @@ HWTEST_F(ReadImageStagingBufferTest, givenOutOfOrderQueueWhenEnqueueStagingReadI mockCommandQueueHw.setOoqEnabled(); cl_event event; region[1] = 1; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -1199,7 +1200,7 @@ HWTEST_F(ReadImageStagingBufferTest, givenCmdQueueWithProfilingWhenEnqueueStagin cl_event event; MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.setProfilingEnabled(); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -1212,7 +1213,7 @@ HWTEST_F(ReadImageStagingBufferTest, givenCmdQueueWithProfilingWhenEnqueueStagin HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageFailedThenPropagateErrorCode) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.enqueueReadImageCallBase = false; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_INVALID_OPERATION); EXPECT_EQ(1ul, mockCommandQueueHw.enqueueReadImageCounter); @@ -1223,7 +1224,7 @@ HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledWithGpuHan CsrSelectionArgs csrSelectionArgs{CL_COMMAND_READ_IMAGE, srcImage, nullptr, pDevice->getRootDeviceIndex(), region, nullptr, origin}; auto ultCsr = reinterpret_cast *>(&mockCommandQueueHw.selectCsrForBuiltinOperation(csrSelectionArgs)); ultCsr->waitForTaskCountReturnValue = WaitStatus::gpuHang; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, srcImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_OUT_OF_RESOURCES); EXPECT_EQ(2ul, mockCommandQueueHw.enqueueReadImageCounter); @@ -1241,7 +1242,7 @@ HWTEST_F(ReadImageStagingBufferTest, whenEnqueueStagingReadImageCalledFor3DImage size_t region[3] = {2, 2, 4}; auto image = std::unique_ptr(ImageHelper::create(context, &imageDesc)); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, image.get(), false, origin, region, 4u, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_READ_IMAGE, image.get(), false, origin, region, 4u, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); // (2, 2, 4) splitted into (2, 2, 2) * 2 diff --git a/opencl/test/unit_test/command_queue/enqueue_svm_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_svm_tests.cpp index 9297e54761..40c4e414b2 100644 --- a/opencl/test/unit_test/command_queue/enqueue_svm_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_svm_tests.cpp @@ -2413,7 +2413,7 @@ struct StagingBufferTest : public EnqueueSvmTest { EnqueueSvmTest::TearDown(); } - static constexpr size_t stagingBufferSize = MemoryConstants::megaByte * 2; + static constexpr size_t stagingBufferSize = MemoryConstants::pageSize; static constexpr size_t copySize = stagingBufferSize * 4; static constexpr size_t expectedNumOfCopies = copySize / stagingBufferSize; diff --git a/opencl/test/unit_test/command_queue/enqueue_write_buffer_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_write_buffer_tests.cpp index 86d0f1919f..d8e2247e77 100644 --- a/opencl/test/unit_test/command_queue/enqueue_write_buffer_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_write_buffer_tests.cpp @@ -645,7 +645,7 @@ struct WriteBufferStagingBufferTest : public EnqueueWriteBufferHw { void TearDown() override { EnqueueWriteBufferHw::TearDown(); } - constexpr static size_t chunkSize = MemoryConstants::megaByte * 2; + constexpr static size_t chunkSize = MemoryConstants::pageSize; unsigned char ptr[MemoryConstants::cacheLineSize]; MockBuffer buffer; diff --git a/opencl/test/unit_test/command_queue/enqueue_write_image_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_write_image_tests.cpp index 19a6b42bce..94c7147aed 100644 --- a/opencl/test/unit_test/command_queue/enqueue_write_image_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_write_image_tests.cpp @@ -833,7 +833,8 @@ struct WriteImageStagingBufferTest : public EnqueueWriteImageTest { EnqueueWriteImageTest::TearDown(); } - static constexpr size_t stagingBufferSize = MemoryConstants::megaByte * 2; + static constexpr size_t stagingBufferSize = MemoryConstants::pageSize; + static constexpr size_t pitchSize = stagingBufferSize / 2; static constexpr size_t writeSize = stagingBufferSize * 4; unsigned char *ptr; size_t origin[3] = {0, 0, 0}; @@ -844,7 +845,7 @@ struct WriteImageStagingBufferTest : public EnqueueWriteImageTest { HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledThenReturnSuccess) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_TRUE(mockCommandQueueHw.flushCalled); EXPECT_EQ(res, CL_SUCCESS); EXPECT_EQ(4ul, mockCommandQueueHw.enqueueWriteImageCounter); @@ -854,7 +855,7 @@ HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledThenRetu HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledWithoutRowPitchNorSlicePitchThenReturnSuccess) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - region[0] = MemoryConstants::megaByte / dstImage->getSurfaceFormatInfo().surfaceFormat.imageElementSizeInBytes; + region[0] = pitchSize / dstImage->getSurfaceFormatInfo().surfaceFormat.imageElementSizeInBytes; auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, 0u, 0u, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); @@ -865,7 +866,7 @@ HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledWithoutR HWTEST_F(WriteImageStagingBufferTest, whenBlockingEnqueueStagingWriteImageCalledThenFinishCalled) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, true, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, true, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); EXPECT_EQ(1u, mockCommandQueueHw.finishCalledCount); @@ -875,7 +876,7 @@ HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledWithEven constexpr cl_command_type expectedLastCmd = CL_COMMAND_WRITE_IMAGE; MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); cl_event event; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -889,7 +890,7 @@ HWTEST_F(WriteImageStagingBufferTest, givenOutOfOrderQueueWhenEnqueueStagingWrit MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.setOoqEnabled(); cl_event event; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -905,7 +906,7 @@ HWTEST_F(WriteImageStagingBufferTest, givenOutOfOrderQueueWhenEnqueueStagingWrit mockCommandQueueHw.setOoqEnabled(); cl_event event; region[1] = 1; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -919,7 +920,7 @@ HWTEST_F(WriteImageStagingBufferTest, givenCmdQueueWithProfilingWhenEnqueueStagi cl_event event; MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.setProfilingEnabled(); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, &event); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, &event); EXPECT_EQ(res, CL_SUCCESS); auto pEvent = (Event *)event; @@ -932,7 +933,7 @@ HWTEST_F(WriteImageStagingBufferTest, givenCmdQueueWithProfilingWhenEnqueueStagi HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageFailedThenPropagateErrorCode) { MockCommandQueueHw mockCommandQueueHw(context, device.get(), &props); mockCommandQueueHw.enqueueWriteImageCallBase = false; - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, MemoryConstants::megaByte, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, dstImage, false, origin, region, pitchSize, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_INVALID_OPERATION); EXPECT_EQ(1ul, mockCommandQueueHw.enqueueWriteImageCounter); @@ -962,7 +963,7 @@ HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledFor3DIma size_t region[3] = {2, 2, 4}; auto image = std::unique_ptr(ImageHelper::create(context, &imageDesc)); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, image.get(), false, origin, region, 4u, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, image.get(), false, origin, region, 4u, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); // (2, 2, 4) splitted into (2, 2, 2) * 2 @@ -984,6 +985,6 @@ HWTEST_F(WriteImageStagingBufferTest, whenEnqueueStagingWriteImageCalledForMipMa size_t region[3] = {2, 2, 4}; auto image = std::unique_ptr(ImageHelper::create(context, &imageDesc)); - auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, image.get(), false, origin, region, 4u, MemoryConstants::megaByte, ptr, nullptr); + auto res = mockCommandQueueHw.enqueueStagingImageTransfer(CL_COMMAND_WRITE_IMAGE, image.get(), false, origin, region, 4u, pitchSize, ptr, nullptr); EXPECT_EQ(res, CL_SUCCESS); } \ No newline at end of file diff --git a/opencl/test/unit_test/linux/CMakeLists.txt b/opencl/test/unit_test/linux/CMakeLists.txt index 70343f2664..a055fd4b79 100644 --- a/opencl/test/unit_test/linux/CMakeLists.txt +++ b/opencl/test/unit_test/linux/CMakeLists.txt @@ -22,6 +22,7 @@ add_executable(igdrcl_${target_name} ${CMAKE_CURRENT_SOURCE_DIR}/mock_os_layer.h ${CMAKE_CURRENT_SOURCE_DIR}/os_interface_linux_tests.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/helpers/virtual_file_system_listener.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/mocks/mock_get_staging_buffer_size.cpp ${NEO_SHARED_DIRECTORY}/os_interface/linux/sys_calls_linux.cpp ${NEO_SHARED_DIRECTORY}/dll/create_memory_manager_drm.cpp ${NEO_SHARED_DIRECTORY}/dll/device_dll.cpp diff --git a/opencl/test/unit_test/windows/CMakeLists.txt b/opencl/test/unit_test/windows/CMakeLists.txt index 211be3b0b4..c5964b6a01 100644 --- a/opencl/test/unit_test/windows/CMakeLists.txt +++ b/opencl/test/unit_test/windows/CMakeLists.txt @@ -36,6 +36,7 @@ if(WIN32) ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/wddm_calls.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/mocks/mock_get_staging_buffer_size.cpp ${NEO_SOURCE_DIR}/opencl/test/unit_test/test_macros/test_checks_ocl.cpp ) diff --git a/shared/source/dll/CMakeLists.txt b/shared/source/dll/CMakeLists.txt index dabc40373c..d25237b48e 100644 --- a/shared/source/dll/CMakeLists.txt +++ b/shared/source/dll/CMakeLists.txt @@ -18,6 +18,7 @@ set(NEO_SHARED_DLLS ${CMAKE_CURRENT_SOURCE_DIR}/unified_memory_reuse_cleaner_enabled.cpp ${CMAKE_CURRENT_SOURCE_DIR}/create_command_stream.cpp ${CMAKE_CURRENT_SOURCE_DIR}/options_dll.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/get_staging_buffer_size.cpp ) add_library(neo_shared_dlls_precompiled_objects OBJECT ${NEO_SHARED_DLLS}) diff --git a/shared/source/dll/get_staging_buffer_size.cpp b/shared/source/dll/get_staging_buffer_size.cpp new file mode 100644 index 0000000000..6494d3e456 --- /dev/null +++ b/shared/source/dll/get_staging_buffer_size.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2025 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/staging_buffer_manager.h" + +namespace NEO { +size_t getDefaultStagingBufferSize() { + return MemoryConstants::pageSize2M; +} + +} // namespace NEO \ No newline at end of file diff --git a/shared/source/utilities/staging_buffer_manager.cpp b/shared/source/utilities/staging_buffer_manager.cpp index 148ef14d2e..58c119701e 100644 --- a/shared/source/utilities/staging_buffer_manager.cpp +++ b/shared/source/utilities/staging_buffer_manager.cpp @@ -38,6 +38,7 @@ void StagingBufferTracker::freeChunk() const { StagingBufferManager::StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map &deviceBitfields, bool requiresWritable) : svmAllocsManager(svmAllocsManager), rootDeviceIndices(rootDeviceIndices), deviceBitfields(deviceBitfields), requiresWritable(requiresWritable) { + chunkSize = getDefaultStagingBufferSize(); if (debugManager.flags.StagingBufferSize.get() != -1) { chunkSize = debugManager.flags.StagingBufferSize.get() * MemoryConstants::kiloByte; } @@ -346,7 +347,7 @@ std::pair StagingBufferManager::requestStagingBuffer( return {retriedAllocator, retriedChunkBuffer}; } - auto stagingBufferSize = alignUp(std::max(chunkSize, size), MemoryConstants::pageSize2M); + auto stagingBufferSize = alignUp(std::max(chunkSize, size), getDefaultStagingBufferSize()); auto usmHost = allocateStagingBuffer(stagingBufferSize); if (usmHost != nullptr) { StagingBuffer stagingBuffer{usmHost, stagingBufferSize}; diff --git a/shared/source/utilities/staging_buffer_manager.h b/shared/source/utilities/staging_buffer_manager.h index c765c60053..8cde1a9c9f 100644 --- a/shared/source/utilities/staging_buffer_manager.h +++ b/shared/source/utilities/staging_buffer_manager.h @@ -119,7 +119,7 @@ class StagingBufferManager : NEO::NonCopyableAndNonMovableClass { bool isValidForStaging(const Device &device, const void *ptr, size_t size, bool hasDependencies); - size_t chunkSize = MemoryConstants::pageSize2M; + size_t chunkSize = 0; std::mutex mtx; std::vector stagingBuffers; std::vector trackers; @@ -134,4 +134,6 @@ class StagingBufferManager : NEO::NonCopyableAndNonMovableClass { static_assert(NEO::NonCopyableAndNonMovable); +size_t getDefaultStagingBufferSize(); + } // namespace NEO diff --git a/shared/test/common/libult/CMakeLists.txt b/shared/test/common/libult/CMakeLists.txt index e1ba68d913..2d69952081 100644 --- a/shared/test/common/libult/CMakeLists.txt +++ b/shared/test/common/libult/CMakeLists.txt @@ -209,6 +209,7 @@ set(neo_libult_SRCS_LINUX ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/linux/options.inl ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/setup_external_dependencies_${DRIVER_MODEL}.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/linux/sys_calls_linux_ult.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/mocks/mock_get_staging_buffer_size.cpp ) set_property(GLOBAL APPEND PROPERTY neo_libult_SRCS_LINUX ${neo_libult_SRCS_LINUX}) @@ -224,6 +225,7 @@ set(neo_libult_SRCS_WINDOWS ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/wddm_calls.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/mocks/mock_get_staging_buffer_size.cpp ) set_property(GLOBAL APPEND PROPERTY neo_libult_SRCS_WINDOWS ${neo_libult_SRCS_WINDOWS}) diff --git a/shared/test/common/mocks/mock_get_staging_buffer_size.cpp b/shared/test/common/mocks/mock_get_staging_buffer_size.cpp new file mode 100644 index 0000000000..c47cf75cb5 --- /dev/null +++ b/shared/test/common/mocks/mock_get_staging_buffer_size.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2025 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/utilities/staging_buffer_manager.h" + +namespace NEO { +size_t getDefaultStagingBufferSize() { + return MemoryConstants::pageSize; +} + +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp index ce84d5b61e..2529662cef 100644 --- a/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp +++ b/shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp @@ -147,7 +147,7 @@ class StagingBufferManagerFixture : public DeviceFixture { EXPECT_EQ(expectedChunks, chunkCounter); auto expectedNewUsmAllocations = 1u; - if (isRead && pixelElemSize * globalRegion[0] * globalRegion[1] > stagingBufferSize) { + if (isRead && rowPitch * globalRegion[1] > stagingBufferSize) { expectedNewUsmAllocations = 2u; } EXPECT_EQ(expectedNewUsmAllocations, newUsmAllocations); @@ -189,7 +189,8 @@ class StagingBufferManagerFixture : public DeviceFixture { } } - constexpr static size_t stagingBufferSize = MemoryConstants::megaByte * 2; + constexpr static size_t stagingBufferSize = MemoryConstants::pageSize; + constexpr static size_t pitchSize = stagingBufferSize / 2; constexpr static size_t pixelElemSize = 1u; DebugManagerStateRestore restorer; std::unique_ptr svmAllocsManager; @@ -510,14 +511,14 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageWriteWithMult size_t expectedChunks = 4; const size_t globalOrigin[3] = {0, 0, 0}; const size_t globalRegion[3] = {4, 8, 1}; - imageTransferThroughStagingBuffers(false, MemoryConstants::megaByte, globalOrigin, globalRegion, expectedChunks); + imageTransferThroughStagingBuffers(false, pitchSize, globalOrigin, globalRegion, expectedChunks); } TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageWriteWithRemainderThenWholeRegionCovered) { size_t expectedChunks = 4; const size_t globalOrigin[3] = {0, 0, 0}; const size_t globalRegion[3] = {4, 7, 1}; - imageTransferThroughStagingBuffers(false, MemoryConstants::megaByte, globalOrigin, globalRegion, expectedChunks); + imageTransferThroughStagingBuffers(false, pitchSize, globalOrigin, globalRegion, expectedChunks); } TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageReadThenRegionCovered) { @@ -553,21 +554,21 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageReadWithOrigi TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageReadWithMultipleRowsPerChunkThenWholeRegionCovered) { size_t expectedChunks = 4; const size_t globalOrigin[3] = {0, 0, 0}; - const size_t globalRegion[3] = {1 * MemoryConstants::megaByte, 8, 1}; + const size_t globalRegion[3] = {pitchSize, 8, 1}; imageTransferThroughStagingBuffers(true, pixelElemSize * globalRegion[0], globalOrigin, globalRegion, expectedChunks); } TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageReadWithRemainderThenWholeRegionCovered) { size_t expectedChunks = 4; const size_t globalOrigin[3] = {0, 0, 0}; - const size_t globalRegion[3] = {1 * MemoryConstants::megaByte, 7, 1}; + const size_t globalRegion[3] = {pitchSize, 7, 1}; imageTransferThroughStagingBuffers(true, pixelElemSize * globalRegion[0], globalOrigin, globalRegion, expectedChunks); } TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformImageReadWithRemainderAndTransfersWithinLimitThenWholeRegionCovered) { size_t expectedChunks = 2; const size_t globalOrigin[3] = {0, 0, 0}; - const size_t globalRegion[3] = {1 * MemoryConstants::megaByte, 3, 1}; + const size_t globalRegion[3] = {pitchSize, 3, 1}; imageTransferThroughStagingBuffers(true, pixelElemSize * globalRegion[0], globalOrigin, globalRegion, expectedChunks); } @@ -584,7 +585,7 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenGpuHangDuringChunkReadF }; auto ultCsr = reinterpret_cast *>(csr); ultCsr->waitForTaskCountReturnValue = WaitStatus::gpuHang; - auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, MemoryConstants::megaByte, MemoryConstants::megaByte, pixelElemSize, false, chunkWrite, csr, true); + auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, pitchSize, pitchSize, pixelElemSize, false, chunkWrite, csr, true); EXPECT_EQ(0, ret.chunkCopyStatus); EXPECT_EQ(WaitStatus::gpuHang, ret.waitStatus); EXPECT_EQ(2u, chunkCounter); @@ -606,7 +607,7 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenGpuHangAfterChunkReadFr } return 0; }; - auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, MemoryConstants::megaByte, MemoryConstants::megaByte, pixelElemSize, false, chunkWrite, csr, true); + auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, pitchSize, pitchSize, pixelElemSize, false, chunkWrite, csr, true); EXPECT_EQ(0, ret.chunkCopyStatus); EXPECT_EQ(WaitStatus::gpuHang, ret.waitStatus); EXPECT_EQ(4u, chunkCounter); @@ -629,7 +630,7 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenGpuHangDuringRemainderC } return 0; }; - auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, MemoryConstants::megaByte, MemoryConstants::megaByte, pixelElemSize, false, chunkWrite, csr, true); + auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, pitchSize, pitchSize, pixelElemSize, false, chunkWrite, csr, true); EXPECT_EQ(0, ret.chunkCopyStatus); EXPECT_EQ(WaitStatus::gpuHang, ret.waitStatus); EXPECT_EQ(remainderCounter - 1, chunkCounter); @@ -648,7 +649,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenFailedChunkImageWriteThen ++chunkCounter; return expectedErrorCode; }; - auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, MemoryConstants::megaByte, MemoryConstants::megaByte, pixelElemSize, false, chunkWrite, csr, false); + auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, pitchSize, pitchSize, pixelElemSize, false, chunkWrite, csr, false); EXPECT_EQ(expectedErrorCode, ret.chunkCopyStatus); EXPECT_EQ(WaitStatus::ready, ret.waitStatus); EXPECT_EQ(1u, chunkCounter); @@ -671,7 +672,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenFailedChunkImageWriteWith } return 0; }; - auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, MemoryConstants::megaByte, MemoryConstants::megaByte, pixelElemSize, false, chunkWrite, csr, false); + auto ret = stagingBufferManager->performImageTransfer(ptr, globalOrigin, globalRegion, pitchSize, pitchSize, pixelElemSize, false, chunkWrite, csr, false); EXPECT_EQ(expectedErrorCode, ret.chunkCopyStatus); EXPECT_EQ(WaitStatus::ready, ret.waitStatus); EXPECT_EQ(remainderCounter, chunkCounter); @@ -761,7 +762,7 @@ HWTEST_F(StagingBufferManagerTest, givenStagingBufferWhenGpuHangDuringSliceRemai auto expectedChunks = 5u; size_t rowPitch = 4u; auto rowsNum = 4u; - size_t slicePitch = MemoryConstants::megaByte; + size_t slicePitch = pitchSize; const size_t globalOrigin[3] = {0, 0, 0}; const size_t globalRegion[3] = {rowPitch, rowsNum, 9}; auto size = stagingBufferSize * expectedChunks / sizeof(unsigned int); @@ -787,7 +788,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenFailedChunkImageWriteWith auto expectedChunks = 5u; size_t rowPitch = 4u; auto rowsNum = 4u; - size_t slicePitch = MemoryConstants::megaByte; + size_t slicePitch = pitchSize; const size_t globalOrigin[3] = {0, 0, 0}; const size_t globalRegion[3] = {rowPitch, rowsNum, 9}; auto size = stagingBufferSize * expectedChunks / sizeof(unsigned int);