// RUN: %libomp-compile-and-run #include #include #include "omp_testsuite.h" #include "omp_my_sleep.h" int test_omp_taskwait() { int result1 = 0; /* Stores number of not finished tasks after the taskwait */ int result2 = 0; /* Stores number of wrong array elements at the end */ int array[NUM_TASKS]; int i; /* fill array */ for (i = 0; i < NUM_TASKS; i++) array[i] = 0; #pragma omp parallel { #pragma omp single { for (i = 0; i < NUM_TASKS; i++) { /* First we have to store the value of the loop index in a new variable * which will be private for each task because otherwise it will be overwritten * if the execution of the task takes longer than the time which is needed to * enter the next step of the loop! */ int myi; myi = i; #pragma omp task { my_sleep (SLEEPTIME); array[myi] = 1; } /* end of omp task */ } /* end of for */ #pragma omp taskwait /* check if all tasks were finished */ for (i = 0; i < NUM_TASKS; i++) if (array[i] != 1) result1++; /* generate some more tasks which now shall overwrite * the values in the tids array */ for (i = 0; i < NUM_TASKS; i++) { int myi; myi = i; #pragma omp task { array[myi] = 2; } /* end of omp task */ } /* end of for */ } /* end of single */ } /*end of parallel */ /* final check, if all array elements contain the right values: */ for (i = 0; i < NUM_TASKS; i++) { if (array[i] != 2) result2++; } return ((result1 == 0) && (result2 == 0)); } int main() { int i; int num_failed=0; for(i = 0; i < REPETITIONS; i++) { if(!test_omp_taskwait()) { num_failed++; } } return num_failed; }