P4 to Git Change 1577282 by skudchad@skudchad_test2_win_opencl on 2018/07/06 15:02:32
SWDEV-145570 - [HIP] Fix hipMalloc3D
ReviewBoardURL = http://ocltc.amd.com/reviews/r/15358/diff/
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/hip/hip_memory.cpp#36 edit
[ROCm/hip commit: f2ea9a1a8b]
Этот коммит содержится в:
@@ -366,13 +366,13 @@ hipError_t hipMalloc3D(hipPitchedPtr* pitchedDevPtr, hipExtent extent) {
|
||||
hipError_t hipMemset3D(hipPitchedPtr pitchedDevPtr, int value, hipExtent extent) {
|
||||
HIP_INIT_API(pitchedDevPtr, value, &extent);
|
||||
|
||||
void *dst = &pitchedDevPtr.ptr;
|
||||
void *dst = pitchedDevPtr.ptr;
|
||||
size_t sizeBytes = pitchedDevPtr.pitch * extent.height * extent.depth;
|
||||
|
||||
hip::syncStreams();
|
||||
amd::HostQueue* queue = hip::getNullStream();
|
||||
|
||||
return ihipMemset(&dst, value, sizeBytes, *queue);
|
||||
return ihipMemset(dst, value, sizeBytes, *queue);
|
||||
}
|
||||
|
||||
hipError_t hipArrayCreate(hipArray** array, const HIP_ARRAY_DESCRIPTOR* pAllocateArray) {
|
||||
@@ -1129,9 +1129,9 @@ hipError_t hipMemcpy3D(const struct hipMemcpy3DParms* p) {
|
||||
amd::BufferRect srcRect;
|
||||
amd::BufferRect dstRect;
|
||||
size_t offset = 0;
|
||||
amd::Memory* src = getMemoryObject(srcPtr, offset);
|
||||
amd::Memory* srcMemory = getMemoryObject(srcPtr, offset);
|
||||
assert(offset == 0);
|
||||
amd::Memory* dst = getMemoryObject(dstPtr, offset);
|
||||
amd::Memory* dstMemory = getMemoryObject(dstPtr, offset);
|
||||
assert(offset == 0);
|
||||
|
||||
size_t src_slice_pitch = srcPitchInBytes * p->srcHeight;
|
||||
@@ -1147,28 +1147,46 @@ hipError_t hipMemcpy3D(const struct hipMemcpy3DParms* p) {
|
||||
amd::Coord3D srcEnd(srcRect.end_, 1, 1);
|
||||
amd::Coord3D dstEnd(dstRect.end_, 1, 1);
|
||||
|
||||
if (!src->asBuffer()->validateRegion(srcStart, srcEnd) ||
|
||||
!dst->asBuffer()->validateRegion(dstStart, dstEnd)) {
|
||||
return hipErrorInvalidValue;
|
||||
}
|
||||
|
||||
// Check if regions overlap each other
|
||||
if ((src->asBuffer() == dst->asBuffer()) &&
|
||||
(std::abs(static_cast<long>(srcOrigin[0]) - static_cast<long>(dstOrigin[0])) <
|
||||
static_cast<long>(region[0])) &&
|
||||
(std::abs(static_cast<long>(srcOrigin[1]) - static_cast<long>(dstOrigin[1])) <
|
||||
static_cast<long>(region[1])) &&
|
||||
(std::abs(static_cast<long>(srcOrigin[2]) - static_cast<long>(dstOrigin[2])) <
|
||||
static_cast<long>(region[2]))) {
|
||||
return hipErrorUnknown;
|
||||
hipMemcpyKind kind = p->kind;
|
||||
|
||||
if (kind == hipMemcpyDefault) {
|
||||
// Determine kind on VA
|
||||
if (srcMemory == nullptr && dstMemory != nullptr) {
|
||||
kind = hipMemcpyHostToDevice;
|
||||
} else if (srcMemory != nullptr && dstMemory == nullptr) {
|
||||
kind = hipMemcpyDeviceToHost;
|
||||
} else if (srcMemory != nullptr && dstMemory != nullptr) {
|
||||
kind = hipMemcpyDeviceToDevice;
|
||||
} else {
|
||||
kind = hipMemcpyHostToHost;
|
||||
}
|
||||
}
|
||||
|
||||
amd::Command* command = nullptr;
|
||||
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, *src->asBuffer(),
|
||||
*dst->asBuffer(), srcStart, dstStart, size, srcRect, dstRect);
|
||||
switch (kind) {
|
||||
case hipMemcpyDeviceToHost:
|
||||
command = new amd::ReadMemoryCommand(*queue, CL_COMMAND_READ_BUFFER_RECT, waitList,
|
||||
*srcMemory->asBuffer(), srcStart, size, dstPtr, srcRect, dstRect);
|
||||
break;
|
||||
case hipMemcpyHostToDevice:
|
||||
command = new amd::WriteMemoryCommand(*queue, CL_COMMAND_WRITE_BUFFER_RECT, waitList,
|
||||
*dstMemory->asBuffer(), srcStart, size, srcPtr, srcRect, dstRect);
|
||||
break;
|
||||
case hipMemcpyDeviceToDevice:
|
||||
command = new amd::CopyMemoryCommand(*queue, CL_COMMAND_COPY_BUFFER_RECT, waitList,
|
||||
*srcMemory->asBuffer(),*dstMemory->asBuffer(), srcStart, dstStart, size,
|
||||
srcRect, dstRect);
|
||||
break;
|
||||
case hipMemcpyHostToHost:
|
||||
memcpy(dstPtr, srcPtr, region[0] * region[1] * region[2]);
|
||||
return hipSuccess;
|
||||
default:
|
||||
assert(!"Shouldn't reach here");
|
||||
break;
|
||||
}
|
||||
|
||||
if (command == nullptr) {
|
||||
return hipErrorOutOfMemory;
|
||||
|
||||
Ссылка в новой задаче
Block a user