1// RUN: %libomp-compile
2// RUN: env OMP_SCHEDULE=monotonic:dynamic,50 %libomp-run monotonic dynamic 50
3// RUN: env OMP_SCHEDULE=monotonic:guided,51 %libomp-run monotonic guided 51
4// RUN: env OMP_SCHEDULE=monotonic:static,52 %libomp-run monotonic static 52
5// RUN: env OMP_SCHEDULE=nonmonotonic:dynamic,53 %libomp-run nonmonotonic dynamic 53
6// RUN: env OMP_SCHEDULE=nonmonotonic:guided,54 %libomp-run nonmonotonic guided 54
7
8// The test checks OMP 5.0 monotonic/nonmonotonic OMP_SCHEDULE parsing
9// The nonmonotonic tests see if the parser accepts nonmonotonic, if the
10// parser doesn't then a static schedule is assumed
11
12#include <stdio.h>
13#include <string.h>
14#include <omp.h>
15
16int err = 0;
17
18omp_sched_t sched_without_modifiers(omp_sched_t sched) {
19 return (omp_sched_t)((int)sched & ~((int)omp_sched_monotonic));
20}
21
22int sched_has_modifiers(omp_sched_t sched, omp_sched_t modifiers) {
23 return (int)sched & (int)modifiers;
24}
25
26// check that sched = hope | modifiers
27void check_schedule(const char *extra, const omp_sched_t sched, int chunk,
28 omp_sched_t hope_sched, int hope_chunk) {
29
30 if (sched != hope_sched || chunk != hope_chunk) {
31 ++err;
32 printf(format: "Error: %s: schedule: (%d, %d) is not equal to (%d, %d)\n", extra,
33 (int)hope_sched, hope_chunk, (int)sched, chunk);
34 }
35}
36
37omp_sched_t str2omp_sched(const char *str) {
38 if (!strcmp(s1: str, s2: "dynamic"))
39 return omp_sched_dynamic;
40 if (!strcmp(s1: str, s2: "static"))
41 return omp_sched_static;
42 if (!strcmp(s1: str, s2: "guided"))
43 return omp_sched_guided;
44 printf(format: "Error: Unknown schedule type: %s\n", str);
45 exit(status: 1);
46}
47
48int is_monotonic(const char *str) { return !strcmp(s1: str, s2: "monotonic"); }
49
50int main(int argc, char **argv) {
51 int i, monotonic, chunk, ref_chunk;
52 omp_sched_t sched, ref_sched;
53
54 if (argc != 4) {
55 printf(format: "Error: usage: <executable> monotonic|nonmonotonic <schedule> "
56 "<chunk-size>\n");
57 exit(status: 1);
58 }
59
60 monotonic = is_monotonic(str: argv[1]);
61 ref_sched = str2omp_sched(str: argv[2]);
62 ref_chunk = atoi(nptr: argv[3]);
63
64 omp_get_schedule(&sched, &chunk);
65
66 if (monotonic && !sched_has_modifiers(sched, modifiers: omp_sched_monotonic)) {
67 printf(format: "Error: sched (0x%x) does not have monotonic modifier\n",
68 (int)sched);
69 ++err;
70 }
71 sched = sched_without_modifiers(sched);
72 if (sched != ref_sched) {
73 printf(format: "Error: sched (0x%x) is not 0x%x\n", (int)sched, (int)ref_sched);
74 ++err;
75 }
76 if (chunk != ref_chunk) {
77 printf(format: "Error: chunk is not %d\n", ref_chunk);
78 ++err;
79 }
80 if (err > 0) {
81 printf(format: "Failed\n");
82 return 1;
83 }
84 printf(format: "Passed\n");
85 return 0;
86}
87

source code of openmp/runtime/test/worksharing/for/omp_monotonic_env.c