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