@@ -167,3 +167,89 @@ TEST_P(urEnqueueUSMMemcpyTest, InvalidNullPtrEventWaitList) {
167167}
168168
169169UUR_INSTANTIATE_DEVICE_TEST_SUITE_P (urEnqueueUSMMemcpyTest);
170+
171+ struct urEnqueueUSMMemcpyMultiDeviceTest : uur::urAllDevicesTest {
172+ void SetUp () override {
173+ uur::urAllDevicesTest::SetUp ();
174+ for (auto &device : devices) {
175+ ur_device_usm_access_capability_flags_t device_usm = 0 ;
176+ ASSERT_SUCCESS (uur::GetDeviceUSMDeviceSupport (device, device_usm));
177+ if (device_usm) {
178+ usm_devices.push_back (device);
179+ if (usm_devices.size () == 2 ) {
180+ break ;
181+ }
182+ }
183+ }
184+
185+ if (usm_devices.size () < 2 ) {
186+ GTEST_SKIP () << " Not enough devices in platform with USM support" ;
187+ }
188+
189+ ASSERT_SUCCESS (urContextCreate (usm_devices.size (), usm_devices.data (),
190+ nullptr , &context));
191+ ASSERT_SUCCESS (
192+ urQueueCreate (context, usm_devices[0 ], nullptr , &src_queue));
193+ ASSERT_SUCCESS (
194+ urQueueCreate (context, usm_devices[1 ], nullptr , &dst_queue));
195+
196+ ASSERT_SUCCESS (
197+ urUSMHostAlloc (context, nullptr , nullptr , alloc_size, &host_alloc));
198+ ASSERT_SUCCESS (urUSMDeviceAlloc (context, usm_devices[0 ], nullptr ,
199+ nullptr , alloc_size, &src_alloc));
200+ ASSERT_SUCCESS (urUSMDeviceAlloc (context, usm_devices[1 ], nullptr ,
201+ nullptr , alloc_size, &dst_alloc));
202+
203+ ASSERT_SUCCESS (urEnqueueUSMFill (src_queue, src_alloc,
204+ sizeof (fill_pattern), &fill_pattern,
205+ alloc_size, 0 , nullptr , nullptr ));
206+ ASSERT_SUCCESS (urQueueFinish (src_queue));
207+ }
208+
209+ void TearDown () override {
210+ ASSERT_SUCCESS (urUSMFree (context, src_alloc));
211+ ASSERT_SUCCESS (urUSMFree (context, dst_alloc));
212+ ASSERT_SUCCESS (urUSMFree (context, host_alloc));
213+ ASSERT_SUCCESS (urQueueRelease (src_queue));
214+ ASSERT_SUCCESS (urQueueRelease (dst_queue));
215+ ASSERT_SUCCESS (urContextRelease (context));
216+ uur::urAllDevicesTest::TearDown ();
217+ }
218+
219+ void verifyData () {
220+ for (size_t i = 0 ; i < alloc_size; i++) {
221+ EXPECT_EQ (static_cast <uint8_t *>(host_alloc)[i], fill_pattern);
222+ }
223+ }
224+
225+ std::vector<ur_device_handle_t > usm_devices;
226+ ur_context_handle_t context = nullptr ;
227+ ur_queue_handle_t src_queue = nullptr ;
228+ ur_queue_handle_t dst_queue = nullptr ;
229+ void *src_alloc = nullptr ;
230+ void *dst_alloc = nullptr ;
231+ void *host_alloc = nullptr ;
232+ size_t alloc_size = 64 ;
233+ uint8_t fill_pattern = 42 ;
234+ };
235+
236+ TEST_F (urEnqueueUSMMemcpyMultiDeviceTest, DeviceToDeviceCopyBlocking) {
237+ ASSERT_SUCCESS (urEnqueueUSMMemcpy (src_queue, true , dst_alloc, src_alloc,
238+ alloc_size, 0 , nullptr , nullptr ));
239+ ASSERT_SUCCESS (urEnqueueUSMMemcpy (dst_queue, true , host_alloc, dst_alloc,
240+ alloc_size, 0 , nullptr , nullptr ));
241+ verifyData ();
242+ }
243+
244+ TEST_F (urEnqueueUSMMemcpyMultiDeviceTest, DeviceToDeviceCopyNonBlocking) {
245+ ur_event_handle_t device_copy_event = nullptr ;
246+ ASSERT_SUCCESS (urEnqueueUSMMemcpy (src_queue, false , dst_alloc, src_alloc,
247+ alloc_size, 0 , nullptr ,
248+ &device_copy_event));
249+ ASSERT_SUCCESS (urQueueFlush (src_queue));
250+ ASSERT_SUCCESS (urEventWait (1 , &device_copy_event));
251+ ASSERT_SUCCESS (urEventRelease (device_copy_event));
252+ ASSERT_SUCCESS (urEnqueueUSMMemcpy (dst_queue, true , host_alloc, dst_alloc,
253+ alloc_size, 0 , nullptr , nullptr ));
254+ verifyData ();
255+ }
0 commit comments