75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %libomp-compile-and-run
 | |
| #include <stdio.h>
 | |
| #include <math.h>
 | |
| #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;
 | |
| }
 |