Add a HostToHost copy type in the Memcpy
Related-To: NEO-3570, NEO-3610 Change-Id: I84f8e2150b2d3760d968e94ae85638d91cb77a54 Signed-off-by: Jobczyk, Lukasz <lukasz.jobczyk@intel.com>
This commit is contained in:
parent
40d4314670
commit
c7ad27d430
|
@ -291,19 +291,17 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemcpy(cl_bool blockingCopy,
|
||||||
auto dstSvmData = context->getSVMAllocsManager()->getSVMAlloc(dstPtr);
|
auto dstSvmData = context->getSVMAllocsManager()->getSVMAlloc(dstPtr);
|
||||||
auto srcSvmData = context->getSVMAllocsManager()->getSVMAlloc(srcPtr);
|
auto srcSvmData = context->getSVMAllocsManager()->getSVMAlloc(srcPtr);
|
||||||
|
|
||||||
enum CopyType { InvalidCopyType,
|
enum CopyType { HostToHost,
|
||||||
SvmToHost,
|
SvmToHost,
|
||||||
HostToSvm,
|
HostToSvm,
|
||||||
SvmToSvm };
|
SvmToSvm };
|
||||||
CopyType copyType = InvalidCopyType;
|
CopyType copyType = HostToHost;
|
||||||
if ((srcSvmData != nullptr) && (dstSvmData != nullptr)) {
|
if ((srcSvmData != nullptr) && (dstSvmData != nullptr)) {
|
||||||
copyType = SvmToSvm;
|
copyType = SvmToSvm;
|
||||||
} else if ((srcSvmData == nullptr) && (dstSvmData != nullptr)) {
|
} else if ((srcSvmData == nullptr) && (dstSvmData != nullptr)) {
|
||||||
copyType = HostToSvm;
|
copyType = HostToSvm;
|
||||||
} else if (srcSvmData != nullptr) {
|
} else if (srcSvmData != nullptr) {
|
||||||
copyType = SvmToHost;
|
copyType = SvmToHost;
|
||||||
} else {
|
|
||||||
return CL_INVALID_VALUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiDispatchInfo dispatchInfo;
|
MultiDispatchInfo dispatchInfo;
|
||||||
|
@ -361,7 +359,7 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemcpy(cl_bool blockingCopy,
|
||||||
numEventsInWaitList,
|
numEventsInWaitList,
|
||||||
eventWaitList,
|
eventWaitList,
|
||||||
event);
|
event);
|
||||||
} else {
|
} else if (copyType == SvmToSvm) {
|
||||||
GeneralSurface srcSvmSurf(srcSvmData->gpuAllocation);
|
GeneralSurface srcSvmSurf(srcSvmData->gpuAllocation);
|
||||||
GeneralSurface dstSvmSurf(dstSvmData->gpuAllocation);
|
GeneralSurface dstSvmSurf(dstSvmData->gpuAllocation);
|
||||||
setOperationParams(operationParams, size, alignedSrcPtr, srcSvmData->gpuAllocation, srcPtrOffset, alignedDstPtr, dstSvmData->gpuAllocation, dstPtrOffset);
|
setOperationParams(operationParams, size, alignedSrcPtr, srcSvmData->gpuAllocation, srcPtrOffset, alignedDstPtr, dstSvmData->gpuAllocation, dstPtrOffset);
|
||||||
|
@ -375,6 +373,30 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemcpy(cl_bool blockingCopy,
|
||||||
numEventsInWaitList,
|
numEventsInWaitList,
|
||||||
eventWaitList,
|
eventWaitList,
|
||||||
event);
|
event);
|
||||||
|
} else {
|
||||||
|
HostPtrSurface srcHostPtrSurf(const_cast<void *>(srcPtr), size);
|
||||||
|
HostPtrSurface dstHostPtrSurf(dstPtr, size);
|
||||||
|
if (size != 0) {
|
||||||
|
bool status = getGpgpuCommandStreamReceiver().createAllocationForHostSurface(srcHostPtrSurf, false);
|
||||||
|
status &= getGpgpuCommandStreamReceiver().createAllocationForHostSurface(dstHostPtrSurf, true);
|
||||||
|
if (!status) {
|
||||||
|
return CL_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
srcPtr = reinterpret_cast<void *>(srcHostPtrSurf.getAllocation()->getGpuAddress());
|
||||||
|
dstPtr = reinterpret_cast<void *>(dstHostPtrSurf.getAllocation()->getGpuAddress());
|
||||||
|
}
|
||||||
|
setOperationParams(operationParams, size, alignedSrcPtr, nullptr, srcPtrOffset, alignedDstPtr, nullptr, dstPtrOffset);
|
||||||
|
surfaces[0] = &srcHostPtrSurf;
|
||||||
|
surfaces[1] = &dstHostPtrSurf;
|
||||||
|
|
||||||
|
builder.buildDispatchInfos(dispatchInfo, operationParams);
|
||||||
|
enqueueHandler<CL_COMMAND_WRITE_BUFFER>(
|
||||||
|
surfaces,
|
||||||
|
blockingCopy ? true : false,
|
||||||
|
dispatchInfo,
|
||||||
|
numEventsInWaitList,
|
||||||
|
eventWaitList,
|
||||||
|
event);
|
||||||
}
|
}
|
||||||
if (event) {
|
if (event) {
|
||||||
auto pEvent = castToObjectOrAbort<Event>(*event);
|
auto pEvent = castToObjectOrAbort<Event>(*event);
|
||||||
|
|
|
@ -389,7 +389,50 @@ TEST_F(EnqueueSvmTest, GivenDstHostPtrAndSizeZeroWhenEnqueueSVMMemcpyThenReturnS
|
||||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(EnqueueSvmTest, GivenDstHostPtrAndSrcHostPtrWhenEnqueueSVMMemcpyThenReturnInvalidValue) {
|
HWTEST_F(EnqueueSvmTest, givenDstHostPtrAndSrcHostPtrWhenEnqueueNonBlockingSVMMemcpyThenEnqueuWriteBufferIsCalled) {
|
||||||
|
char dstHostPtr[] = {0, 0, 0};
|
||||||
|
char srcHostPtr[] = {1, 2, 3};
|
||||||
|
void *pDstSVM = dstHostPtr;
|
||||||
|
void *pSrcSVM = srcHostPtr;
|
||||||
|
MockCommandQueueHw<FamilyType> myCmdQ(context, pDevice, 0);
|
||||||
|
retVal = myCmdQ.enqueueSVMMemcpy(
|
||||||
|
false, // cl_bool blocking_copy
|
||||||
|
pDstSVM, // void *dst_ptr
|
||||||
|
pSrcSVM, // const void *src_ptr
|
||||||
|
3, // size_t size
|
||||||
|
0, // cl_uint num_events_in_wait_list
|
||||||
|
nullptr, // cl_evebt *event_wait_list
|
||||||
|
nullptr // cL_event *event
|
||||||
|
);
|
||||||
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||||
|
EXPECT_EQ(myCmdQ.lastCommandType, static_cast<cl_command_type>(CL_COMMAND_WRITE_BUFFER));
|
||||||
|
|
||||||
|
auto tempAlloc = myCmdQ.getGpgpuCommandStreamReceiver().getTemporaryAllocations().peekHead();
|
||||||
|
EXPECT_EQ(1u, tempAlloc->countSuccessors());
|
||||||
|
EXPECT_EQ(pSrcSVM, reinterpret_cast<void *>(tempAlloc->getGpuAddress()));
|
||||||
|
EXPECT_EQ(pDstSVM, reinterpret_cast<void *>(tempAlloc->next->getGpuAddress()));
|
||||||
|
}
|
||||||
|
|
||||||
|
HWTEST_F(EnqueueSvmTest, givenDstHostPtrAndSrcHostPtrWhenEnqueueBlockingSVMMemcpyThenEnqueuWriteBufferIsCalled) {
|
||||||
|
char dstHostPtr[] = {0, 0, 0};
|
||||||
|
char srcHostPtr[] = {1, 2, 3};
|
||||||
|
void *pDstSVM = dstHostPtr;
|
||||||
|
void *pSrcSVM = srcHostPtr;
|
||||||
|
MockCommandQueueHw<FamilyType> myCmdQ(context, pDevice, 0);
|
||||||
|
retVal = myCmdQ.enqueueSVMMemcpy(
|
||||||
|
true, // cl_bool blocking_copy
|
||||||
|
pDstSVM, // void *dst_ptr
|
||||||
|
pSrcSVM, // const void *src_ptr
|
||||||
|
3, // size_t size
|
||||||
|
0, // cl_uint num_events_in_wait_list
|
||||||
|
nullptr, // cl_evebt *event_wait_list
|
||||||
|
nullptr // cL_event *event
|
||||||
|
);
|
||||||
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||||
|
EXPECT_EQ(myCmdQ.lastCommandType, static_cast<cl_command_type>(CL_COMMAND_WRITE_BUFFER));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EnqueueSvmTest, givenDstHostPtrAndSrcHostPtrAndSizeZeroWhenEnqueueSVMMemcpyThenReturnSuccess) {
|
||||||
char dstHostPtr[260];
|
char dstHostPtr[260];
|
||||||
char srcHostPtr[260];
|
char srcHostPtr[260];
|
||||||
void *pDstSVM = dstHostPtr;
|
void *pDstSVM = dstHostPtr;
|
||||||
|
@ -398,12 +441,12 @@ TEST_F(EnqueueSvmTest, GivenDstHostPtrAndSrcHostPtrWhenEnqueueSVMMemcpyThenRetur
|
||||||
false, // cl_bool blocking_copy
|
false, // cl_bool blocking_copy
|
||||||
pDstSVM, // void *dst_ptr
|
pDstSVM, // void *dst_ptr
|
||||||
pSrcSVM, // const void *src_ptr
|
pSrcSVM, // const void *src_ptr
|
||||||
256, // size_t size
|
0, // size_t size
|
||||||
0, // cl_uint num_events_in_wait_list
|
0, // cl_uint num_events_in_wait_list
|
||||||
nullptr, // cl_evebt *event_wait_list
|
nullptr, // cl_evebt *event_wait_list
|
||||||
nullptr // cL_event *event
|
nullptr // cL_event *event
|
||||||
);
|
);
|
||||||
EXPECT_EQ(CL_INVALID_VALUE, retVal);
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(EnqueueSvmTest, enqueueSVMMemcpy_Success) {
|
TEST_F(EnqueueSvmTest, enqueueSVMMemcpy_Success) {
|
||||||
|
@ -1196,3 +1239,25 @@ HWTEST_F(EnqueueSvmTest, GivenSrcHostPtrAndSizeZeroWhenHostPtrAllocationCreation
|
||||||
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
||||||
cmdQ.gpgpuEngine->commandStreamReceiver = oldCommandStreamReceiver;
|
cmdQ.gpgpuEngine->commandStreamReceiver = oldCommandStreamReceiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWTEST_F(EnqueueSvmTest, givenDstHostPtrAndSrcHostPtrWhenHostPtrAllocationCreationFailsThenReturnOutOfResource) {
|
||||||
|
char dstHostPtr[260];
|
||||||
|
char srcHostPtr[260];
|
||||||
|
void *pDstSVM = dstHostPtr;
|
||||||
|
void *pSrcSVM = srcHostPtr;
|
||||||
|
MockCommandQueueHw<FamilyType> cmdQ(context, pDevice, nullptr);
|
||||||
|
auto failCsr = std::make_unique<FailCsr<FamilyType>>(*pDevice->getExecutionEnvironment());
|
||||||
|
CommandStreamReceiver *oldCommandStreamReceiver = cmdQ.gpgpuEngine->commandStreamReceiver;
|
||||||
|
cmdQ.gpgpuEngine->commandStreamReceiver = failCsr.get();
|
||||||
|
retVal = cmdQ.enqueueSVMMemcpy(
|
||||||
|
false, // cl_bool blocking_copy
|
||||||
|
pDstSVM, // void *dst_ptr
|
||||||
|
pSrcSVM, // const void *src_ptr
|
||||||
|
256, // size_t size
|
||||||
|
0, // cl_uint num_events_in_wait_list
|
||||||
|
nullptr, // cl_evebt *event_wait_list
|
||||||
|
nullptr // cL_event *event
|
||||||
|
);
|
||||||
|
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
||||||
|
cmdQ.gpgpuEngine->commandStreamReceiver = oldCommandStreamReceiver;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue