forked from intel/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompile_link.cpp
36 lines (31 loc) · 1.26 KB
/
compile_link.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// REQUIRES: gpu && linux && (opencl || level_zero) && multi-device-emulation
// RUN: %{build} -o %t.out
// RUN: env NEOReadDebugKeys=1 CreateMultipleRootDevices=3 %{run} %t.out
// Test to check that we can compile and link a kernel bundle for multiple
// devices and run the kernel on each device.
#include <sycl/detail/core.hpp>
#include <sycl/kernel_bundle.hpp>
class Kernel;
int main() {
sycl::platform platform;
auto devices = platform.get_devices();
if (!(devices.size() >= 3))
return 0;
auto dev1 = devices[0], dev2 = devices[1], dev3 = devices[2];
auto ctx = sycl::context({dev1, dev2, dev3});
sycl::queue queues[3] = {sycl::queue(ctx, dev1), sycl::queue(ctx, dev2),
sycl::queue(ctx, dev3)};
sycl::kernel_id kid = sycl::get_kernel_id<Kernel>();
sycl::kernel_bundle kernelBundleInput =
sycl::get_kernel_bundle<sycl::bundle_state::input>(ctx, {kid});
auto KernelBundleCompiled = compile(kernelBundleInput, {dev1, dev2, dev3});
auto KernelBundleLinked = link(KernelBundleCompiled, {dev1, dev2, dev3});
for (int i = 0; i < 3; i++) {
queues[i].submit([=](sycl::handler &cgh) {
cgh.use_kernel_bundle(KernelBundleLinked);
cgh.single_task<Kernel>([=]() {});
});
queues[i].wait();
}
return 0;
}