xref: /llvm-project/openmp/runtime/test/tasking/omp_task_private.c (revision 373107699709f6fb06992bf6b76274091570aaf2)
1*614c7ef8SJonathan Peyton // RUN: %libomp-compile-and-run
2*614c7ef8SJonathan Peyton #include <stdio.h>
3*614c7ef8SJonathan Peyton #include <math.h>
4*614c7ef8SJonathan Peyton #include "omp_testsuite.h"
5*614c7ef8SJonathan Peyton 
6*614c7ef8SJonathan Peyton /* Utility function do spend some time in a loop */
test_omp_task_private()7*614c7ef8SJonathan Peyton int test_omp_task_private()
8*614c7ef8SJonathan Peyton {
9*614c7ef8SJonathan Peyton   int i;
10*614c7ef8SJonathan Peyton   int known_sum;
11*614c7ef8SJonathan Peyton   int sum = 0;
12*614c7ef8SJonathan Peyton   int result = 0; /* counts the wrong sums from tasks */
13*614c7ef8SJonathan Peyton 
14*614c7ef8SJonathan Peyton   known_sum = (LOOPCOUNT * (LOOPCOUNT + 1)) / 2;
15*614c7ef8SJonathan Peyton 
16*614c7ef8SJonathan Peyton   #pragma omp parallel
17*614c7ef8SJonathan Peyton   {
18*614c7ef8SJonathan Peyton     #pragma omp single
19*614c7ef8SJonathan Peyton     {
20*614c7ef8SJonathan Peyton       for (i = 0; i < NUM_TASKS; i++) {
21*614c7ef8SJonathan Peyton         #pragma omp task private(sum) shared(result, known_sum)
22*614c7ef8SJonathan Peyton         {
23*614c7ef8SJonathan Peyton           int j;
24*614c7ef8SJonathan Peyton           //if sum is private, initialize to 0
25*614c7ef8SJonathan Peyton           sum = 0;
26*614c7ef8SJonathan Peyton           for (j = 0; j <= LOOPCOUNT; j++) {
27*614c7ef8SJonathan Peyton             #pragma omp flush
28*614c7ef8SJonathan Peyton             sum += j;
29*614c7ef8SJonathan Peyton           }
30*614c7ef8SJonathan Peyton           /* check if calculated sum was right */
31*614c7ef8SJonathan Peyton           if (sum != known_sum) {
32*614c7ef8SJonathan Peyton             #pragma omp critical
33*614c7ef8SJonathan Peyton             result++;
34*614c7ef8SJonathan Peyton           }
35*614c7ef8SJonathan Peyton         } /* end of omp task */
36*614c7ef8SJonathan Peyton       } /* end of for */
37*614c7ef8SJonathan Peyton     } /* end of single */
38*614c7ef8SJonathan Peyton   } /* end of parallel*/
39*614c7ef8SJonathan Peyton   return (result == 0);
40*614c7ef8SJonathan Peyton }
41*614c7ef8SJonathan Peyton 
main()42*614c7ef8SJonathan Peyton int main()
43*614c7ef8SJonathan Peyton {
44*614c7ef8SJonathan Peyton   int i;
45*614c7ef8SJonathan Peyton   int num_failed=0;
46*614c7ef8SJonathan Peyton 
47*614c7ef8SJonathan Peyton   for(i = 0; i < REPETITIONS; i++) {
48*614c7ef8SJonathan Peyton     if(!test_omp_task_private()) {
49*614c7ef8SJonathan Peyton       num_failed++;
50*614c7ef8SJonathan Peyton     }
51*614c7ef8SJonathan Peyton   }
52*614c7ef8SJonathan Peyton   return num_failed;
53*614c7ef8SJonathan Peyton }
54