1*24f836e8SJoachim Protze // RUN: %libomptarget-compile-generic && env LIBOMPTARGET_DEBUG=1 %libomptarget-run-generic 2>&1 | %fcheck-generic -allow-empty -check-prefix=DEBUG
27036fe8aScchen // REQUIRES: libomptarget-debug
37036fe8aScchen
47036fe8aScchen #include <cstdio>
57036fe8aScchen #include <cstdlib>
67036fe8aScchen #include <cassert>
77036fe8aScchen
87036fe8aScchen // Data structure definitions copied from OpenMP RTL.
97036fe8aScchen struct __tgt_target_non_contig {
107036fe8aScchen int64_t offset;
117036fe8aScchen int64_t width;
127036fe8aScchen int64_t stride;
137036fe8aScchen };
147036fe8aScchen
157036fe8aScchen enum tgt_map_type {
167036fe8aScchen OMP_TGT_MAPTYPE_NON_CONTIG = 0x100000000000
177036fe8aScchen };
187036fe8aScchen
197036fe8aScchen // OpenMP RTL interfaces
207036fe8aScchen #ifdef __cplusplus
217036fe8aScchen extern "C" {
227036fe8aScchen #endif
237036fe8aScchen void __tgt_target_data_update(int64_t device_id, int32_t arg_num,
247036fe8aScchen void **args_base, void **args, int64_t *arg_sizes,
257036fe8aScchen int64_t *arg_types);
267036fe8aScchen #ifdef __cplusplus
277036fe8aScchen }
287036fe8aScchen #endif
297036fe8aScchen
main()307036fe8aScchen int main() {
317036fe8aScchen // case 1
327036fe8aScchen // int arr[3][4][5][6];
337036fe8aScchen // #pragma omp target update to(arr[0:2][1:3][1:2][:])
347036fe8aScchen // set up descriptor
357036fe8aScchen __tgt_target_non_contig non_contig[5] = {
367036fe8aScchen {0, 2, 480}, {1, 3, 120}, {1, 2, 24}, {0, 6, 4}, {0, 1, 4}};
377036fe8aScchen int64_t size = 4, type = OMP_TGT_MAPTYPE_NON_CONTIG;
387036fe8aScchen
397036fe8aScchen void *base;
407036fe8aScchen void *begin = &non_contig;
417036fe8aScchen int64_t *sizes = &size;
427036fe8aScchen int64_t *types = &type;
437036fe8aScchen
447036fe8aScchen // The below diagram is the visualization of the non-contiguous transfer after
457036fe8aScchen // optimization. Note that each element represent the innermost dimension
467036fe8aScchen // (unit size = 24) since the stride * count of last dimension is equal to the
477036fe8aScchen // stride of second last dimension.
487036fe8aScchen //
497036fe8aScchen // OOOOO OOOOO OOOOO
507036fe8aScchen // OXXOO OXXOO OOOOO
517036fe8aScchen // OXXOO OXXOO OOOOO
527036fe8aScchen // OXXOO OXXOO OOOOO
537036fe8aScchen __tgt_target_data_update(/*device_id*/ -1, /*arg_num*/ 1, &base, &begin,
547036fe8aScchen sizes, types);
557036fe8aScchen // DEBUG: offset 144
567036fe8aScchen // DEBUG: offset 264
577036fe8aScchen // DEBUG: offset 384
587036fe8aScchen // DEBUG: offset 624
597036fe8aScchen // DEBUG: offset 744
607036fe8aScchen // DEBUG: offset 864
617036fe8aScchen
627036fe8aScchen // case 2
637036fe8aScchen // double darr[3][4][5];
647036fe8aScchen // #pragma omp target update to(darr[0:2:2][2:2][:2:2])
657036fe8aScchen // set up descriptor
667036fe8aScchen __tgt_target_non_contig non_contig_2[4] = {
677036fe8aScchen {0, 2, 320}, {2, 2, 40}, {0, 2, 16}, {0, 1, 8}};
687036fe8aScchen int64_t size_2 = 4, type_2 = OMP_TGT_MAPTYPE_NON_CONTIG;
697036fe8aScchen
707036fe8aScchen void *base_2;
717036fe8aScchen void *begin_2 = &non_contig_2;
727036fe8aScchen int64_t *sizes_2 = &size_2;
737036fe8aScchen int64_t *types_2 = &type_2;
747036fe8aScchen
757036fe8aScchen // The below diagram is the visualization of the non-contiguous transfer after
767036fe8aScchen // optimization. Note that each element represent the innermost dimension
777036fe8aScchen // (unit size = 24) since the stride * count of last dimension is equal to the
787036fe8aScchen // stride of second last dimension.
797036fe8aScchen //
807036fe8aScchen // OOOOO OOOOO OOOOO
817036fe8aScchen // OOOOO OOOOO OOOOO
827036fe8aScchen // XOXOO OOOOO XOXOO
837036fe8aScchen // XOXOO OOOOO XOXOO
847036fe8aScchen __tgt_target_data_update(/*device_id*/ -1, /*arg_num*/ 1, &base_2, &begin_2,
857036fe8aScchen sizes_2, types_2);
867036fe8aScchen // DEBUG: offset 80
877036fe8aScchen // DEBUG: offset 96
887036fe8aScchen // DEBUG: offset 120
897036fe8aScchen // DEBUG: offset 136
907036fe8aScchen // DEBUG: offset 400
917036fe8aScchen // DEBUG: offset 416
927036fe8aScchen // DEBUG: offset 440
937036fe8aScchen // DEBUG: offset 456
947036fe8aScchen return 0;
957036fe8aScchen }
967036fe8aScchen
97