From 862e3a1a79ef2d0116f0dabd02007523dfb49769 Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 23 Aug 2016 14:12:24 -0400
Subject: [PATCH] P4 to Git Change 1306133 by gandryey@gera-w8 on 2016/08/23
14:00:09
SWDEV-79445 - OCL generic changes and code clean-up
- Update staging copy path with a flush so CPU copy and SDMA transfer could run asynchronously.
- Tune chunk size for transfers
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.cpp#121 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#6 edit
---
rocclr/runtime/device/gpu/gpublit.cpp | 27 +++++++++++++++++++--------
rocclr/runtime/device/pal/palblit.cpp | 23 +++++++++++++++--------
2 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/rocclr/runtime/device/gpu/gpublit.cpp b/rocclr/runtime/device/gpu/gpublit.cpp
index ebd13b0885..8375388911 100644
--- a/rocclr/runtime/device/gpu/gpublit.cpp
+++ b/rocclr/runtime/device/gpu/gpublit.cpp
@@ -57,10 +57,12 @@ DmaBlitManager::readMemoryStaged(
if (dev().xferRead().bufSize() < 128 * Ki) {
chunkSize = dev().xferRead().bufSize();
}
- else {
+ else if (xferSize > 256 * Ki) {
chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
dev().xferRead().bufSize());
- chunkSize = std::max(chunkSize, 128 * Ki);
+ }
+ else {
+ chunkSize = xferSize;
}
// Find the partial transfer size
@@ -112,6 +114,7 @@ DmaBlitManager::readMemoryStaged(
reinterpret_cast(dstHost) + offset - copySizeLast[0], dst, copySizeLast)) {
return false;
}
+
return true;
}
@@ -314,14 +317,19 @@ DmaBlitManager::writeMemoryStaged(
amd::Coord3D src(0, 0, 0);
size_t tmpSize;
size_t chunkSize;
+ static const bool CopyRect = false;
+ // Flush DMA for ASYNC copy
+ static const bool FlushDMA = true;
if (dev().xferRead().bufSize() < 128 * Ki) {
- chunkSize = dev().xferRead().bufSize();
+ chunkSize = dev().xferWrite().bufSize();
+ }
+ else if (xferSize > 256 * Ki) {
+ chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
+ dev().xferWrite().bufSize());
}
else {
- chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
- dev().xferRead().bufSize());
- chunkSize = std::max(chunkSize, 128 * Ki);
+ chunkSize = xferSize;
}
while (xferSize != 0) {
@@ -339,7 +347,7 @@ DmaBlitManager::writeMemoryStaged(
// Copy data into the original destination memory
if (!xferBuf.partialMemCopyTo(
- gpu(), src, dst, copySize, dstMemory)) {
+ gpu(), src, dst, copySize, dstMemory, CopyRect, FlushDMA)) {
return false;
}
@@ -347,6 +355,7 @@ DmaBlitManager::writeMemoryStaged(
offset += tmpSize;
xferSize -= tmpSize;
}
+
return true;
}
@@ -366,6 +375,7 @@ DmaBlitManager::writeBuffer(
srcHost, dstMemory, origin, size, entire);
}
else {
+
size_t dstSize = size[0];
size_t tmpSize = 0;
size_t offset = 0;
@@ -432,6 +442,7 @@ DmaBlitManager::writeBuffer(
}
}
+
if (dstSize != 0) {
Memory& xferBuf = dev().xferWrite().acquire();
@@ -2247,6 +2258,7 @@ KernelBlitManager::writeBuffer(
synchronize();
+
return result;
}
@@ -2723,7 +2735,6 @@ DmaBlitManager::pinHostMemory(
amdMemory = new(*context_)
amd::Buffer(*context_, CL_MEM_USE_HOST_PTR, pinAllocSize);
-
if ((amdMemory != NULL) && !amdMemory->create(tmpHost, SysMem)) {
amdMemory->release();
return NULL;
diff --git a/rocclr/runtime/device/pal/palblit.cpp b/rocclr/runtime/device/pal/palblit.cpp
index 66d02aba9d..8e210acb21 100644
--- a/rocclr/runtime/device/pal/palblit.cpp
+++ b/rocclr/runtime/device/pal/palblit.cpp
@@ -56,10 +56,12 @@ DmaBlitManager::readMemoryStaged(
if (dev().xferRead().bufSize() < 128 * Ki) {
chunkSize = dev().xferRead().bufSize();
}
- else {
+ else if (xferSize > 256 * Ki) {
chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
dev().xferRead().bufSize());
- chunkSize = std::max(chunkSize, 128 * Ki);
+ }
+ else {
+ chunkSize = xferSize;
}
// Find the partial transfer size
@@ -313,14 +315,19 @@ DmaBlitManager::writeMemoryStaged(
amd::Coord3D src(0, 0, 0);
size_t tmpSize;
size_t chunkSize;
+ static const bool CopyRect = false;
+ // Flush DMA for ASYNC copy
+ static const bool FlushDMA = true;
if (dev().xferRead().bufSize() < 128 * Ki) {
- chunkSize = dev().xferRead().bufSize();
+ chunkSize = dev().xferWrite().bufSize();
+ }
+ else if (xferSize > 256 * Ki) {
+ chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
+ dev().xferWrite().bufSize());
}
else {
- chunkSize = std::min(amd::alignUp(xferSize / 4, 256),
- dev().xferRead().bufSize());
- chunkSize = std::max(chunkSize, 128 * Ki);
+ chunkSize = xferSize;
}
while (xferSize != 0) {
@@ -338,7 +345,7 @@ DmaBlitManager::writeMemoryStaged(
// Copy data into the original destination memory
if (!xferBuf.partialMemCopyTo(
- gpu(), src, dst, copySize, dstMemory)) {
+ gpu(), src, dst, copySize, dstMemory, CopyRect, FlushDMA)) {
return false;
}
@@ -2761,7 +2768,7 @@ KernelBlitManager::createView(
const Memory& gpuMem = static_cast(parent);
params.owner_ = parent.owner();
- params.level_ = 0;
+ params.level_ = parent.desc().baseLevel_;
params.layer_ = 0;
params.resource_ = &gpuMem;
params.memory_ = &gpuMem;