aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/test/tasking/omp_taskloop_num_tasks.c
diff options
context:
space:
mode:
Diffstat (limited to 'final/runtime/test/tasking/omp_taskloop_num_tasks.c')
-rw-r--r--final/runtime/test/tasking/omp_taskloop_num_tasks.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/final/runtime/test/tasking/omp_taskloop_num_tasks.c b/final/runtime/test/tasking/omp_taskloop_num_tasks.c
new file mode 100644
index 0000000..75efea6
--- /dev/null
+++ b/final/runtime/test/tasking/omp_taskloop_num_tasks.c
@@ -0,0 +1,72 @@
+// RUN: %libomp-compile-and-run
+// RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run
+// REQUIRES: openmp-4.5
+
+// These compilers don't support the taskloop construct
+// UNSUPPORTED: gcc-4, gcc-5, icc-16
+
+/*
+ * Test for taskloop
+ * Method: caculate how many times the iteration space is dispatched
+ * and judge if each dispatch has the requested grainsize
+ * It is possible for two adjacent chunks are executed by the same thread
+ */
+#include <stdio.h>
+#include <omp.h>
+#include <stdlib.h>
+#include "omp_testsuite.h"
+
+#define CFDMAX_SIZE 1120
+
+int test_omp_taskloop_num_tasks()
+{
+ int i;
+ int *tids;
+ int *tidsArray;
+ int count;
+ int result = 0;
+ int num_tasks;
+
+ for (num_tasks = 1; num_tasks < 120; ++num_tasks) {
+ count = 0;
+ tidsArray = (int *)malloc(sizeof(int) * CFDMAX_SIZE);
+ tids = tidsArray;
+
+ #pragma omp parallel shared(tids)
+ {
+ int i;
+ #pragma omp master
+ #pragma omp taskloop num_tasks(num_tasks)
+ for (i = 0; i < CFDMAX_SIZE; i++) {
+ tids[i] = omp_get_thread_num();
+ }
+ }
+
+ for (i = 0; i < CFDMAX_SIZE - 1; ++i) {
+ if (tids[i] != tids[i + 1]) {
+ count++;
+ }
+ }
+
+ if (count > num_tasks) {
+ fprintf(stderr, "counted too many tasks: (wanted %d, got %d)\n",
+ num_tasks, count);
+ result++;
+ }
+ }
+
+ return (result==0);
+}
+
+int main()
+{
+ int i;
+ int num_failed=0;
+
+ for (i = 0; i < REPETITIONS; i++) {
+ if (!test_omp_taskloop_num_tasks()) {
+ num_failed++;
+ }
+ }
+ return num_failed;
+}