// clang-format off // RUN: %libomptarget-compile-generic && %libomptarget-run-generic 2>&1 | %fcheck-generic // clang-format on // UNSUPPORTED: aarch64-unknown-linux-gnu // UNSUPPORTED: aarch64-unknown-linux-gnu-LTO // UNSUPPORTED: x86_64-unknown-linux-gnu // UNSUPPORTED: x86_64-unknown-linux-gnu-LTO // UNSUPPORTED: s390x-ibm-linux-gnu // UNSUPPORTED: s390x-ibm-linux-gnu-LTO // REQUIRES: amdgcn-amd-amdhsa #include #include #include int ordered_example(int lb, int ub, int stride, int nteams) { int i; int size = (ub - lb) / stride; double *output = (double *)malloc(size * sizeof(double)); #pragma omp target teams map(from : output[0 : size]) num_teams(nteams) \ thread_limit(128) #pragma omp parallel for ordered schedule(dynamic) for (i = lb; i < ub; i += stride) { #pragma omp ordered { output[(i - lb) / stride] = omp_get_wtime(); } } // verification for (int j = 0; j < size; j++) { for (int jj = j + 1; jj < size; jj++) { if (output[j] > output[jj]) { printf("Fail to schedule in order.\n"); free(output); return 1; } } } free(output); printf("test ordered OK\n"); return 0; } int NO_order_example(int lb, int ub, int stride, int nteams) { int i; int size = (ub - lb) / stride; double *output = (double *)malloc(size * sizeof(double)); #pragma omp target teams map(from : output[0 : size]) num_teams(nteams) \ thread_limit(128) #pragma omp parallel for schedule(dynamic) for (i = lb; i < ub; i += stride) { output[(i - lb) / stride] = omp_get_wtime(); } // verification for (int j = 0; j < size; j++) { for (int jj = j + 1; jj < size; jj++) { if (output[j] > output[jj]) { printf("Fail to schedule in order.\n"); free(output); return 1; } } } free(output); printf("test no order OK\n"); return 0; } int main() { // CHECK: test no order OK NO_order_example(0, 10, 1, 8); // CHECK: test ordered OK return ordered_example(0, 10, 1, 8); }