Skip to content

Commit 23b7f5e

Browse files
MrSidimsbader
authored andcommitted
[SYCL] Refactor MultipleDevices test
Previous scenario: data was transferred from host and cpu devices Added new scenatio: data is transferred between two cpu devices. Signed-off-by: Dmitry Sidorov <[email protected]>
1 parent d9dd93a commit 23b7f5e

File tree

1 file changed

+77
-70
lines changed

1 file changed

+77
-70
lines changed

sycl/test/scheduler/MultipleDevices.cpp

Lines changed: 77 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,89 +14,96 @@
1414

1515
using namespace cl::sycl;
1616

17-
int main() {
17+
int multidevice_test(queue MyQueue1, queue MyQueue2) {
1818
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-
}
2919

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});
3424

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+
});
4030

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+
});
4636

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];
5544
});
45+
});
5646

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+
});
6252

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]];
7059
});
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;
7178

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;
9786
}
9887
}
9988

10089
std::cout << "Good computation!" << std::endl;
10190
return 0;
10291
}
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

Comments
 (0)