Skip to content

Commit db7bdc2

Browse files
Add multi-gpu scenarios for SVM allocations
Signed-off-by: Misiak, Konstanty <[email protected]>
1 parent 02e613b commit db7bdc2

File tree

4 files changed

+374
-7
lines changed

4 files changed

+374
-7
lines changed

conformance_tests/core/test_copy/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
# Copyright (C) 2019 Intel Corporation
1+
# Copyright (C) 2019-2025 Intel Corporation
22
# SPDX-License-Identifier: MIT
33

44
add_lzt_test(
55
NAME test_copy
66
GROUP "/conformance_tests/core"
77
SOURCES
8-
src/test_copy.cpp
8+
src/main.cpp
99
src/test_copy_events.cpp
10-
src/test_kernel_copy.cpp
1110
src/test_copy_image.cpp
11+
src/test_copy_remote_madvise.cpp
12+
src/test_copy.cpp
13+
src/test_kernel_copy.cpp
1214
src/test_multicontext_copy.cpp
13-
src/main.cpp
1415
LINK_LIBRARIES
1516
level_zero_tests::logging
1617
level_zero_tests::image
1718
level_zero_tests::utils
18-
level_zero_tests::utils
1919
MEDIA
2020
"png/test_input.png"
2121
KERNELS
Lines changed: 363 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,363 @@
1+
/*
2+
*
3+
* Copyright (C) 2025 Intel Corporation
4+
*
5+
* SPDX-License-Identifier: MIT
6+
*
7+
*/
8+
9+
#include "gtest/gtest.h"
10+
11+
#include "utils/utils.hpp"
12+
#include "test_harness/test_harness.hpp"
13+
#include "logging/logging.hpp"
14+
15+
namespace lzt = level_zero_tests;
16+
17+
#include <level_zero/ze_api.h>
18+
19+
namespace {
20+
21+
struct SharedSystemRemoteDeviceTests : public ::testing::TestWithParam<bool> {
22+
void SetUp() override {
23+
auto driver = lzt::get_default_driver();
24+
auto context = lzt::get_default_context();
25+
auto devices = lzt::get_ze_devices(driver);
26+
27+
devices.erase(
28+
std::remove_if(
29+
begin(devices), end(devices),
30+
[](auto dev) { return !lzt::supports_shared_system_alloc(dev); }),
31+
end(devices));
32+
33+
LOG_INFO << "num_devices: " << devices.size();
34+
if (devices.size() < 2) {
35+
GTEST_SKIP() << "Test requires at least two devices that support shared "
36+
"system allocations.";
37+
}
38+
39+
device = devices[0];
40+
remote_device = devices[1];
41+
42+
ASSERT_TRUE(lzt::can_access_peer(device, remote_device));
43+
44+
bool is_immediate = GetParam();
45+
cmd_bundle = lzt::create_command_bundle(device, is_immediate);
46+
}
47+
48+
void TearDown() override {
49+
if (cmd_bundle.list != nullptr) {
50+
lzt::destroy_command_bundle(cmd_bundle);
51+
}
52+
}
53+
54+
void run_append_memory_fill_test(bool use_madvise) {
55+
void *memory = lzt::aligned_malloc(size, 1);
56+
memset(memory, 0, size);
57+
58+
if (use_madvise) {
59+
lzt::append_memory_advise(cmd_bundle.list, remote_device, memory, size,
60+
ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
61+
}
62+
uint8_t pattern = 0xAB;
63+
lzt::append_memory_fill(cmd_bundle.list, memory, &pattern, sizeof(pattern),
64+
size, nullptr);
65+
66+
lzt::close_command_list(cmd_bundle.list);
67+
lzt::execute_and_sync_command_bundle(cmd_bundle, UINT64_MAX);
68+
69+
uint8_t *memory_as_byte = static_cast<uint8_t *>(memory);
70+
for (size_t i = 0; i < size; i++) {
71+
ASSERT_EQ(memory_as_byte[i], pattern) << "Memory not matching at: " << i;
72+
}
73+
74+
lzt::aligned_free(memory);
75+
}
76+
77+
void run_append_memory_copy_test(bool use_madvise_for_src,
78+
bool use_madvise_for_dst) {
79+
void *src_memory = lzt::aligned_malloc(size, 1);
80+
void *dst_memory = lzt::aligned_malloc(size, 1);
81+
memset(src_memory, 0xAB, size);
82+
memset(dst_memory, 0, size);
83+
84+
if (use_madvise_for_src) {
85+
lzt::append_memory_advise(cmd_bundle.list, remote_device, src_memory,
86+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
87+
}
88+
if (use_madvise_for_dst) {
89+
lzt::append_memory_advise(cmd_bundle.list, remote_device, dst_memory,
90+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
91+
}
92+
93+
lzt::append_memory_copy(cmd_bundle.list, dst_memory, src_memory, size);
94+
95+
lzt::close_command_list(cmd_bundle.list);
96+
lzt::execute_and_sync_command_bundle(cmd_bundle, UINT64_MAX);
97+
98+
uint8_t *src_memory_as_byte = static_cast<uint8_t *>(src_memory);
99+
uint8_t *dst_memory_as_byte = static_cast<uint8_t *>(dst_memory);
100+
for (size_t i = 0; i < size; i++) {
101+
ASSERT_EQ(src_memory_as_byte[i], dst_memory_as_byte[i])
102+
<< "Memory not matching at: " << i;
103+
}
104+
105+
lzt::aligned_free(src_memory);
106+
lzt::aligned_free(dst_memory);
107+
}
108+
109+
void run_append_memory_copy_region_test(bool use_madvise_for_src,
110+
bool use_madvise_for_dst) {
111+
void *src_memory = lzt::aligned_malloc(size, 1);
112+
void *dst_memory = lzt::aligned_malloc(size, 1);
113+
memset(src_memory, 0xAB, size);
114+
memset(dst_memory, 0, size);
115+
116+
if (use_madvise_for_src) {
117+
lzt::append_memory_advise(cmd_bundle.list, remote_device, src_memory,
118+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
119+
}
120+
if (use_madvise_for_dst) {
121+
lzt::append_memory_advise(cmd_bundle.list, remote_device, dst_memory,
122+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
123+
}
124+
125+
constexpr size_t region_size = size / 2;
126+
ze_copy_region_t region;
127+
region.originX = 0;
128+
region.originY = 0;
129+
region.originZ = 0;
130+
region.width = region_size;
131+
region.height = 1;
132+
region.depth = 1;
133+
134+
lzt::append_memory_copy_region(cmd_bundle.list, dst_memory, &region, 1, 1,
135+
src_memory, &region, 1, 1, nullptr);
136+
lzt::close_command_list(cmd_bundle.list);
137+
lzt::execute_and_sync_command_bundle(cmd_bundle, UINT64_MAX);
138+
139+
uint8_t *src_memory_as_byte = static_cast<uint8_t *>(src_memory);
140+
uint8_t *dst_memory_as_byte = static_cast<uint8_t *>(dst_memory);
141+
for (size_t i = 0; i < region_size; i++) {
142+
ASSERT_EQ(src_memory_as_byte[i], dst_memory_as_byte[i])
143+
<< "Memory not matching at: " << i;
144+
}
145+
146+
lzt::aligned_free(src_memory);
147+
lzt::aligned_free(dst_memory);
148+
}
149+
150+
void run_append_memory_image_copy_test(bool use_madvise_for_src,
151+
bool use_madvise_for_dst) {
152+
auto png_img_src = lzt::ImagePNG32Bit("test_input.png");
153+
auto image_width = png_img_src.width();
154+
auto image_height = png_img_src.height();
155+
auto image_size = image_width * image_height * sizeof(uint32_t);
156+
auto png_img_dest = lzt::ImagePNG32Bit(image_width, image_height);
157+
158+
ze_image_desc_t img_desc = {};
159+
img_desc.stype = ZE_STRUCTURE_TYPE_IMAGE_DESC;
160+
img_desc.flags = ZE_IMAGE_FLAG_KERNEL_WRITE;
161+
img_desc.type = ZE_IMAGE_TYPE_2D;
162+
img_desc.format = {
163+
ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM,
164+
ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G,
165+
ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A};
166+
img_desc.width = image_width;
167+
img_desc.height = image_height;
168+
img_desc.depth = 1;
169+
img_desc.arraylevels = 0;
170+
img_desc.miplevels = 0;
171+
172+
auto ze_img = lzt::create_ze_image(device, img_desc);
173+
174+
if (use_madvise_for_src) {
175+
lzt::append_memory_advise(cmd_bundle.list, remote_device,
176+
png_img_src.raw_data(), size,
177+
ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
178+
}
179+
if (use_madvise_for_dst) {
180+
lzt::append_memory_advise(cmd_bundle.list, remote_device,
181+
png_img_dest.raw_data(), size,
182+
ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
183+
}
184+
185+
lzt::append_image_copy_from_mem(cmd_bundle.list, ze_img,
186+
png_img_src.raw_data(), nullptr);
187+
lzt::append_barrier(cmd_bundle.list, nullptr, 0, nullptr);
188+
lzt::append_image_copy_to_mem(cmd_bundle.list, png_img_dest.raw_data(),
189+
ze_img, nullptr);
190+
lzt::append_barrier(cmd_bundle.list, nullptr, 0, nullptr);
191+
lzt::close_command_list(cmd_bundle.list);
192+
lzt::execute_and_sync_command_bundle(cmd_bundle, UINT64_MAX);
193+
194+
EXPECT_EQ(png_img_src, png_img_dest);
195+
}
196+
197+
void run_append_launch_kernel_test(bool use_madvise_for_src,
198+
bool use_madvise_for_dst,
199+
bool use_cooperative) {
200+
size_t buffer_size = size * sizeof(int);
201+
void *src_memory = lzt::aligned_malloc(buffer_size, sizeof(int));
202+
void *dst_memory = lzt::aligned_malloc(buffer_size, sizeof(int));
203+
memset(src_memory, 0xAB, buffer_size);
204+
memset(dst_memory, 0, size);
205+
206+
auto module = lzt::create_module(device, "copy_module.spv");
207+
auto kernel = lzt::create_function(module, "copy_data");
208+
209+
uint32_t offset = 0;
210+
lzt::set_group_size(kernel, 1, 1, 1);
211+
lzt::set_argument_value(kernel, 0, sizeof(src_memory), &src_memory);
212+
lzt::set_argument_value(kernel, 1, sizeof(dst_memory), &dst_memory);
213+
lzt::set_argument_value(kernel, 2, sizeof(offset), &offset);
214+
lzt::set_argument_value(kernel, 3, sizeof(size), &size);
215+
216+
if (use_madvise_for_src) {
217+
lzt::append_memory_advise(cmd_bundle.list, remote_device, src_memory,
218+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
219+
}
220+
if (use_madvise_for_dst) {
221+
lzt::append_memory_advise(cmd_bundle.list, remote_device, dst_memory,
222+
size, ZE_MEMORY_ADVICE_SET_PREFERRED_LOCATION);
223+
}
224+
225+
ze_group_count_t group_count{1, 1, 1};
226+
if (use_cooperative) {
227+
lzt::append_launch_cooperative_function(
228+
cmd_bundle.list, kernel, &group_count, nullptr, 0, nullptr);
229+
} else {
230+
lzt::append_launch_function(cmd_bundle.list, kernel, &group_count,
231+
nullptr, 0, nullptr);
232+
}
233+
234+
lzt::close_command_list(cmd_bundle.list);
235+
lzt::execute_and_sync_command_bundle(cmd_bundle, UINT64_MAX);
236+
237+
int *src_memory_as_int = static_cast<int *>(src_memory);
238+
int *dst_memory_as_int = static_cast<int *>(dst_memory);
239+
for (size_t i = 0; i < size; i++) {
240+
ASSERT_EQ(src_memory_as_int[i], dst_memory_as_int[i])
241+
<< "Memory not matching at: " << i;
242+
}
243+
244+
lzt::destroy_function(kernel);
245+
lzt::destroy_module(module);
246+
lzt::aligned_free(src_memory);
247+
lzt::aligned_free(dst_memory);
248+
}
249+
250+
static constexpr size_t size = 1024;
251+
ze_device_handle_t device, remote_device;
252+
lzt::zeCommandBundle cmd_bundle;
253+
};
254+
255+
LZT_TEST_P(
256+
SharedSystemRemoteDeviceTests,
257+
GivenMultipleDevicesAndSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryFillThenIsSuccessAndValuesAreCorrect) {
258+
run_append_memory_fill_test(true);
259+
}
260+
261+
LZT_TEST_P(
262+
SharedSystemRemoteDeviceTests,
263+
GivenMultipleDevicesAndSrcSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyThenIsSuccessAndValuesAreCorrect) {
264+
run_append_memory_copy_test(true, false);
265+
}
266+
267+
LZT_TEST_P(
268+
SharedSystemRemoteDeviceTests,
269+
GivenMultipleDevicesAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyThenIsSuccessAndValuesAreCorrect) {
270+
run_append_memory_copy_test(false, true);
271+
}
272+
273+
LZT_TEST_P(
274+
SharedSystemRemoteDeviceTests,
275+
GivenMultipleDevicesAndSrcAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyThenIsSuccessAndValuesAreCorrect) {
276+
run_append_memory_copy_test(true, true);
277+
}
278+
279+
LZT_TEST_P(
280+
SharedSystemRemoteDeviceTests,
281+
GivenMultipleDevicesAndSrcSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyRegionThenIsSuccessAndValuesAreCorrect) {
282+
run_append_memory_copy_region_test(true, false);
283+
}
284+
285+
LZT_TEST_P(
286+
SharedSystemRemoteDeviceTests,
287+
GivenMultipleDevicesAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyRegionThenIsSuccessAndValuesAreCorrect) {
288+
run_append_memory_copy_region_test(false, true);
289+
}
290+
291+
LZT_TEST_P(
292+
SharedSystemRemoteDeviceTests,
293+
GivenMultipleDevicesAndSrcAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingMemoryCopyRegionThenIsSuccessAndValuesAreCorrect) {
294+
run_append_memory_copy_region_test(true, true);
295+
}
296+
297+
LZT_TEST_P(
298+
SharedSystemRemoteDeviceTests,
299+
GivenMultipleDevicesAndSrcSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingImageCopyToAndFromMemoryThenIsSuccessAndImageIsCorrect) {
300+
if (!(lzt::image_support(device))) {
301+
GTEST_SKIP() << "Test requires image support.";
302+
}
303+
run_append_memory_image_copy_test(true, false);
304+
}
305+
306+
LZT_TEST_P(
307+
SharedSystemRemoteDeviceTests,
308+
GivenMultipleDevicesAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingImageCopyToAndFromMemoryThenIsSuccessAndImageIsCorrect) {
309+
if (!(lzt::image_support(device))) {
310+
GTEST_SKIP() << "Test requires image support.";
311+
}
312+
run_append_memory_image_copy_test(false, true);
313+
}
314+
315+
LZT_TEST_P(
316+
SharedSystemRemoteDeviceTests,
317+
GivenMultipleDevicesAndSrcAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingImageCopyToAndFromMemoryThenIsSuccessAndImageIsCorrect) {
318+
if (!(lzt::image_support(device))) {
319+
GTEST_SKIP() << "Test requires image support.";
320+
}
321+
run_append_memory_image_copy_test(true, true);
322+
}
323+
324+
LZT_TEST_P(
325+
SharedSystemRemoteDeviceTests,
326+
GivenMultipleDevicesAndSrcSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingKernelCopyThenIsSuccessAndValuesAreCorrect) {
327+
run_append_launch_kernel_test(true, false, false);
328+
}
329+
330+
LZT_TEST_P(
331+
SharedSystemRemoteDeviceTests,
332+
GivenMultipleDevicesAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingKernelCopyThenIsSuccessAndValuesAreCorrect) {
333+
run_append_launch_kernel_test(false, true, false);
334+
}
335+
336+
LZT_TEST_P(
337+
SharedSystemRemoteDeviceTests,
338+
GivenMultipleDevicesAndSrcAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingKernelCopyThenIsSuccessAndValuesAreCorrect) {
339+
run_append_launch_kernel_test(true, true, false);
340+
}
341+
342+
LZT_TEST_P(
343+
SharedSystemRemoteDeviceTests,
344+
GivenMultipleDevicesAndSrcSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingCooperativeKernelCopyThenIsSuccessAndValuesAreCorrect) {
345+
run_append_launch_kernel_test(true, false, true);
346+
}
347+
348+
LZT_TEST_P(
349+
SharedSystemRemoteDeviceTests,
350+
GivenMultipleDevicesAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingCooperativeKernelCopyThenIsSuccessAndValuesAreCorrect) {
351+
run_append_launch_kernel_test(false, true, true);
352+
}
353+
354+
LZT_TEST_P(
355+
SharedSystemRemoteDeviceTests,
356+
GivenMultipleDevicesAndSrcAndDstSharedSystemMemoryAdvisedToRemoteDeviceWhenAppendingCooperativeKernelCopyThenIsSuccessAndValuesAreCorrect) {
357+
run_append_launch_kernel_test(true, true, true);
358+
}
359+
360+
INSTANTIATE_TEST_SUITE_P(SharedSystemRemoteDeviceTestParam,
361+
SharedSystemRemoteDeviceTests, ::testing::Bool());
362+
363+
} // namespace

utils/test_harness/include/test_harness/test_harness_image.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ const std::vector<ze_image_format_swizzle_t> image_format_swizzles_all = {
102102

103103
size_t get_format_component_count(ze_image_format_layout_t layout);
104104
bool image_support();
105+
bool image_support(ze_device_handle_t device);
105106
void print_image_format_descriptor(const ze_image_format_t descriptor);
106107
void print_image_descriptor(const ze_image_desc_t descriptor);
107108
void print_image_descriptor_unsupported(const ze_image_desc_t descriptor);

0 commit comments

Comments
 (0)