6
6
// RUN: %GPU_RUN_PLACEHOLDER %t2.out
7
7
// RUN: %ACC_RUN_PLACEHOLDER %t2.out
8
8
9
+ // XFAIL: level0
10
+
9
11
// ==------------- buffer_full_copy.cpp - SYCL buffer basic test ------------==//
10
12
//
11
13
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
18
20
#include < cassert>
19
21
20
22
void check_copy_device_to_host (cl::sycl::queue &Queue) {
21
- const int size = 6 , offset = 2 ;
23
+ constexpr int size = 6 , offset = 2 ;
22
24
23
25
// Create 2d buffer
24
26
cl::sycl::buffer<int , 2 > simple_buffer (cl::sycl::range<2 >(size, size));
@@ -56,11 +58,11 @@ void check_copy_device_to_host(cl::sycl::queue &Queue) {
56
58
}
57
59
58
60
void check_fill (cl::sycl::queue &Queue) {
59
- const int size = 6 , offset = 2 ;
61
+ constexpr int size = 6 , offset = 2 ;
60
62
cl::sycl::buffer<float , 1 > buf_1 (size);
61
63
cl::sycl::buffer<float , 1 > buf_2 (size / 2 );
62
- std::vector <float > expected_res_1 (size) ;
63
- std::vector <float > expected_res_2 ( size / 2 ) ;
64
+ std::array <float , size > expected_res_1;
65
+ std::array <float , size / 2 > expected_res_2 ;
64
66
65
67
// fill with offset
66
68
{
@@ -86,11 +88,11 @@ void check_fill(cl::sycl::queue &Queue) {
86
88
}
87
89
88
90
void check_copy_host_to_device (cl::sycl::queue &Queue) {
89
- const int size = 6 , offset = 2 ;
91
+ constexpr int size = 6 , offset = 2 ;
90
92
cl::sycl::buffer<float , 1 > buf_1 (size);
91
93
cl::sycl::buffer<float , 1 > buf_2 (size / 2 );
92
- std::vector <float > expected_res_1 (size) ;
93
- std::vector <float > expected_res_2 ( size / 2 ) ;
94
+ std::array <float , size > expected_res_1;
95
+ std::array <float , size / 2 > expected_res_2 ;
94
96
95
97
// copy acc 2 acc with offset
96
98
{
@@ -126,24 +128,23 @@ void check_copy_host_to_device(cl::sycl::queue &Queue) {
126
128
127
129
cl::sycl::buffer<float , 2 > buf_3 ({size, size});
128
130
cl::sycl::buffer<float , 2 > buf_4 ({size / 2 , size / 2 });
129
- std::vector< float > expected_res_3 ( size * size) ;
130
- std::vector< float > expected_res_4 ( size * size / 4 ) ;
131
+ std::array<std::array< float , size>, size> expected_res_3 ;
132
+ std::array<std::array< float , size / 2 >, size / 2 > expected_res_4 ;
131
133
132
134
// copy acc 2 acc with offset for 2D buffers
133
135
{
134
136
auto acc = buf_3.get_access <cl::sycl::access::mode::write>();
135
137
for (int i = 0 ; i < size; ++i) {
136
138
for (int j = 0 ; j < size; ++j) {
137
139
acc[i][j] = i * size + j + 1 ;
138
- expected_res_3[i * size + j] = i * size + j + 1 ;
140
+ expected_res_3[i][ j] = acc[i][j] ;
139
141
}
140
142
}
141
143
}
142
144
143
145
for (int i = 0 ; i < size / 2 ; ++i)
144
146
for (int j = 0 ; j < size / 2 ; ++j)
145
- expected_res_4[i * size / 2 + j] =
146
- expected_res_3[(i + offset) * size + j + offset];
147
+ expected_res_4[i][j] = expected_res_3[i + offset][j + offset];
147
148
148
149
e = Queue.submit ([&](cl::sycl::handler &cgh) {
149
150
auto a = buf_3.get_access <cl::sycl::access::mode::read>(
@@ -161,12 +162,61 @@ void check_copy_host_to_device(cl::sycl::queue &Queue) {
161
162
// check that there was no data corruption/loss
162
163
for (int i = 0 ; i < size; ++i) {
163
164
for (int j = 0 ; j < size; ++j)
164
- assert (expected_res_3[i * size + j] == acc_1[i][j]);
165
+ assert (expected_res_3[i][ j] == acc_1[i][j]);
165
166
}
166
167
167
168
for (int i = 0 ; i < size / 2 ; ++i)
168
169
for (int j = 0 ; j < size / 2 ; ++j)
169
- assert (expected_res_4[i * size / 2 + j] == acc_2[i][j]);
170
+ assert (expected_res_4[i][j] == acc_2[i][j]);
171
+ }
172
+
173
+ cl::sycl::buffer<float , 3 > buf_5 ({size, size, size});
174
+ cl::sycl::buffer<float , 3 > buf_6 ({size / 2 , size / 2 , size / 2 });
175
+ std::array<std::array<std::array<float , size>, size>, size> expected_res_5;
176
+ std::array<std::array<std::array<float , size / 2 >, size / 2 >, size / 2 > expected_res_6;
177
+
178
+ // copy acc 2 acc with offset for 3D buffers
179
+ {
180
+ auto acc = buf_5.get_access <cl::sycl::access::mode::write>();
181
+ for (int i = 0 ; i < size; ++i) {
182
+ for (int j = 0 ; j < size; ++j) {
183
+ for (int k = 0 ; k < size; ++k) {
184
+ acc[i][j][k] = (i * size * size) + (j * size) + k + 1 ;
185
+ expected_res_5[i][j][k] = (i * size * size) + (j * size) + k + 1 ;
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ for (int i = 0 ; i < size / 2 ; ++i)
192
+ for (int j = 0 ; j < size / 2 ; ++j)
193
+ for (int k = 0 ; k < size / 2 ; ++k)
194
+ expected_res_6[i][j][k] = expected_res_5[i + offset][j + offset][k + offset];
195
+
196
+ e = Queue.submit ([&](cl::sycl::handler &cgh) {
197
+ auto a = buf_5.get_access <cl::sycl::access::mode::read>(
198
+ cgh, {size / 2 , size / 2 , size / 2 }, {offset, offset, offset});
199
+ auto b = buf_6.get_access <cl::sycl::access::mode::write>(
200
+ cgh, {size / 2 , size / 2 , size / 2 });
201
+ cgh.copy (a, b);
202
+ });
203
+ e.wait ();
204
+
205
+ {
206
+ auto acc_1 = buf_5.get_access <cl::sycl::access::mode::read>();
207
+ auto acc_2 = buf_6.get_access <cl::sycl::access::mode::read>();
208
+
209
+ // check that there was no data corruption/loss
210
+ for (int i = 0 ; i < size; ++i)
211
+ for (int j = 0 ; j < size; ++j)
212
+ for (int k = 0 ; k < size; ++k)
213
+ assert (expected_res_5[i][j][k] == acc_1[i][j][k]);
214
+
215
+ for (int i = 0 ; i < size / 2 ; ++i) {
216
+ for (int j = 0 ; j < size / 2 ; ++j)
217
+ for (int k = 0 ; k < size / 2 ; ++k)
218
+ assert (expected_res_6[i][j][k] == acc_2[i][j][k]);
219
+ }
170
220
}
171
221
}
172
222
@@ -178,6 +228,7 @@ int main() {
178
228
check_fill (Queue);
179
229
} catch (cl::sycl::exception &ex) {
180
230
std::cerr << ex.what () << std::endl;
231
+ return 1 ;
181
232
}
182
233
183
234
return 0 ;
0 commit comments