Enable memory transfer in enqueueMigrateMemObjects

Related-To: NEO-4589
Signed-off-by: Krzysztof Gibala <krzysztof.gibala@intel.com>
This commit is contained in:
Krzysztof Gibala
2020-12-28 12:10:10 +01:00
committed by Compute-Runtime-Automation
parent bbb0e9d095
commit 2e346b58cd
5 changed files with 92 additions and 19 deletions

View File

@ -3355,6 +3355,15 @@ cl_int CL_API_CALL clEnqueueMigrateMemObjects(cl_command_queue commandQueue,
return retVal; return retVal;
} }
for (unsigned int object = 0; object < numMemObjects; object++) {
auto memObject = castToObject<MemObj>(memObjects[object]);
if (!memObject) {
retVal = CL_INVALID_MEM_OBJECT;
TRACING_EXIT(clEnqueueMigrateMemObjects, &retVal);
return retVal;
}
}
const cl_mem_migration_flags allValidFlags = CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED | CL_MIGRATE_MEM_OBJECT_HOST; const cl_mem_migration_flags allValidFlags = CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED | CL_MIGRATE_MEM_OBJECT_HOST;
if ((flags & (~allValidFlags)) != 0) { if ((flags & (~allValidFlags)) != 0) {

View File

@ -26,6 +26,13 @@ cl_int CommandQueueHw<GfxFamily>::enqueueMigrateMemObjects(cl_uint numMemObjects
NullSurface s; NullSurface s;
Surface *surfaces[] = {&s}; Surface *surfaces[] = {&s};
auto rootDeviceIndex = getDevice().getRootDeviceIndex();
for (unsigned int object = 0; object < numMemObjects; object++) {
auto memObject = castToObject<MemObj>(memObjects[object]);
memObject->getMigrateableMultiGraphicsAllocation().ensureMemoryOnDevice(*getDevice().getMemoryManager(), rootDeviceIndex);
}
enqueueHandler<CL_COMMAND_MIGRATE_MEM_OBJECTS>(surfaces, enqueueHandler<CL_COMMAND_MIGRATE_MEM_OBJECTS>(surfaces,
false, false,
MultiDispatchInfo(), MultiDispatchInfo(),

View File

@ -8,6 +8,7 @@
#include "opencl/source/command_queue/command_queue.h" #include "opencl/source/command_queue/command_queue.h"
#include "opencl/source/context/context.h" #include "opencl/source/context/context.h"
#include "opencl/source/event/event.h" #include "opencl/source/event/event.h"
#include "opencl/test/unit_test/mocks/mock_buffer.h"
#include "cl_api_tests.h" #include "cl_api_tests.h"
@ -31,7 +32,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullCommandQueueWhenMigratingMemObj
EXPECT_NE(nullptr, buffer); EXPECT_NE(nullptr, buffer);
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
nullptr, nullptr,
1, 1,
&buffer, &buffer,
@ -39,7 +40,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullCommandQueueWhenMigratingMemObj
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_COMMAND_QUEUE, Result); EXPECT_EQ(CL_INVALID_COMMAND_QUEUE, result);
retVal = clReleaseMemObject(buffer); retVal = clReleaseMemObject(buffer);
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
@ -65,7 +66,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidInputsWhenMigratingMemObjThenS
EXPECT_NE(nullptr, buffer); EXPECT_NE(nullptr, buffer);
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
1, 1,
&buffer, &buffer,
@ -73,7 +74,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidInputsWhenMigratingMemObjThenS
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_SUCCESS, Result); EXPECT_EQ(CL_SUCCESS, result);
retVal = clReleaseMemObject(buffer); retVal = clReleaseMemObject(buffer);
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
@ -86,7 +87,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidInputsWhenMigratingMemObjThenS
TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullMemObjsWhenMigratingMemObjThenInvalidValueErrorIsReturned) { TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullMemObjsWhenMigratingMemObjThenInvalidValueErrorIsReturned) {
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
1, 1,
nullptr, nullptr,
@ -94,13 +95,13 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullMemObjsWhenMigratingMemObjThenI
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_VALUE, Result); EXPECT_EQ(CL_INVALID_VALUE, result);
} }
TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroMemObjectsWhenMigratingMemObjsThenInvalidValueErrorIsReturned) { TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroMemObjectsWhenMigratingMemObjsThenInvalidValueErrorIsReturned) {
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
0, 0,
nullptr, nullptr,
@ -108,13 +109,13 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroMemObjectsWhenMigratingMemObjsT
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_VALUE, Result); EXPECT_EQ(CL_INVALID_VALUE, result);
} }
TEST_F(clEnqueueMigrateMemObjectsTests, GivenNonZeroEventsAndNullWaitlistWhenMigratingMemObjThenInvalidWaitListErrorIsReturned) { TEST_F(clEnqueueMigrateMemObjectsTests, GivenNonZeroEventsAndNullWaitlistWhenMigratingMemObjThenInvalidWaitListErrorIsReturned) {
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
0, 0,
nullptr, nullptr,
@ -122,7 +123,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenNonZeroEventsAndNullWaitlistWhenMig
2, 2,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, Result); EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, result);
} }
TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroEventsAndNonNullWaitlistWhenMigratingMemObjsThenInvalidWaitListErrorIsReturned) { TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroEventsAndNonNullWaitlistWhenMigratingMemObjsThenInvalidWaitListErrorIsReturned) {
@ -130,7 +131,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroEventsAndNonNullWaitlistWhenMig
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
Event event(pCommandQueue, CL_COMMAND_MIGRATE_MEM_OBJECTS, 0, 0); Event event(pCommandQueue, CL_COMMAND_MIGRATE_MEM_OBJECTS, 0, 0);
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
0, 0,
nullptr, nullptr,
@ -138,7 +139,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroEventsAndNonNullWaitlistWhenMig
0, 0,
(cl_event *)&event, (cl_event *)&event,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, Result); EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, result);
} }
TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenSuccessIsReturned) { TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenSuccessIsReturned) {
@ -160,7 +161,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenS
for (auto validFlag : validFlags) { for (auto validFlag : validFlags) {
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
1, 1,
&buffer, &buffer,
@ -168,7 +169,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenS
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_SUCCESS, Result); EXPECT_EQ(CL_SUCCESS, result);
clReleaseEvent(eventReturned); clReleaseEvent(eventReturned);
} }
@ -197,7 +198,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidFlagsWhenMigratingMemObjsThe
for (auto invalidFlag : invalidFlags) { for (auto invalidFlag : invalidFlags) {
cl_event eventReturned = nullptr; cl_event eventReturned = nullptr;
auto Result = clEnqueueMigrateMemObjects( auto result = clEnqueueMigrateMemObjects(
pCommandQueue, pCommandQueue,
1, 1,
&buffer, &buffer,
@ -205,7 +206,7 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidFlagsWhenMigratingMemObjsThe
0, 0,
nullptr, nullptr,
&eventReturned); &eventReturned);
EXPECT_EQ(CL_INVALID_VALUE, Result); EXPECT_EQ(CL_INVALID_VALUE, result);
clReleaseEvent(eventReturned); clReleaseEvent(eventReturned);
} }
@ -214,3 +215,18 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidFlagsWhenMigratingMemObjsThe
delete[] pHostMem; delete[] pHostMem;
} }
TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidMemObjectWhenMigratingMemObjsThenInvalidMemObjectErrorIsReturned) {
cl_event eventReturned = nullptr;
auto result = clEnqueueMigrateMemObjects(
pCommandQueue,
1,
reinterpret_cast<cl_mem *>(pCommandQueue),
CL_MIGRATE_MEM_OBJECT_HOST,
0,
nullptr,
&eventReturned);
EXPECT_EQ(CL_INVALID_MEM_OBJECT, result);
}

