xref: /llvm-project/openmp/runtime/test/tasking/omp_task_firstprivate.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 
test_omp_task_firstprivate()6*614c7ef8SJonathan Peyton int test_omp_task_firstprivate()
7*614c7ef8SJonathan Peyton {
8*614c7ef8SJonathan Peyton   int i;
9*614c7ef8SJonathan Peyton   int sum = 1234;
10*614c7ef8SJonathan Peyton   int known_sum;
11*614c7ef8SJonathan Peyton   int result = 0; /* counts the wrong sums from tasks */
12*614c7ef8SJonathan Peyton 
13*614c7ef8SJonathan Peyton   known_sum = 1234 + (LOOPCOUNT * (LOOPCOUNT + 1)) / 2;
14*614c7ef8SJonathan Peyton 
15*614c7ef8SJonathan Peyton   #pragma omp parallel
16*614c7ef8SJonathan Peyton   {
17*614c7ef8SJonathan Peyton     #pragma omp single
18*614c7ef8SJonathan Peyton     {
19*614c7ef8SJonathan Peyton       for (i = 0; i < NUM_TASKS; i++) {
20*614c7ef8SJonathan Peyton         #pragma omp task firstprivate(sum)
21*614c7ef8SJonathan Peyton         {
22*614c7ef8SJonathan Peyton           int j;
23*614c7ef8SJonathan Peyton           for (j = 0; j <= LOOPCOUNT; j++) {
24*614c7ef8SJonathan Peyton             #pragma omp flush
25*614c7ef8SJonathan Peyton             sum += j;
26*614c7ef8SJonathan Peyton           }
27*614c7ef8SJonathan Peyton 
28*614c7ef8SJonathan Peyton           /* check if calculated sum was right */
29*614c7ef8SJonathan Peyton           if (sum != known_sum) {
30*614c7ef8SJonathan Peyton             #pragma omp critical
31*614c7ef8SJonathan Peyton             { result++; }
32*614c7ef8SJonathan Peyton           }
33*614c7ef8SJonathan Peyton         } /* omp task */
34*614c7ef8SJonathan Peyton       } /* for loop */
35*614c7ef8SJonathan Peyton     } /* omp single */
36*614c7ef8SJonathan Peyton   } /* omp parallel */
37*614c7ef8SJonathan Peyton   return (result == 0);
38*614c7ef8SJonathan Peyton }
39*614c7ef8SJonathan Peyton 
main()40*614c7ef8SJonathan Peyton int main()
41*614c7ef8SJonathan Peyton {
42*614c7ef8SJonathan Peyton   int i;
43*614c7ef8SJonathan Peyton   int num_failed=0;
44*614c7ef8SJonathan Peyton 
45*614c7ef8SJonathan Peyton   for(i = 0; i < REPETITIONS; i++) {
46*614c7ef8SJonathan Peyton     if(!test_omp_task_firstprivate()) {
47*614c7ef8SJonathan Peyton       num_failed++;
48*614c7ef8SJonathan Peyton     }
49*614c7ef8SJonathan Peyton   }
50*614c7ef8SJonathan Peyton   return num_failed;
51*614c7ef8SJonathan Peyton }
52