From 57043d662daff31f02af7fa54837ebd15d9fd0d3 Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 1 Sep 2016 14:01:08 -0400 Subject: [PATCH] P4 to Git Change 1309866 by gandryey@gera-w8 on 2016/09/01 13:50:12 SWDEV-79445 - OCL generic changes and code clean-up - Improve image fill performance with multiple writes in a single thread. The current split has 3 regions Affected files ... ... //depot/stg/opencl/drivers/opencl/library/common.hsa/src/blitKernels.cl#4 edit ... //depot/stg/opencl/drivers/opencl/library/common/src/blitKernels.cl#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.cpp#123 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.hpp#40 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.hpp#4 edit --- rocclr/runtime/device/gpu/gpublit.cpp | 8 +++++--- rocclr/runtime/device/gpu/gpublit.hpp | 1 + rocclr/runtime/device/pal/palblit.cpp | 8 +++++--- rocclr/runtime/device/pal/palblit.hpp | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/rocclr/runtime/device/gpu/gpublit.cpp b/rocclr/runtime/device/gpu/gpublit.cpp index 9783b6cc38..fb9277a15b 100644 --- a/rocclr/runtime/device/gpu/gpublit.cpp +++ b/rocclr/runtime/device/gpu/gpublit.cpp @@ -2592,23 +2592,25 @@ KernelBlitManager::fillImage( } } + // Perform workload split to allow multiple operations in a single thread + globalWorkSize[0] = (size[0] + TransferSplitSize - 1) / TransferSplitSize; // Find the current blit type if (memView->cal()->dimSize_ == 1) { - globalWorkSize[0] = amd::alignUp(size[0], 256); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 256); globalWorkSize[1] = amd::alignUp(size[1], 1); globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = 256; localWorkSize[1] = localWorkSize[2] = 1; } else if (memView->cal()->dimSize_ == 2) { - globalWorkSize[0] = amd::alignUp(size[0], 16); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 16); globalWorkSize[1] = amd::alignUp(size[1], 16); globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = localWorkSize[1] = 16; localWorkSize[2] = 1; } else { - globalWorkSize[0] = amd::alignUp(size[0], 8); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 8); globalWorkSize[1] = amd::alignUp(size[1], 8); globalWorkSize[2] = amd::alignUp(size[2], 4); localWorkSize[0] = localWorkSize[1] = 8; diff --git a/rocclr/runtime/device/gpu/gpublit.hpp b/rocclr/runtime/device/gpu/gpublit.hpp index 952985f307..87dbab3c50 100644 --- a/rocclr/runtime/device/gpu/gpublit.hpp +++ b/rocclr/runtime/device/gpu/gpublit.hpp @@ -383,6 +383,7 @@ public: private: static const size_t MaxXferBuffers = 2; + static const uint TransferSplitSize = 3; //! Copies a buffer object to an image object bool copyBufferToImageKernel( diff --git a/rocclr/runtime/device/pal/palblit.cpp b/rocclr/runtime/device/pal/palblit.cpp index 5befc73ec8..23fffffe6e 100644 --- a/rocclr/runtime/device/pal/palblit.cpp +++ b/rocclr/runtime/device/pal/palblit.cpp @@ -2564,23 +2564,25 @@ KernelBlitManager::fillImage( } } + // Perform workload split to allow multiple operations in a single thread + globalWorkSize[0] = (size[0] + TransferSplitSize - 1) / TransferSplitSize; // Find the current blit type if (memView->desc().dimSize_ == 1) { - globalWorkSize[0] = amd::alignUp(size[0], 256); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 256); globalWorkSize[1] = amd::alignUp(size[1], 1); globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = 256; localWorkSize[1] = localWorkSize[2] = 1; } else if (memView->desc().dimSize_ == 2) { - globalWorkSize[0] = amd::alignUp(size[0], 16); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 16); globalWorkSize[1] = amd::alignUp(size[1], 16); globalWorkSize[2] = amd::alignUp(size[2], 1); localWorkSize[0] = localWorkSize[1] = 16; localWorkSize[2] = 1; } else { - globalWorkSize[0] = amd::alignUp(size[0], 8); + globalWorkSize[0] = amd::alignUp(globalWorkSize[0], 8); globalWorkSize[1] = amd::alignUp(size[1], 8); globalWorkSize[2] = amd::alignUp(size[2], 4); localWorkSize[0] = localWorkSize[1] = 8; diff --git a/rocclr/runtime/device/pal/palblit.hpp b/rocclr/runtime/device/pal/palblit.hpp index 112d1fb5af..b19dc114d3 100644 --- a/rocclr/runtime/device/pal/palblit.hpp +++ b/rocclr/runtime/device/pal/palblit.hpp @@ -388,6 +388,7 @@ public: private: static const size_t MaxXferBuffers = 2; + static const uint TransferSplitSize = 3; //! Copies a buffer object to an image object bool copyBufferToImageKernel(