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 srcSvmData = context->getSVMAllocsManager()->getSVMAlloc(srcPtr);
|
||||
|
||||
enum CopyType { InvalidCopyType,
|
||||
enum CopyType { HostToHost,
|
||||
SvmToHost,
|
||||
HostToSvm,
|
||||
SvmToSvm };
|
||||
CopyType copyType = InvalidCopyType;
|
||||
CopyType copyType = HostToHost;
|
||||
if ((srcSvmData != nullptr) && (dstSvmData != nullptr)) {
|
||||
copyType = SvmToSvm;
|
||||
} else if ((srcSvmData == nullptr) && (dstSvmData != nullptr)) {
|
||||
copyType = HostToSvm;
|
||||
} else if (srcSvmData != nullptr) {
|
||||
copyType = SvmToHost;
|
||||
} else {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
MultiDispatchInfo dispatchInfo;
|
||||
|
@ -361,7 +359,7 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemcpy(cl_bool blockingCopy,
|
|||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
event);
|
||||
} else {
|
||||
} else if (copyType == SvmToSvm) {
|
||||
GeneralSurface srcSvmSurf(srcSvmData->gpuAllocation);
|
||||
GeneralSurface dstSvmSurf(dstSvmData->gpuAllocation);
|
||||
setOperationParams(operationParams, size, alignedSrcPtr, srcSvmData->gpuAllocation, srcPtrOffset, alignedDstPtr, dstSvmData->gpuAllocation, dstPtrOffset);
|
||||
|
@ -375,6 +373,30 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemcpy(cl_bool blockingCopy,
|
|||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
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) {
|
||||
auto pEvent = castToObjectOrAbort<Event>(*event);
|
||||
|
|
|
@ -389,7 +389,50 @@ TEST_F(EnqueueSvmTest, GivenDstHostPtrAndSizeZeroWhenEnqueueSVMMemcpyThenReturnS
|
|||
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 srcHostPtr[260];
|
||||
void *pDstSVM = dstHostPtr;
|
||||
|
@ -398,12 +441,12 @@ TEST_F(EnqueueSvmTest, GivenDstHostPtrAndSrcHostPtrWhenEnqueueSVMMemcpyThenRetur
|
|||
false, // cl_bool blocking_copy
|
||||
pDstSVM, // void *dst_ptr
|
||||
pSrcSVM, // const void *src_ptr
|
||||
256, // size_t size
|
||||
0, // size_t size
|
||||
0, // cl_uint num_events_in_wait_list
|
||||
nullptr, // cl_evebt *event_wait_list
|
||||
nullptr // cL_event *event
|
||||
);
|
||||
EXPECT_EQ(CL_INVALID_VALUE, retVal);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
}
|
||||
|
||||
TEST_F(EnqueueSvmTest, enqueueSVMMemcpy_Success) {
|
||||
|
@ -1196,3 +1239,25 @@ HWTEST_F(EnqueueSvmTest, GivenSrcHostPtrAndSizeZeroWhenHostPtrAllocationCreation
|
|||
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
||||
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