xref: /llvm-project/openmp/runtime/test/worksharing/for/omp_monotonic_env.c (revision 71abe28e8152239e4e2be443497845eeb523139a)
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 
16 int err = 0;
17 
sched_without_modifiers(omp_sched_t sched)18 omp_sched_t sched_without_modifiers(omp_sched_t sched) {
19   return (omp_sched_t)((int)sched & ~((int)omp_sched_monotonic));
20 }
21 
sched_has_modifiers(omp_sched_t sched,omp_sched_t modifiers)22 int 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
check_schedule(const char * extra,const omp_sched_t sched,int chunk,omp_sched_t hope_sched,int hope_chunk)27 void 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("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 
str2omp_sched(const char * str)37 omp_sched_t str2omp_sched(const char *str) {
38   if (!strcmp(str, "dynamic"))
39     return omp_sched_dynamic;
40   if (!strcmp(str, "static"))
41     return omp_sched_static;
42   if (!strcmp(str, "guided"))
43     return omp_sched_guided;
44   printf("Error: Unknown schedule type: %s\n", str);
45   exit(1);
46 }
47 
is_monotonic(const char * str)48 int is_monotonic(const char *str) { return !strcmp(str, "monotonic"); }
49 
main(int argc,char ** argv)50 int 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("Error: usage: <executable> monotonic|nonmonotonic <schedule> "
56            "<chunk-size>\n");
57     exit(1);
58   }
59 
60   monotonic = is_monotonic(argv[1]);
61   ref_sched = str2omp_sched(argv[2]);
62   ref_chunk = atoi(argv[3]);
63 
64   omp_get_schedule(&sched, &chunk);
65 
66   if (monotonic && !sched_has_modifiers(sched, omp_sched_monotonic)) {
67     printf("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("Error: sched (0x%x) is not 0x%x\n", (int)sched, (int)ref_sched);
74     ++err;
75   }
76   if (chunk != ref_chunk) {
77     printf("Error: chunk is not %d\n", ref_chunk);
78     ++err;
79   }
80   if (err > 0) {
81     printf("Failed\n");
82     return 1;
83   }
84   printf("Passed\n");
85   return 0;
86 }
87