Skip to content

Commit 2e346b5

Browse files
kgibalaCompute-Runtime-Automation
authored andcommitted
Enable memory transfer in enqueueMigrateMemObjects
Related-To: NEO-4589 Signed-off-by: Krzysztof Gibala <[email protected]>
1 parent bbb0e9d commit 2e346b5

File tree

5 files changed

+92
-19
lines changed

5 files changed

+92
-19
lines changed

opencl/source/api/api.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3355,6 +3355,15 @@ cl_int CL_API_CALL clEnqueueMigrateMemObjects(cl_command_queue commandQueue,
33553355
return retVal;
33563356
}
33573357

3358+
for (unsigned int object = 0; object < numMemObjects; object++) {
3359+
auto memObject = castToObject<MemObj>(memObjects[object]);
3360+
if (!memObject) {
3361+
retVal = CL_INVALID_MEM_OBJECT;
3362+
TRACING_EXIT(clEnqueueMigrateMemObjects, &retVal);
3363+
return retVal;
3364+
}
3365+
}
3366+
33583367
const cl_mem_migration_flags allValidFlags = CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED | CL_MIGRATE_MEM_OBJECT_HOST;
33593368

33603369
if ((flags & (~allValidFlags)) != 0) {

opencl/source/command_queue/enqueue_migrate_mem_objects.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ cl_int CommandQueueHw<GfxFamily>::enqueueMigrateMemObjects(cl_uint numMemObjects
2626
NullSurface s;
2727
Surface *surfaces[] = {&s};
2828

29+
auto rootDeviceIndex = getDevice().getRootDeviceIndex();
30+
31+
for (unsigned int object = 0; object < numMemObjects; object++) {
32+
auto memObject = castToObject<MemObj>(memObjects[object]);
33+
memObject->getMigrateableMultiGraphicsAllocation().ensureMemoryOnDevice(*getDevice().getMemoryManager(), rootDeviceIndex);
34+
}
35+
2936
enqueueHandler<CL_COMMAND_MIGRATE_MEM_OBJECTS>(surfaces,
3037
false,
3138
MultiDispatchInfo(),

opencl/test/unit_test/api/cl_enqueue_migrate_mem_objects_tests.inl

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "opencl/source/command_queue/command_queue.h"
99
#include "opencl/source/context/context.h"
1010
#include "opencl/source/event/event.h"
11+
#include "opencl/test/unit_test/mocks/mock_buffer.h"
1112

1213
#include "cl_api_tests.h"
1314

@@ -31,15 +32,15 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullCommandQueueWhenMigratingMemObj
3132
EXPECT_NE(nullptr, buffer);
3233

3334
cl_event eventReturned = nullptr;
34-
auto Result = clEnqueueMigrateMemObjects(
35+
auto result = clEnqueueMigrateMemObjects(
3536
nullptr,
3637
1,
3738
&buffer,
3839
CL_MIGRATE_MEM_OBJECT_HOST,
3940
0,
4041
nullptr,
4142
&eventReturned);
42-
EXPECT_EQ(CL_INVALID_COMMAND_QUEUE, Result);
43+
EXPECT_EQ(CL_INVALID_COMMAND_QUEUE, result);
4344

4445
retVal = clReleaseMemObject(buffer);
4546
EXPECT_EQ(CL_SUCCESS, retVal);
@@ -65,15 +66,15 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidInputsWhenMigratingMemObjThenS
6566
EXPECT_NE(nullptr, buffer);
6667

6768
cl_event eventReturned = nullptr;
68-
auto Result = clEnqueueMigrateMemObjects(
69+
auto result = clEnqueueMigrateMemObjects(
6970
pCommandQueue,
7071
1,
7172
&buffer,
7273
CL_MIGRATE_MEM_OBJECT_HOST,
7374
0,
7475
nullptr,
7576
&eventReturned);
76-
EXPECT_EQ(CL_SUCCESS, Result);
77+
EXPECT_EQ(CL_SUCCESS, result);
7778

7879
retVal = clReleaseMemObject(buffer);
7980
EXPECT_EQ(CL_SUCCESS, retVal);
@@ -86,59 +87,59 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidInputsWhenMigratingMemObjThenS
8687
TEST_F(clEnqueueMigrateMemObjectsTests, GivenNullMemObjsWhenMigratingMemObjThenInvalidValueErrorIsReturned) {
8788

8889
cl_event eventReturned = nullptr;
89-
auto Result = clEnqueueMigrateMemObjects(
90+
auto result = clEnqueueMigrateMemObjects(
9091
pCommandQueue,
9192
1,
9293
nullptr,
9394
CL_MIGRATE_MEM_OBJECT_HOST,
9495
0,
9596
nullptr,
9697
&eventReturned);
97-
EXPECT_EQ(CL_INVALID_VALUE, Result);
98+
EXPECT_EQ(CL_INVALID_VALUE, result);
9899
}
99100

100101
TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroMemObjectsWhenMigratingMemObjsThenInvalidValueErrorIsReturned) {
101102

102103
cl_event eventReturned = nullptr;
103-
auto Result = clEnqueueMigrateMemObjects(
104+
auto result = clEnqueueMigrateMemObjects(
104105
pCommandQueue,
105106
0,
106107
nullptr,
107108
CL_MIGRATE_MEM_OBJECT_HOST,
108109
0,
109110
nullptr,
110111
&eventReturned);
111-
EXPECT_EQ(CL_INVALID_VALUE, Result);
112+
EXPECT_EQ(CL_INVALID_VALUE, result);
112113
}
113114

114115
TEST_F(clEnqueueMigrateMemObjectsTests, GivenNonZeroEventsAndNullWaitlistWhenMigratingMemObjThenInvalidWaitListErrorIsReturned) {
115116

116117
cl_event eventReturned = nullptr;
117-
auto Result = clEnqueueMigrateMemObjects(
118+
auto result = clEnqueueMigrateMemObjects(
118119
pCommandQueue,
119120
0,
120121
nullptr,
121122
CL_MIGRATE_MEM_OBJECT_HOST,
122123
2,
123124
nullptr,
124125
&eventReturned);
125-
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, Result);
126+
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, result);
126127
}
127128

128129
TEST_F(clEnqueueMigrateMemObjectsTests, GivenZeroEventsAndNonNullWaitlistWhenMigratingMemObjsThenInvalidWaitListErrorIsReturned) {
129130

130131
cl_event eventReturned = nullptr;
131132
Event event(pCommandQueue, CL_COMMAND_MIGRATE_MEM_OBJECTS, 0, 0);
132133

133-
auto Result = clEnqueueMigrateMemObjects(
134+
auto result = clEnqueueMigrateMemObjects(
134135
pCommandQueue,
135136
0,
136137
nullptr,
137138
CL_MIGRATE_MEM_OBJECT_HOST,
138139
0,
139140
(cl_event *)&event,
140141
&eventReturned);
141-
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, Result);
142+
EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, result);
142143
}
143144

144145
TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenSuccessIsReturned) {
@@ -160,15 +161,15 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenValidFlagsWhenMigratingMemObjsThenS
160161

161162
for (auto validFlag : validFlags) {
162163
cl_event eventReturned = nullptr;
163-
auto Result = clEnqueueMigrateMemObjects(
164+
auto result = clEnqueueMigrateMemObjects(
164165
pCommandQueue,
165166
1,
166167
&buffer,
167168
validFlag,
168169
0,
169170
nullptr,
170171
&eventReturned);
171-
EXPECT_EQ(CL_SUCCESS, Result);
172+
EXPECT_EQ(CL_SUCCESS, result);
172173
clReleaseEvent(eventReturned);
173174
}
174175

@@ -197,15 +198,15 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidFlagsWhenMigratingMemObjsThe
197198

198199
for (auto invalidFlag : invalidFlags) {
199200
cl_event eventReturned = nullptr;
200-
auto Result = clEnqueueMigrateMemObjects(
201+
auto result = clEnqueueMigrateMemObjects(
201202
pCommandQueue,
202203
1,
203204
&buffer,
204205
invalidFlag,
205206
0,
206207
nullptr,
207208
&eventReturned);
208-
EXPECT_EQ(CL_INVALID_VALUE, Result);
209+
EXPECT_EQ(CL_INVALID_VALUE, result);
209210
clReleaseEvent(eventReturned);
210211
}
211212

@@ -214,3 +215,18 @@ TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidFlagsWhenMigratingMemObjsThe
214215

215216
delete[] pHostMem;
216217
}
218+
219+
TEST_F(clEnqueueMigrateMemObjectsTests, GivenInvalidMemObjectWhenMigratingMemObjsThenInvalidMemObjectErrorIsReturned) {
220+
cl_event eventReturned = nullptr;
221+
222+
auto result = clEnqueueMigrateMemObjects(
223+
pCommandQueue,
224+
1,
225+
reinterpret_cast<cl_mem *>(pCommandQueue),
226+
CL_MIGRATE_MEM_OBJECT_HOST,
227+
0,
228+
nullptr,
229+
&eventReturned);
230+
231+
EXPECT_EQ(CL_INVALID_MEM_OBJECT, result);
232+
}

opencl/test/unit_test/command_queue/enqueue_migrate_mem_objects_tests.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ typedef Test<MigrateMemObjectsFixture> MigrateMemObjectsTest;
3737
TEST_F(MigrateMemObjectsTest, GivenNullEventWhenMigratingEventsThenSuccessIsReturned) {
3838

3939
MockBuffer buffer;
40+
auto bufferMemObj = static_cast<cl_mem>(&buffer);
41+
auto pBufferMemObj = &bufferMemObj;
4042

4143
auto retVal = pCmdQ->enqueueMigrateMemObjects(
4244
1,
43-
(cl_mem *)&buffer,
45+
pBufferMemObj,
4446
CL_MIGRATE_MEM_OBJECT_HOST,
4547
0,
4648
nullptr,
@@ -52,13 +54,15 @@ TEST_F(MigrateMemObjectsTest, GivenNullEventWhenMigratingEventsThenSuccessIsRetu
5254
TEST_F(MigrateMemObjectsTest, GivenValidEventListWhenMigratingEventsThenSuccessIsReturned) {
5355

5456
MockBuffer buffer;
57+
auto bufferMemObj = static_cast<cl_mem>(&buffer);
58+
auto pBufferMemObj = &bufferMemObj;
5559

5660
UserEvent uEvent;
5761
cl_event eventWaitList[] = {&uEvent};
5862

5963
auto retVal = pCmdQ->enqueueMigrateMemObjects(
6064
1,
61-
(cl_mem *)&buffer,
65+
pBufferMemObj,
6266
CL_MIGRATE_MEM_OBJECT_HOST,
6367
1,
6468
eventWaitList,
@@ -70,12 +74,14 @@ TEST_F(MigrateMemObjectsTest, GivenValidEventListWhenMigratingEventsThenSuccessI
7074
TEST_F(MigrateMemObjectsTest, GivenEventPointerWhenMigratingEventsThenEventIsReturned) {
7175

7276
MockBuffer buffer;
77+
auto bufferMemObj = static_cast<cl_mem>(&buffer);
78+
auto pBufferMemObj = &bufferMemObj;
7379

7480
cl_event event = nullptr;
7581

7682
auto retVal = pCmdQ->enqueueMigrateMemObjects(
7783
1,
78-
(cl_mem *)&buffer,
84+
pBufferMemObj,
7985
CL_MIGRATE_MEM_OBJECT_HOST,
8086
0,
8187
nullptr,

opencl/test/unit_test/mem_obj/mem_obj_tests.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
#include "opencl/source/helpers/properties_helper.h"
1818
#include "opencl/source/mem_obj/mem_obj.h"
1919
#include "opencl/source/platform/platform.h"
20+
#include "opencl/test/unit_test/command_queue/command_queue_fixture.h"
2021
#include "opencl/test/unit_test/fixtures/multi_root_device_fixture.h"
2122
#include "opencl/test/unit_test/mocks/mock_allocation_properties.h"
23+
#include "opencl/test/unit_test/mocks/mock_buffer.h"
2224
#include "opencl/test/unit_test/mocks/mock_context.h"
2325
#include "opencl/test/unit_test/mocks/mock_deferred_deleter.h"
2426
#include "opencl/test/unit_test/mocks/mock_memory_manager.h"
@@ -570,3 +572,36 @@ TEST_F(MemObjMultiRootDeviceTests, WhenMemObjMapAreCreatedThenAllAllocationAreDe
570572

571573
memObj.reset(nullptr);
572574
}
575+
576+
TEST_F(MemObjMultiRootDeviceTests, WhenMemObjIsCreatedAndEnqueueMigrateMemObjectsCalledThenMemObjMultiGraphicsAllocationLastUsedRootDeviceIndexHasCorrectRootDeviceIndex) {
577+
cl_int retVal = 0;
578+
std::unique_ptr<Buffer> buffer(Buffer::create(context.get(), 0, MemoryConstants::pageSize, nullptr, retVal));
579+
EXPECT_EQ(CL_SUCCESS, retVal);
580+
EXPECT_NE(nullptr, buffer);
581+
582+
auto bufferMemObj = static_cast<cl_mem>(buffer.get());
583+
auto pBufferMemObj = &bufferMemObj;
584+
585+
auto cmdQ1 = context->getSpecialQueue(1u);
586+
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
587+
EXPECT_EQ(CL_SUCCESS, retVal);
588+
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
589+
590+
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
591+
EXPECT_EQ(CL_SUCCESS, retVal);
592+
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
593+
594+
auto cmdQ2 = context->getSpecialQueue(2u);
595+
retVal = cmdQ2->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
596+
EXPECT_EQ(CL_SUCCESS, retVal);
597+
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 2u);
598+
599+
retVal = cmdQ1->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
600+
EXPECT_EQ(CL_SUCCESS, retVal);
601+
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 1u);
602+
603+
static_cast<MemoryAllocation *>(buffer.get()->getMigrateableMultiGraphicsAllocation().getGraphicsAllocation(2u))->overrideMemoryPool(MemoryPool::LocalMemory);
604+
retVal = cmdQ2->enqueueMigrateMemObjects(1, pBufferMemObj, CL_MIGRATE_MEM_OBJECT_HOST, 0, nullptr, nullptr);
605+
EXPECT_EQ(CL_SUCCESS, retVal);
606+
EXPECT_EQ(buffer.get()->getMultiGraphicsAllocation().getLastUsedRootDeviceIndex(), 2u);
607+
}

0 commit comments

Comments
 (0)