xref: /llvm-project/openmp/runtime/test/tasking/omp_taskyield.c (revision 74f98554f92dabb4c1be7db9e1712f060f3cdbca)
1614c7ef8SJonathan Peyton // RUN: %libomp-compile-and-run
2614c7ef8SJonathan Peyton #include <stdio.h>
3614c7ef8SJonathan Peyton #include <math.h>
4614c7ef8SJonathan Peyton #include "omp_testsuite.h"
5614c7ef8SJonathan Peyton #include "omp_my_sleep.h"
6614c7ef8SJonathan Peyton 
test_omp_taskyield()7614c7ef8SJonathan Peyton int test_omp_taskyield()
8614c7ef8SJonathan Peyton {
9614c7ef8SJonathan Peyton   int i;
10614c7ef8SJonathan Peyton   int count = 0;
11614c7ef8SJonathan Peyton   int start_tid[NUM_TASKS];
12614c7ef8SJonathan Peyton   int current_tid[NUM_TASKS];
13614c7ef8SJonathan Peyton 
14614c7ef8SJonathan Peyton   for (i=0; i< NUM_TASKS; i++) {
15614c7ef8SJonathan Peyton     start_tid[i]=0;
16614c7ef8SJonathan Peyton     current_tid[i]=0;
17614c7ef8SJonathan Peyton   }
18614c7ef8SJonathan Peyton 
19614c7ef8SJonathan Peyton   #pragma omp parallel
20614c7ef8SJonathan Peyton   {
21614c7ef8SJonathan Peyton     #pragma omp single
22614c7ef8SJonathan Peyton     {
23614c7ef8SJonathan Peyton       for (i = 0; i < NUM_TASKS; i++) {
24614c7ef8SJonathan Peyton         int myi = i;
25614c7ef8SJonathan Peyton         #pragma omp task untied
26614c7ef8SJonathan Peyton         {
27614c7ef8SJonathan Peyton           my_sleep(SLEEPTIME);
28614c7ef8SJonathan Peyton           start_tid[myi] = omp_get_thread_num();
29614c7ef8SJonathan Peyton           #pragma omp taskyield
30614c7ef8SJonathan Peyton           if((start_tid[myi] %2) ==0){
31614c7ef8SJonathan Peyton             my_sleep(SLEEPTIME);
32614c7ef8SJonathan Peyton             current_tid[myi] = omp_get_thread_num();
33614c7ef8SJonathan Peyton           } /*end of if*/
34614c7ef8SJonathan Peyton         } /* end of omp task */
35614c7ef8SJonathan Peyton       } /* end of for */
36614c7ef8SJonathan Peyton     } /* end of single */
37614c7ef8SJonathan Peyton   } /* end of parallel */
38614c7ef8SJonathan Peyton   for (i=0;i<NUM_TASKS; i++) {
39614c7ef8SJonathan Peyton     //printf("start_tid[%d]=%d, current_tid[%d]=%d\n",
40614c7ef8SJonathan Peyton       //i, start_tid[i], i , current_tid[i]);
41614c7ef8SJonathan Peyton     if (current_tid[i] == start_tid[i])
42614c7ef8SJonathan Peyton       count++;
43614c7ef8SJonathan Peyton   }
44614c7ef8SJonathan Peyton   return (count<NUM_TASKS);
45614c7ef8SJonathan Peyton }
46614c7ef8SJonathan Peyton 
main()47614c7ef8SJonathan Peyton int main()
48614c7ef8SJonathan Peyton {
49614c7ef8SJonathan Peyton   int i;
50614c7ef8SJonathan Peyton   int num_failed=0;
51614c7ef8SJonathan Peyton 
52*74f98554SAndrey Churbanov   if (omp_get_max_threads() < 2)
53*74f98554SAndrey Churbanov     omp_set_num_threads(8);
54*74f98554SAndrey Churbanov 
55614c7ef8SJonathan Peyton   for(i = 0; i < REPETITIONS; i++) {
56614c7ef8SJonathan Peyton     if(!test_omp_taskyield()) {
57614c7ef8SJonathan Peyton       num_failed++;
58614c7ef8SJonathan Peyton     }
59614c7ef8SJonathan Peyton   }
60614c7ef8SJonathan Peyton   return num_failed;
61614c7ef8SJonathan Peyton }
62