aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/test/worksharing/for/omp_for_nowait.c
diff options
context:
space:
mode:
Diffstat (limited to 'final/runtime/test/worksharing/for/omp_for_nowait.c')
-rw-r--r--final/runtime/test/worksharing/for/omp_for_nowait.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/final/runtime/test/worksharing/for/omp_for_nowait.c b/final/runtime/test/worksharing/for/omp_for_nowait.c
new file mode 100644
index 0000000..95a4775
--- /dev/null
+++ b/final/runtime/test/worksharing/for/omp_for_nowait.c
@@ -0,0 +1,77 @@
+// RUN: %libomp-compile-and-run
+#include <stdio.h>
+#include "omp_testsuite.h"
+
+/*
+ * This test will hang if the nowait is not working properly.
+ *
+ * It relies on a thread skipping to the second for construct to
+ * release the threads in the first for construct.
+ *
+ * Also, we use static scheduling to guarantee that one
+ * thread will make it to the second for construct.
+ */
+volatile int release;
+volatile int count;
+
+void wait_for_release_then_increment(int rank)
+{
+ fprintf(stderr, "Thread nr %d enters first for construct"
+ " and waits.\n", rank);
+ while (release == 0);
+ #pragma omp atomic
+ count++;
+}
+
+void release_and_increment(int rank)
+{
+ fprintf(stderr, "Thread nr %d sets release to 1\n", rank);
+ release = 1;
+ #pragma omp atomic
+ count++;
+}
+
+int test_omp_for_nowait()
+{
+ release = 0;
+ count = 0;
+
+ #pragma omp parallel num_threads(4)
+ {
+ int rank;
+ int i;
+
+ rank = omp_get_thread_num();
+
+ #pragma omp for schedule(static) nowait
+ for (i = 0; i < 4; i++) {
+ if (i < 3)
+ wait_for_release_then_increment(rank);
+ else {
+ fprintf(stderr, "Thread nr %d enters first for and goes "
+ "immediately to the next for construct to release.\n", rank);
+ #pragma omp atomic
+ count++;
+ }
+ }
+
+ #pragma omp for schedule(static)
+ for (i = 0; i < 4; i++) {
+ release_and_increment(rank);
+ }
+ }
+ return (count==8);
+}
+
+int main()
+{
+ int i;
+ int num_failed=0;
+
+ for(i = 0; i < REPETITIONS; i++) {
+ if(!test_omp_for_nowait()) {
+ num_failed++;
+ }
+ }
+ return num_failed;
+}