From f1f8ea82665fda9efab083a9b05a6472b9cfc187 Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 3 May 2018 18:26:45 -0400 Subject: [PATCH] P4 to Git Change 1549965 by skudchad@skudchad_test2_win_opencl on 2018/05/03 18:15:18 SWDEV-145570 - [HIP] - Minor fixes. Use coarse grain for hipMallocPitch ReviewBoardURL = http://ocltc.amd.com/reviews/r/14768/diff/ Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/hip_memory.cpp#20 edit --- hipamd/api/hip/hip_memory.cpp | 68 ++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/hipamd/api/hip/hip_memory.cpp b/hipamd/api/hip/hip_memory.cpp index 52a6c7be2c..c1d00c096f 100644 --- a/hipamd/api/hip/hip_memory.cpp +++ b/hipamd/api/hip/hip_memory.cpp @@ -89,11 +89,8 @@ hipError_t hipMemcpy(void* dst, const void* src, size_t sizeBytes, hipMemcpyKind amd::Command* command = nullptr; amd::Command::EventWaitList waitList; - amd::Memory *srcMemory = nullptr; - amd::Memory *dstMemory = nullptr; - - srcMemory = amd::SvmManager::FindSvmBuffer(src); - dstMemory = amd::SvmManager::FindSvmBuffer(dst); + amd::Memory *srcMemory = amd::SvmManager::FindSvmBuffer(src);; + amd::Memory *dstMemory = amd::SvmManager::FindSvmBuffer(dst); if (kind == hipMemcpyDefault) { // Determine kind on VA @@ -304,7 +301,7 @@ hipError_t ihipMallocPitch(void** ptr, size_t* pitch, size_t width, size_t heigh *pitch = width * imageFormat.getElementSize(); size_t sizeBytes = *pitch * height * depth; - *ptr = amd::SvmBuffer::malloc(*hip::getCurrentContext(), CL_MEM_SVM_FINE_GRAIN_BUFFER, sizeBytes, + *ptr = amd::SvmBuffer::malloc(*hip::getCurrentContext(), CL_MEM_SVM_COARSE_GRAIN_BUFFER, sizeBytes, device->info().memBaseAddrAlign_); if (*ptr == nullptr) { @@ -559,8 +556,8 @@ hipError_t hipMemcpyAsync(void* dst, const void* src, size_t sizeBytes, amd::Command* command = nullptr; amd::Command::EventWaitList waitList; amd::HostQueue* queue; - amd::Memory *srcMemory = nullptr; - amd::Memory *dstMemory = nullptr; + amd::Memory *srcMemory = amd::SvmManager::FindSvmBuffer(src);; + amd::Memory *dstMemory = amd::SvmManager::FindSvmBuffer(dst); if (stream == nullptr) { queue = hip::getNullStream(); @@ -571,9 +568,6 @@ hipError_t hipMemcpyAsync(void* dst, const void* src, size_t sizeBytes, queue = as_amd(reinterpret_cast(stream))->asHostQueue(); } - srcMemory = amd::SvmManager::FindSvmBuffer(src); - dstMemory = amd::SvmManager::FindSvmBuffer(dst); - if (kind == hipMemcpyDefault) { // Determine kind on VA if (srcMemory == nullptr && dstMemory != nullptr) { @@ -709,9 +703,57 @@ hipError_t hipMemcpy2DAsync(void* dst, size_t dpitch, const void* src, size_t sp size_t height, hipMemcpyKind kind, hipStream_t stream) { HIP_INIT_API(dst, dpitch, src, spitch, width, height, kind, stream); - assert(0 && "Unimplemented"); + amd::HostQueue* queue; - return hipErrorUnknown; + if (stream == nullptr) { + queue = hip::getNullStream(); + if (queue == nullptr) { + return hipErrorOutOfMemory; + } + } else { + queue = as_amd(reinterpret_cast(stream))->asHostQueue(); + } + + // Create buffer rectangle info structure + amd::BufferRect srcRect; + amd::BufferRect dstRect; + amd::Memory* srcPtr = amd::SvmManager::FindSvmBuffer(src); + amd::Memory* dstPtr = amd::SvmManager::FindSvmBuffer(dst); + size_t region[3] = {width, height, 0}; + size_t src_slice_pitch = spitch * height; + size_t dst_slice_pitch = dpitch * height; + size_t origin[3] = { }; + + if (!srcRect.create(origin, region, spitch, src_slice_pitch) || + !dstRect.create(origin, region, dpitch, dst_slice_pitch)) { + return hipErrorInvalidValue; + } + + amd::Coord3D srcStart(srcRect.start_, 0, 0); + amd::Coord3D dstStart(dstRect.start_, 0, 0); + amd::Coord3D srcEnd(srcRect.end_, 1, 1); + amd::Coord3D dstEnd(dstRect.end_, 1, 1); + + if (!srcPtr->asBuffer()->validateRegion(srcStart, srcEnd) || + !dstPtr->asBuffer()->validateRegion(dstStart, dstEnd)) { + return hipErrorInvalidValue; + } + + amd::Command::EventWaitList waitList; + amd::Coord3D size(region[0], region[1], region[2]); + + amd::CopyMemoryCommand* command = + new amd::CopyMemoryCommand(*queue, CL_COMMAND_COPY_BUFFER_RECT, waitList, *srcPtr->asBuffer(), + *dstPtr->asBuffer(), srcStart, dstStart, size, srcRect, dstRect); + + if (command == nullptr) { + return hipErrorOutOfMemory; + } + + command->enqueue(); + command->release(); + + return hipSuccess; } hipError_t hipMemcpy2DToArray(hipArray* dst, size_t wOffset, size_t hOffset, const void* src,