|
14 | 14 |
|
15 | 15 | using namespace cl::sycl;
|
16 | 16 |
|
17 |
| -int main() { |
| 17 | +int multidevice_test(queue MyQueue1, queue MyQueue2) { |
18 | 18 | const size_t N = 100;
|
19 |
| - { |
20 |
| - host_selector HOSTSelector; |
21 |
| - queue MyQueue1(HOSTSelector); |
22 |
| - queue MyQueue2(HOSTSelector); |
23 |
| - try { |
24 |
| - cpu_selector CPUSelector; |
25 |
| - MyQueue2 = queue(CPUSelector); |
26 |
| - } catch (cl::sycl::invalid_parameter_error &) { |
27 |
| - std::cout << "Using 2 host devices." << std::endl; |
28 |
| - } |
29 | 19 |
|
30 |
| - buffer<int, 1> BufA(range<1>{N}); |
31 |
| - buffer<int, 1> BufB(range<1>{N}); |
32 |
| - buffer<int, 1> BufC(range<1>{N}); |
33 |
| - buffer<int, 1> BufD(range<1>{N}); |
| 20 | + buffer<int, 1> BufA(range<1>{N}); |
| 21 | + buffer<int, 1> BufB(range<1>{N}); |
| 22 | + buffer<int, 1> BufC(range<1>{N}); |
| 23 | + buffer<int, 1> BufD(range<1>{N}); |
34 | 24 |
|
35 |
| - MyQueue1.submit([&](handler &cgh) { |
36 |
| - auto A = BufA.get_access<access::mode::write>(cgh); |
37 |
| - cgh.parallel_for<class init_a>( |
38 |
| - range<1>{N}, [=](id<1> index) { A[index[0]] = index[0]; }); |
39 |
| - }); |
| 25 | + MyQueue1.submit([&](handler &cgh) { |
| 26 | + auto A = BufA.get_access<access::mode::write>(cgh); |
| 27 | + cgh.parallel_for<class init_a>( |
| 28 | + range<1>{N}, [=](id<1> index) { A[index[0]] = index[0]; }); |
| 29 | + }); |
40 | 30 |
|
41 |
| - MyQueue2.submit([&](handler &cgh) { |
42 |
| - auto B = BufB.get_access<access::mode::write>(cgh); |
43 |
| - cgh.parallel_for<class init_b>( |
44 |
| - range<1>{N}, [=](id<1> index) { B[index[0]] = N - index[0]; }); |
45 |
| - }); |
| 31 | + MyQueue2.submit([&](handler &cgh) { |
| 32 | + auto B = BufB.get_access<access::mode::write>(cgh); |
| 33 | + cgh.parallel_for<class init_b>( |
| 34 | + range<1>{N}, [=](id<1> index) { B[index[0]] = N - index[0]; }); |
| 35 | + }); |
46 | 36 |
|
47 |
| - MyQueue2.submit([&](handler& cgh) { |
48 |
| - auto A = BufA.get_access<access::mode::read>(cgh); |
49 |
| - auto B = BufB.get_access<access::mode::read_write>(cgh); |
50 |
| - auto C = BufC.get_access<access::mode::write>(cgh); |
51 |
| - cgh.parallel_for<class op1>(range<1>{N}, [=](id<1> index) { |
52 |
| - B[index[0]] = B[index[0]] + A[index[0]]; |
53 |
| - C[index[0]] = B[index[0]] - index[0]; |
54 |
| - }); |
| 37 | + MyQueue2.submit([&](handler& cgh) { |
| 38 | + auto A = BufA.get_access<access::mode::read>(cgh); |
| 39 | + auto B = BufB.get_access<access::mode::read_write>(cgh); |
| 40 | + auto C = BufC.get_access<access::mode::write>(cgh); |
| 41 | + cgh.parallel_for<class op1>(range<1>{N}, [=](id<1> index) { |
| 42 | + B[index[0]] = B[index[0]] + A[index[0]]; |
| 43 | + C[index[0]] = B[index[0]] - index[0]; |
55 | 44 | });
|
| 45 | + }); |
56 | 46 |
|
57 |
| - MyQueue2.submit([&](handler &cgh) { |
58 |
| - auto D = BufD.get_access<access::mode::write>(cgh); |
59 |
| - cgh.parallel_for<class init_d>(range<1>{N}, |
60 |
| - [=](id<1> index) { D[index[0]] = 1; }); |
61 |
| - }); |
| 47 | + MyQueue2.submit([&](handler &cgh) { |
| 48 | + auto D = BufD.get_access<access::mode::write>(cgh); |
| 49 | + cgh.parallel_for<class init_d>(range<1>{N}, |
| 50 | + [=](id<1> index) { D[index[0]] = 1; }); |
| 51 | + }); |
62 | 52 |
|
63 |
| - MyQueue1.submit([&](handler& cgh) { |
64 |
| - auto B = BufB.get_access<access::mode::read>(cgh); |
65 |
| - auto C = BufC.get_access<access::mode::read>(cgh); |
66 |
| - auto D = BufD.get_access<access::mode::read_write>(cgh); |
67 |
| - cgh.parallel_for<class op2>(range<1>{N}, [=](id<1> index) { |
68 |
| - D[index[0]] = D[index[0]] + B[index[0]] - C[index[0]]; |
69 |
| - }); |
| 53 | + MyQueue1.submit([&](handler& cgh) { |
| 54 | + auto B = BufB.get_access<access::mode::read>(cgh); |
| 55 | + auto C = BufC.get_access<access::mode::read>(cgh); |
| 56 | + auto D = BufD.get_access<access::mode::read_write>(cgh); |
| 57 | + cgh.parallel_for<class op2>(range<1>{N}, [=](id<1> index) { |
| 58 | + D[index[0]] = D[index[0]] + B[index[0]] - C[index[0]]; |
70 | 59 | });
|
| 60 | + }); |
| 61 | + |
| 62 | + auto FinalD = BufD.get_access<access::mode::read>(); |
| 63 | + std::cout << "Result:" << std::endl; |
| 64 | + for (size_t i = 0; i < N; i++) { |
| 65 | + |
| 66 | + // A[index[0]] = index[0]; |
| 67 | + int A = i; |
| 68 | + // B[index[0]] = N - index[0]; |
| 69 | + int B = N - i; |
| 70 | + // B[index[0]] = B[index[0]] + A[index[0]]; |
| 71 | + B = B + A; |
| 72 | + // C[index[0]] = B[index[0]] - index[0]; |
| 73 | + int C = B - i; |
| 74 | + // D[index[0]] = 1; |
| 75 | + int D = 1; |
| 76 | + // D[index[0]] = D[index[0]] + B[index[0]] - C[index[0]]; |
| 77 | + D = D + B - C; |
71 | 78 |
|
72 |
| - auto FinalD = BufD.get_access<access::mode::read>(); |
73 |
| - std::cout << "Result:" << std::endl; |
74 |
| - for (size_t i = 0; i < N; i++) { |
75 |
| - |
76 |
| - // A[index[0]] = index[0]; |
77 |
| - int A = i; |
78 |
| - // B[index[0]] = N - index[0]; |
79 |
| - int B = N - i; |
80 |
| - // B[index[0]] = B[index[0]] + A[index[0]]; |
81 |
| - B = B + A; |
82 |
| - // C[index[0]] = B[index[0]] - index[0]; |
83 |
| - int C = B - i; |
84 |
| - // D[index[0]] = 1; |
85 |
| - int D = 1; |
86 |
| - // D[index[0]] = D[index[0]] + B[index[0]] - C[index[0]]; |
87 |
| - D = D + B - C; |
88 |
| - |
89 |
| - int Expected = D; |
90 |
| - |
91 |
| - if (FinalD[i] != D) { |
92 |
| - std::cout << "Wrong value for element " << i |
93 |
| - << " Expected: " << Expected << " Got: " << FinalD[i] |
94 |
| - << std::endl; |
95 |
| - return -1; |
96 |
| - } |
| 79 | + int Expected = D; |
| 80 | + |
| 81 | + if (FinalD[i] != D) { |
| 82 | + std::cout << "Wrong value for element " << i |
| 83 | + << " Expected: " << Expected << " Got: " << FinalD[i] |
| 84 | + << std::endl; |
| 85 | + return -1; |
97 | 86 | }
|
98 | 87 | }
|
99 | 88 |
|
100 | 89 | std::cout << "Good computation!" << std::endl;
|
101 | 90 | return 0;
|
102 | 91 | }
|
| 92 | + |
| 93 | +int main() { |
| 94 | + host_selector HOSTSelector; |
| 95 | + queue MyQueue1(HOSTSelector); |
| 96 | + queue MyQueue2(HOSTSelector); |
| 97 | + int Result = -1; |
| 98 | + try { |
| 99 | + cpu_selector CPUSelector; |
| 100 | + MyQueue1 = queue(CPUSelector); |
| 101 | + Result = multidevice_test(MyQueue1, MyQueue2); |
| 102 | + MyQueue2 = queue(CPUSelector); |
| 103 | + Result |= multidevice_test(MyQueue1, MyQueue2); |
| 104 | + } catch (cl::sycl::invalid_parameter_error &) { |
| 105 | + std::cout << "Using 2 host devices." << std::endl; |
| 106 | + } |
| 107 | + |
| 108 | + return Result; |
| 109 | +} |
0 commit comments