1// clang-format off
2// RUN: %libomptarget-compile-generic && %libomptarget-run-generic 2>&1 | %fcheck-generic
3// clang-format on
4
5// UNSUPPORTED: aarch64-unknown-linux-gnu
6// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
7// UNSUPPORTED: x86_64-unknown-linux-gnu
8// UNSUPPORTED: x86_64-unknown-linux-gnu-LTO
9// UNSUPPORTED: s390x-ibm-linux-gnu
10// UNSUPPORTED: s390x-ibm-linux-gnu-LTO
11
12// REQUIRES: amdgcn-amd-amdhsa
13
14#include <omp.h>
15#include <stdio.h>
16#include <stdlib.h>
17
18int ordered_example(int lb, int ub, int stride, int nteams) {
19 int i;
20 int size = (ub - lb) / stride;
21 double *output = (double *)malloc(size: size * sizeof(double));
22
23#pragma omp target teams map(from : output[0 : size]) num_teams(nteams) \
24 thread_limit(128)
25#pragma omp parallel for ordered schedule(dynamic)
26 for (i = lb; i < ub; i += stride) {
27#pragma omp ordered
28 { output[(i - lb) / stride] = omp_get_wtime(); }
29 }
30
31 // verification
32 for (int j = 0; j < size; j++) {
33 for (int jj = j + 1; jj < size; jj++) {
34 if (output[j] > output[jj]) {
35 printf(format: "Fail to schedule in order.\n");
36 free(ptr: output);
37 return 1;
38 }
39 }
40 }
41
42 free(ptr: output);
43
44 printf(format: "test ordered OK\n");
45
46 return 0;
47}
48
49int NO_order_example(int lb, int ub, int stride, int nteams) {
50 int i;
51 int size = (ub - lb) / stride;
52 double *output = (double *)malloc(size: size * sizeof(double));
53
54#pragma omp target teams map(from : output[0 : size]) num_teams(nteams) \
55 thread_limit(128)
56#pragma omp parallel for schedule(dynamic)
57 for (i = lb; i < ub; i += stride) {
58 output[(i - lb) / stride] = omp_get_wtime();
59 }
60
61 // verification
62 for (int j = 0; j < size; j++) {
63 for (int jj = j + 1; jj < size; jj++) {
64 if (output[j] > output[jj]) {
65 printf(format: "Fail to schedule in order.\n");
66 free(ptr: output);
67 return 1;
68 }
69 }
70 }
71
72 free(ptr: output);
73
74 printf(format: "test no order OK\n");
75
76 return 0;
77}
78
79int main() {
80 // CHECK: test no order OK
81 NO_order_example(lb: 0, ub: 10, stride: 1, nteams: 8);
82 // CHECK: test ordered OK
83 return ordered_example(lb: 0, ub: 10, stride: 1, nteams: 8);
84}
85

Provided by KDAB

Privacy Policy
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more

source code of offload/test/offloading/schedule.c