• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %libomp-compile-and-run
2 #include <stdio.h>
3 #include <math.h>
4 #include "omp_testsuite.h"
5 #include "omp_my_sleep.h"
6 
test_omp_task_final()7 int test_omp_task_final()
8 {
9   int tids[NUM_TASKS];
10   int includedtids[NUM_TASKS];
11   int i;
12   int error = 0;
13   #pragma omp parallel
14   {
15     #pragma omp single
16     {
17       for (i = 0; i < NUM_TASKS; i++) {
18         /* First we have to store the value of the loop index in a new variable
19          * which will be private for each task because otherwise it will be overwritten
20          * if the execution of the task takes longer than the time which is needed to
21          * enter the next step of the loop!
22          */
23         int myi;
24         myi = i;
25 
26         #pragma omp task final(i>=10)
27         {
28           tids[myi] = omp_get_thread_num();
29           /* we generate included tasks for final tasks */
30           if(myi >= 10) {
31             int included = myi;
32             #pragma omp task
33             {
34               my_sleep (SLEEPTIME);
35               includedtids[included] = omp_get_thread_num();
36             } /* end of omp included task of the final task */
37             my_sleep (SLEEPTIME);
38           } /* end of if it is a final task*/
39         } /* end of omp task */
40       } /* end of for */
41     } /* end of single */
42   } /*end of parallel */
43 
44   /* Now we ckeck if more than one thread executed the final task and its included task. */
45   for (i = 10; i < NUM_TASKS; i++) {
46     if (tids[i] != includedtids[i]) {
47       error++;
48     }
49   }
50   return (error==0);
51 } /* end of check_paralel_for_private */
52 
main()53 int main()
54 {
55   int i;
56   int num_failed=0;
57 
58   for(i = 0; i < REPETITIONS; i++) {
59     if(!test_omp_task_final()) {
60       num_failed++;
61     }
62   }
63   return num_failed;
64 }
65 
66