aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/test/worksharing/for/omp_monotonic_env.c
diff options
context:
space:
mode:
Diffstat (limited to 'final/runtime/test/worksharing/for/omp_monotonic_env.c')
-rw-r--r--final/runtime/test/worksharing/for/omp_monotonic_env.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/final/runtime/test/worksharing/for/omp_monotonic_env.c b/final/runtime/test/worksharing/for/omp_monotonic_env.c
new file mode 100644
index 0000000..c8cfd2a
--- /dev/null
+++ b/final/runtime/test/worksharing/for/omp_monotonic_env.c
@@ -0,0 +1,86 @@
+// RUN: %libomp-compile
+// RUN: env OMP_SCHEDULE=monotonic:dynamic,50 %libomp-run monotonic dynamic 50
+// RUN: env OMP_SCHEDULE=monotonic:guided,51 %libomp-run monotonic guided 51
+// RUN: env OMP_SCHEDULE=monotonic:static,52 %libomp-run monotonic static 52
+// RUN: env OMP_SCHEDULE=nonmonotonic:dynamic,53 %libomp-run nonmonotonic dynamic 53
+// RUN: env OMP_SCHEDULE=nonmonotonic:guided,54 %libomp-run nonmonotonic guided 54
+
+// The test checks OMP 5.0 monotonic/nonmonotonic OMP_SCHEDULE parsing
+// The nonmonotonic tests see if the parser accepts nonmonotonic, if the
+// parser doesn't then a static schedule is assumed
+
+#include <stdio.h>
+#include <string.h>
+#include <omp.h>
+
+int err = 0;
+
+omp_sched_t sched_without_modifiers(omp_sched_t sched) {
+ return (omp_sched_t)((int)sched & ~((int)omp_sched_monotonic));
+}
+
+int sched_has_modifiers(omp_sched_t sched, omp_sched_t modifiers) {
+ return (int)sched & (int)modifiers;
+}
+
+// check that sched = hope | modifiers
+void check_schedule(const char *extra, const omp_sched_t sched, int chunk,
+ omp_sched_t hope_sched, int hope_chunk) {
+
+ if (sched != hope_sched || chunk != hope_chunk) {
+ ++err;
+ printf("Error: %s: schedule: (%d, %d) is not equal to (%d, %d)\n", extra,
+ (int)hope_sched, hope_chunk, (int)sched, chunk);
+ }
+}
+
+omp_sched_t str2omp_sched(const char *str) {
+ if (!strcmp(str, "dynamic"))
+ return omp_sched_dynamic;
+ if (!strcmp(str, "static"))
+ return omp_sched_static;
+ if (!strcmp(str, "guided"))
+ return omp_sched_guided;
+ printf("Error: Unknown schedule type: %s\n", str);
+ exit(1);
+}
+
+int is_monotonic(const char *str) { return !strcmp(str, "monotonic"); }
+
+int main(int argc, char **argv) {
+ int i, monotonic, chunk, ref_chunk;
+ omp_sched_t sched, ref_sched;
+
+ if (argc != 4) {
+ printf("Error: usage: <executable> monotonic|nonmonotonic <schedule> "
+ "<chunk-size>\n");
+ exit(1);
+ }
+
+ monotonic = is_monotonic(argv[1]);
+ ref_sched = str2omp_sched(argv[2]);
+ ref_chunk = atoi(argv[3]);
+
+ omp_get_schedule(&sched, &chunk);
+
+ if (monotonic && !sched_has_modifiers(sched, omp_sched_monotonic)) {
+ printf("Error: sched (0x%x) does not have monotonic modifier\n",
+ (int)sched);
+ ++err;
+ }
+ sched = sched_without_modifiers(sched);
+ if (sched != ref_sched) {
+ printf("Error: sched (0x%x) is not 0x%x\n", (int)sched, (int)ref_sched);
+ ++err;
+ }
+ if (chunk != ref_chunk) {
+ printf("Error: chunk is not %d\n", ref_chunk);
+ ++err;
+ }
+ if (err > 0) {
+ printf("Failed\n");
+ return 1;
+ }
+ printf("Passed\n");
+ return 0;
+}