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(