xref: /llvm-project/offload/test/offloading/schedule.c (revision 1a0cf245ac86c2f35c89cab47f83e9b474032e41)
11a478a69SGheorghe-Teodor Bercea // clang-format off
21a478a69SGheorghe-Teodor Bercea // RUN: %libomptarget-compile-generic && %libomptarget-run-generic 2>&1 | %fcheck-generic
31a478a69SGheorghe-Teodor Bercea // clang-format on
41a478a69SGheorghe-Teodor Bercea 
51a478a69SGheorghe-Teodor Bercea // UNSUPPORTED: aarch64-unknown-linux-gnu
61a478a69SGheorghe-Teodor Bercea // UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
7*1a0cf245SJan Patrick Lehr // UNSUPPORTED: x86_64-unknown-linux-gnu
8*1a0cf245SJan Patrick Lehr // UNSUPPORTED: x86_64-unknown-linux-gnu-LTO
91a478a69SGheorghe-Teodor Bercea // UNSUPPORTED: s390x-ibm-linux-gnu
101a478a69SGheorghe-Teodor Bercea // UNSUPPORTED: s390x-ibm-linux-gnu-LTO
111a478a69SGheorghe-Teodor Bercea 
121a478a69SGheorghe-Teodor Bercea // REQUIRES: amdgcn-amd-amdhsa
131a478a69SGheorghe-Teodor Bercea 
141a478a69SGheorghe-Teodor Bercea #include <omp.h>
151a478a69SGheorghe-Teodor Bercea #include <stdio.h>
161a478a69SGheorghe-Teodor Bercea #include <stdlib.h>
171a478a69SGheorghe-Teodor Bercea 
181a478a69SGheorghe-Teodor Bercea int ordered_example(int lb, int ub, int stride, int nteams) {
191a478a69SGheorghe-Teodor Bercea   int i;
201a478a69SGheorghe-Teodor Bercea   int size = (ub - lb) / stride;
211a478a69SGheorghe-Teodor Bercea   double *output = (double *)malloc(size * sizeof(double));
221a478a69SGheorghe-Teodor Bercea 
231a478a69SGheorghe-Teodor Bercea #pragma omp target teams map(from : output[0 : size]) num_teams(nteams)        \
241a478a69SGheorghe-Teodor Bercea     thread_limit(128)
251a478a69SGheorghe-Teodor Bercea #pragma omp parallel for ordered schedule(dynamic)
261a478a69SGheorghe-Teodor Bercea   for (i = lb; i < ub; i += stride) {
271a478a69SGheorghe-Teodor Bercea #pragma omp ordered
281a478a69SGheorghe-Teodor Bercea     { output[(i - lb) / stride] = omp_get_wtime(); }
291a478a69SGheorghe-Teodor Bercea   }
301a478a69SGheorghe-Teodor Bercea 
311a478a69SGheorghe-Teodor Bercea   // verification
321a478a69SGheorghe-Teodor Bercea   for (int j = 0; j < size; j++) {
331a478a69SGheorghe-Teodor Bercea     for (int jj = j + 1; jj < size; jj++) {
341a478a69SGheorghe-Teodor Bercea       if (output[j] > output[jj]) {
351a478a69SGheorghe-Teodor Bercea         printf("Fail to schedule in order.\n");
361a478a69SGheorghe-Teodor Bercea         free(output);
371a478a69SGheorghe-Teodor Bercea         return 1;
381a478a69SGheorghe-Teodor Bercea       }
391a478a69SGheorghe-Teodor Bercea     }
401a478a69SGheorghe-Teodor Bercea   }
411a478a69SGheorghe-Teodor Bercea 
421a478a69SGheorghe-Teodor Bercea   free(output);
431a478a69SGheorghe-Teodor Bercea 
441a478a69SGheorghe-Teodor Bercea   printf("test ordered OK\n");
451a478a69SGheorghe-Teodor Bercea 
461a478a69SGheorghe-Teodor Bercea   return 0;
471a478a69SGheorghe-Teodor Bercea }
481a478a69SGheorghe-Teodor Bercea 
491a478a69SGheorghe-Teodor Bercea int NO_order_example(int lb, int ub, int stride, int nteams) {
501a478a69SGheorghe-Teodor Bercea   int i;
511a478a69SGheorghe-Teodor Bercea   int size = (ub - lb) / stride;
521a478a69SGheorghe-Teodor Bercea   double *output = (double *)malloc(size * sizeof(double));
531a478a69SGheorghe-Teodor Bercea 
541a478a69SGheorghe-Teodor Bercea #pragma omp target teams map(from : output[0 : size]) num_teams(nteams)        \
551a478a69SGheorghe-Teodor Bercea     thread_limit(128)
561a478a69SGheorghe-Teodor Bercea #pragma omp parallel for schedule(dynamic)
571a478a69SGheorghe-Teodor Bercea   for (i = lb; i < ub; i += stride) {
581a478a69SGheorghe-Teodor Bercea     output[(i - lb) / stride] = omp_get_wtime();
591a478a69SGheorghe-Teodor Bercea   }
601a478a69SGheorghe-Teodor Bercea 
611a478a69SGheorghe-Teodor Bercea   // verification
621a478a69SGheorghe-Teodor Bercea   for (int j = 0; j < size; j++) {
631a478a69SGheorghe-Teodor Bercea     for (int jj = j + 1; jj < size; jj++) {
641a478a69SGheorghe-Teodor Bercea       if (output[j] > output[jj]) {
651a478a69SGheorghe-Teodor Bercea         printf("Fail to schedule in order.\n");
661a478a69SGheorghe-Teodor Bercea         free(output);
671a478a69SGheorghe-Teodor Bercea         return 1;
681a478a69SGheorghe-Teodor Bercea       }
691a478a69SGheorghe-Teodor Bercea     }
701a478a69SGheorghe-Teodor Bercea   }
711a478a69SGheorghe-Teodor Bercea 
721a478a69SGheorghe-Teodor Bercea   free(output);
731a478a69SGheorghe-Teodor Bercea 
741a478a69SGheorghe-Teodor Bercea   printf("test no order OK\n");
751a478a69SGheorghe-Teodor Bercea 
761a478a69SGheorghe-Teodor Bercea   return 0;
771a478a69SGheorghe-Teodor Bercea }
781a478a69SGheorghe-Teodor Bercea 
791a478a69SGheorghe-Teodor Bercea int main() {
801a478a69SGheorghe-Teodor Bercea   // CHECK: test no order OK
811a478a69SGheorghe-Teodor Bercea   NO_order_example(0, 10, 1, 8);
821a478a69SGheorghe-Teodor Bercea   // CHECK: test ordered OK
831a478a69SGheorghe-Teodor Bercea   return ordered_example(0, 10, 1, 8);
841a478a69SGheorghe-Teodor Bercea }
85