View File

@ -37,10 +37,12 @@ typedef Test<MigrateMemObjectsFixture> MigrateMemObjectsTest;
TEST_F(MigrateMemObjectsTest, GivenNullEventWhenMigratingEventsThenSuccessIsReturned) { TEST_F(MigrateMemObjectsTest, GivenNullEventWhenMigratingEventsThenSuccessIsReturned) {
MockBuffer buffer; MockBuffer buffer;
auto bufferMemObj = static_cast<cl_mem>(&buffer);
auto pBufferMemObj = &bufferMemObj;
auto retVal = pCmdQ->enqueueMigrateMemObjects( auto retVal = pCmdQ->enqueueMigrateMemObjects(
1, 1,
(cl_mem *)&buffer, pBufferMemObj,
CL_MIGRATE_MEM_OBJECT_HOST, CL_MIGRATE_MEM_OBJECT_HOST,
0, 0,
nullptr, nullptr,
@ -52,13 +54,15 @@ TEST_F(MigrateMemObjectsTest, GivenNullEventWhenMigratingEventsThenSuccessIsRetu
TEST_F(MigrateMemObjectsTest, GivenValidEventListWhenMigratingEventsThenSuccessIsReturned) { TEST_F(MigrateMemObjectsTest, GivenValidEventListWhenMigratingEventsThenSuccessIsReturned) {
MockBuffer buffer; MockBuffer buffer;
auto bufferMemObj = static_cast<cl_mem>(&buffer);
auto pBufferMemObj = &bufferMemObj;
UserEvent uEvent; UserEvent uEvent;
cl_event eventWaitList[] = {&uEvent}; cl_event eventWaitList[] = {&uEvent};
auto retVal = pCmdQ->enqueueMigrateMemObjects( auto retVal = pCmdQ->enqueueMigrateMemObjects(
1, 1,
(cl_mem *)&buffer, pBufferMemObj,
CL_MIGRATE_MEM_OBJECT_HOST, CL_MIGRATE_MEM_OBJECT_HOST,
1, 1,
eventWaitList, eventWaitList,
@ -70,12 +74,14 @@ TEST_F(MigrateMemObjectsTest, GivenValidEventListWhenMigratingEventsThenSuccessI
TEST_F(MigrateMemObjectsTest, GivenEventPointerWhenMigratingEventsThenEventIsReturned) { TEST_F(MigrateMemObjectsTest, GivenEventPointerWhenMigratingEventsThenEventIsReturned) {
MockBuffer buffer; MockBuffer buffer;
auto bufferMemObj = static_cast<cl_mem>(&buffer);
auto pBufferMemObj = &bufferMemObj;
cl_event event = nullptr; cl_event event = nullptr;
auto retVal = pCmdQ->enqueueMigrateMemObjects( auto retVal = pCmdQ->enqueueMigrateMemObjects(
1, 1,
(cl_mem *)&buffer, pBufferMemObj,
CL_MIGRATE_MEM_OBJECT_HOST, CL_MIGRATE_MEM_OBJECT_HOST,
0, 0,
nullptr, nullptr,

View File

@ -17,8 +17,10 @@
#include "opencl/source/helpers/properties_helper.h" #include "opencl/source/helpers/properties_helper.h"
#include "opencl/source/mem_obj/mem_obj.h" #include "opencl/source/mem_obj/mem_obj.h"
#include "opencl/source/platform/platform.h" #include "opencl/source/platform/platform.h"
#include "opencl/test/unit_test/command_queue/command_queue_fixture.h"
#include "opencl/test/unit_test/fixtures/multi_root_device_fixture.h" #include "opencl/test/unit_test/fixtures/multi_root_device_fixture.h"
#include "opencl/test/unit_test/mocks/mock_allocation_properties.h" #include "opencl/test/unit_test/mocks/mock_allocation_properties.h"
#include "opencl/test/unit_test/mocks/mock_buffer.h"
#include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_context.h"
#include "opencl/test/unit_test/mocks/mock_deferred_deleter.h" #include "opencl/test/unit_test/mocks/mock_deferred_deleter.h"
#include "opencl/test/unit_test/mocks/mock_memory_manager.h" #include "opencl/test/unit_test/mocks/mock_memory_manager.h"
@ -570,3 +572,36 @@ TEST_F(MemObjMultiRootDeviceTests, WhenMemObjMapAreCreatedThenAllAllocationAreDe
memObj.reset(nullptr); memObj.reset(nullptr);
} }
TEST_F(MemObjMultiRootDeviceTests, WhenMemObjIsCreatedAndEnqueueMigrateMemObjectsCalledThenMemObjMultiGraphicsAllocationLastUsedRootDeviceIndexHasCorrectRootDeviceIndex) {
cl_int retVal = 0;
std::unique_ptr<Buffer> buffer(Buffer::create(context.get(), 0, MemoryConstants::pageSize, nullptr, retVal));
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_NE(nullptr, buffer);
auto bufferMemObj = static_cast<cl_mem>(buffer.get());
auto pBufferMemObj = &bufferMemObj;
auto cmdQ1 = context->getSpecialQueue(1u);
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
auto cmdQ2 = context->getSpecialQueue(2u);
retVal = cmdQ2->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 2u);
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
static_cast<MemoryAllocation *>(buffer.get()->getMigrateableMultiGraphicsAllocation().getGraphicsAllocation(2u))->overrideMemoryPool(MemoryPool::LocalMemory);
retVal = cmdQ2->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 2u);
}