@@ -194,10 +194,64 @@ void checkExceptions() {
194
194
}
195
195
}
196
196
197
+ void copyBlock () {
198
+ using typename cl::sycl::access::mode;
199
+ using buffer = cl::sycl::buffer<int , 1 >;
200
+
201
+ auto CopyF = [](buffer& Buffer, buffer& Block, size_t Idx, size_t BlockSize) {
202
+ auto Subbuf = buffer (Buffer, Idx * BlockSize, BlockSize);
203
+ auto *Src = Subbuf.get_access <mode::read>().get_pointer ();
204
+ auto *Dst = Block.get_access <mode::write>().get_pointer ();
205
+ std::copy (Src, Src + BlockSize, Dst);
206
+ };
207
+
208
+ try {
209
+ static const size_t N = 100 ;
210
+ static const size_t NBlock = 4 ;
211
+ static const size_t BlockSize = N / NBlock;
212
+
213
+ buffer Buffer (N);
214
+
215
+ // Init with data
216
+ {
217
+ auto *Acc = Buffer.get_access <mode::write>().get_pointer ();
218
+
219
+ for (size_t Idx = 0 ; Idx < N; Idx++) {
220
+ Acc[Idx] = Idx;
221
+ }
222
+ }
223
+
224
+ std::vector<buffer> BlockBuffers;
225
+ BlockBuffers.reserve (NBlock);
226
+
227
+ // Copy block by block
228
+ for (size_t Idx = 0 ; Idx < NBlock; Idx++) {
229
+ auto InsertedIt = BlockBuffers.emplace (BlockBuffers.end (), BlockSize);
230
+ CopyF (Buffer, *InsertedIt, Idx, BlockSize);
231
+ }
232
+
233
+ // Validate copies
234
+ for (size_t Idx = 0 ; Idx < BlockBuffers.size (); ++Idx) {
235
+ buffer &BlockB = BlockBuffers[Idx];
236
+
237
+ auto *V = BlockB.get_access <mode::read>().get_pointer ();
238
+
239
+ for (size_t Idx2 = 0 ; Idx2 < BlockSize; ++Idx2) {
240
+ assert (V[Idx2] == Idx2 + BlockSize * Idx &&
241
+ " Invalid data in block buffer" );
242
+ }
243
+ }
244
+ }
245
+ catch (cl::sycl::exception& ex) {
246
+ assert (false && " Unexpected exception captured!" );
247
+ }
248
+ }
249
+
197
250
int main () {
198
251
cl::sycl::queue q;
199
252
check1DSubBuffer (q);
200
253
checkHostAccessor (q);
201
254
checkExceptions ();
255
+ copyBlock ();
202
256
return 0 ;
203
257
}
0 commit comments