xref: /llvm-project/openmp/runtime/test/parallel/omp_parallel_num_threads.c (revision 614c7ef81c7de51f61239e609edf9c6716b23ebc)
1*614c7ef8SJonathan Peyton // RUN: %libomp-compile-and-run
2*614c7ef8SJonathan Peyton #include <stdio.h>
3*614c7ef8SJonathan Peyton #include "omp_testsuite.h"
4*614c7ef8SJonathan Peyton 
test_omp_parallel_num_threads()5*614c7ef8SJonathan Peyton int test_omp_parallel_num_threads()
6*614c7ef8SJonathan Peyton {
7*614c7ef8SJonathan Peyton   int num_failed;
8*614c7ef8SJonathan Peyton   int threads;
9*614c7ef8SJonathan Peyton   int nthreads;
10*614c7ef8SJonathan Peyton   int max_threads = 0;
11*614c7ef8SJonathan Peyton 
12*614c7ef8SJonathan Peyton   num_failed = 0;
13*614c7ef8SJonathan Peyton 
14*614c7ef8SJonathan Peyton   /* first we check how many threads are available */
15*614c7ef8SJonathan Peyton   #pragma omp parallel
16*614c7ef8SJonathan Peyton   {
17*614c7ef8SJonathan Peyton     #pragma omp master
18*614c7ef8SJonathan Peyton     max_threads = omp_get_num_threads ();
19*614c7ef8SJonathan Peyton   }
20*614c7ef8SJonathan Peyton 
21*614c7ef8SJonathan Peyton   /* we increase the number of threads from one to maximum:*/
22*614c7ef8SJonathan Peyton   for(threads = 1; threads <= max_threads; threads++) {
23*614c7ef8SJonathan Peyton     nthreads = 0;
24*614c7ef8SJonathan Peyton     #pragma omp parallel reduction(+:num_failed) num_threads(threads)
25*614c7ef8SJonathan Peyton     {
26*614c7ef8SJonathan Peyton       num_failed = num_failed + !(threads == omp_get_num_threads());
27*614c7ef8SJonathan Peyton       #pragma omp atomic
28*614c7ef8SJonathan Peyton       nthreads += 1;
29*614c7ef8SJonathan Peyton     }
30*614c7ef8SJonathan Peyton     num_failed = num_failed + !(nthreads == threads);
31*614c7ef8SJonathan Peyton   }
32*614c7ef8SJonathan Peyton   return (!num_failed);
33*614c7ef8SJonathan Peyton }
34*614c7ef8SJonathan Peyton 
main()35*614c7ef8SJonathan Peyton int main()
36*614c7ef8SJonathan Peyton {
37*614c7ef8SJonathan Peyton   int i;
38*614c7ef8SJonathan Peyton   int num_failed=0;
39*614c7ef8SJonathan Peyton 
40*614c7ef8SJonathan Peyton   for(i = 0; i < REPETITIONS; i++) {
41*614c7ef8SJonathan Peyton     if(!test_omp_parallel_num_threads()) {
42*614c7ef8SJonathan Peyton       num_failed++;
43*614c7ef8SJonathan Peyton     }
44*614c7ef8SJonathan Peyton   }
45*614c7ef8SJonathan Peyton   return num_failed;
46*614c7ef8SJonathan Peyton }
47