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(