Skip to content

Commit 3d3e6b9

Browse files
Testing enqueueSVMMemcpy with host pointer
Related-To: NEO-3011 Change-Id: I179089e078361dd2449f78e75f1d6edd3f5235de Signed-off-by: Koska, Andrzej <[email protected]>
1 parent b273c93 commit 3d3e6b9

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

unit_tests/command_queue/enqueue_svm_mem_copy_tests.cpp

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,151 @@ HWTEST_F(EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBuffer
123123
auto kernel = mdi->begin()->getKernel();
124124
EXPECT_EQ("CopyBufferToBufferMiddle", kernel->getKernelInfo().name);
125125
}
126+
127+
HWTEST_F(EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBufferBuilderAndSrcHostPtrThenItConfiguredWithBuiltinOpsAndProducesDispatchInfo) {
128+
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
129+
void *srcHostPtr = alignedMalloc(256, 64);
130+
131+
// retrieve original builder
132+
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
133+
EBuiltInOps::CopyBufferToBuffer,
134+
pCmdQ->getContext(),
135+
pCmdQ->getDevice());
136+
ASSERT_NE(nullptr, &origBuilder);
137+
138+
// substitute original builder with mock builder
139+
auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder(
140+
EBuiltInOps::CopyBufferToBuffer,
141+
pCmdQ->getContext(),
142+
pCmdQ->getDevice(),
143+
std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder)));
144+
EXPECT_EQ(&origBuilder, oldBuilder.get());
145+
146+
// call enqueue on mock builder
147+
auto retVal = pCmdQ->enqueueSVMMemcpy(
148+
false, // cl_bool blocking_copy
149+
dstSvmPtr, // void *dst_ptr
150+
srcHostPtr, // const void *src_ptr
151+
256, // size_t size
152+
0, // cl_uint num_events_in_wait_list
153+
nullptr, // cl_event *event_wait_list
154+
nullptr // cL_event *event
155+
);
156+
EXPECT_EQ(CL_SUCCESS, retVal);
157+
158+
// restore original builder and retrieve mock builder
159+
auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder(
160+
EBuiltInOps::CopyBufferToBuffer,
161+
pCmdQ->getContext(),
162+
pCmdQ->getDevice(),
163+
std::move(oldBuilder));
164+
EXPECT_NE(nullptr, newBuilder);
165+
166+
// check if original builder is restored correctly
167+
auto &restoredBuilder = builtIns.getBuiltinDispatchInfoBuilder(
168+
EBuiltInOps::CopyBufferToBuffer,
169+
pCmdQ->getContext(),
170+
pCmdQ->getDevice());
171+
EXPECT_EQ(&origBuilder, &restoredBuilder);
172+
173+
// use mock builder to validate builder's input / output
174+
auto mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder *>(newBuilder.get());
175+
176+
// validate builder's input - builtin ops
177+
auto params = mockBuilder->getBuiltinOpParams();
178+
EXPECT_EQ(srcHostPtr, params->srcPtr);
179+
EXPECT_EQ(dstSvmPtr, params->dstPtr);
180+
EXPECT_EQ(nullptr, params->srcMemObj);
181+
EXPECT_EQ(nullptr, params->dstMemObj);
182+
EXPECT_EQ(nullptr, params->srcSvmAlloc);
183+
EXPECT_EQ(dstSvmAlloc, params->dstSvmAlloc);
184+
EXPECT_EQ(Vec3<size_t>(0, 0, 0), params->srcOffset);
185+
EXPECT_EQ(Vec3<size_t>(0, 0, 0), params->dstOffset);
186+
EXPECT_EQ(Vec3<size_t>(256, 0, 0), params->size);
187+
188+
// validate builder's output - multi dispatch info
189+
auto mdi = mockBuilder->getMultiDispatchInfo();
190+
EXPECT_EQ(1u, mdi->size());
191+
192+
auto di = mdi->begin();
193+
size_t middleElSize = 4 * sizeof(uint32_t);
194+
EXPECT_EQ(Vec3<size_t>(256 / middleElSize, 1, 1), di->getGWS());
195+
196+
auto kernel = mdi->begin()->getKernel();
197+
EXPECT_EQ("CopyBufferToBufferMiddle", kernel->getKernelInfo().name);
198+
alignedFree(srcHostPtr);
199+
}
200+
201+
HWTEST_F(EnqueueSvmMemCopyTest, givenEnqueueSVMMemcpyWhenUsingCopyBufferToBufferBuilderAndDstHostPtrThenItConfiguredWithBuiltinOpsAndProducesDispatchInfo) {
202+
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
203+
auto dstHostPtr = alignedMalloc(256, 64);
204+
205+
// retrieve original builder
206+
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
207+
EBuiltInOps::CopyBufferToBuffer,
208+
pCmdQ->getContext(),
209+
pCmdQ->getDevice());
210+
ASSERT_NE(nullptr, &origBuilder);
211+
212+
// substitute original builder with mock builder
213+
auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder(
214+
EBuiltInOps::CopyBufferToBuffer,
215+
pCmdQ->getContext(),
216+
pCmdQ->getDevice(),
217+
std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder)));
218+
EXPECT_EQ(&origBuilder, oldBuilder.get());
219+
220+
// call enqueue on mock builder
221+
auto retVal = pCmdQ->enqueueSVMMemcpy(
222+
false, // cl_bool blocking_copy
223+
dstHostPtr, // void *dst_ptr
224+
srcSvmPtr, // const void *src_ptr
225+
256, // size_t size
226+
0, // cl_uint num_events_in_wait_list
227+
nullptr, // cl_event *event_wait_list
228+
nullptr // cL_event *event
229+
);
230+
EXPECT_EQ(CL_SUCCESS, retVal);
231+
232+
// restore original builder and retrieve mock builder
233+
auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder(
234+
EBuiltInOps::CopyBufferToBuffer,
235+
pCmdQ->getContext(),
236+
pCmdQ->getDevice(),
237+
std::move(oldBuilder));
238+
EXPECT_NE(nullptr, newBuilder);
239+
240+
// check if original builder is restored correctly
241+
auto &restoredBuilder = builtIns.getBuiltinDispatchInfoBuilder(
242+
EBuiltInOps::CopyBufferToBuffer,
243+
pCmdQ->getContext(),
244+
pCmdQ->getDevice());
245+
EXPECT_EQ(&origBuilder, &restoredBuilder);
246+
247+
// use mock builder to validate builder's input / output
248+
auto mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder *>(newBuilder.get());
249+
250+
// validate builder's input - builtin ops
251+
auto params = mockBuilder->getBuiltinOpParams();
252+
EXPECT_EQ(srcSvmPtr, params->srcPtr);
253+
EXPECT_EQ(dstHostPtr, params->dstPtr);
254+
EXPECT_EQ(nullptr, params->srcMemObj);
255+
EXPECT_EQ(nullptr, params->dstMemObj);
256+
EXPECT_EQ(srcSvmAlloc, params->srcSvmAlloc);
257+
EXPECT_EQ(nullptr, params->dstSvmAlloc);
258+
EXPECT_EQ(Vec3<size_t>(0, 0, 0), params->srcOffset);
259+
EXPECT_EQ(Vec3<size_t>(0, 0, 0), params->dstOffset);
260+
EXPECT_EQ(Vec3<size_t>(256, 0, 0), params->size);
261+
262+
// validate builder's output - multi dispatch info
263+
auto mdi = mockBuilder->getMultiDispatchInfo();
264+
EXPECT_EQ(1u, mdi->size());
265+
266+
auto di = mdi->begin();
267+
size_t middleElSize = 4 * sizeof(uint32_t);
268+
EXPECT_EQ(Vec3<size_t>(256 / middleElSize, 1, 1), di->getGWS());
269+
270+
auto kernel = mdi->begin()->getKernel();
271+
EXPECT_EQ("CopyBufferToBufferMiddle", kernel->getKernelInfo().name);
272+
alignedFree(dstHostPtr);
273+
}

0 commit comments

Comments
 (0)