1// RUN: %libomp-compile-and-run
2#include <stdio.h>
3#include <math.h>
4#include "omp_testsuite.h"
5#include "omp_my_sleep.h"
6
7int test_omp_taskyield()
8{
9 int i;
10 int count = 0;
11 int start_tid[NUM_TASKS];
12 int current_tid[NUM_TASKS];
13
14 for (i=0; i< NUM_TASKS; i++) {
15 start_tid[i]=0;
16 current_tid[i]=0;
17 }
18
19 #pragma omp parallel
20 {
21 #pragma omp single
22 {
23 for (i = 0; i < NUM_TASKS; i++) {
24 int myi = i;
25 #pragma omp task untied
26 {
27 my_sleep(SLEEPTIME);
28 start_tid[myi] = omp_get_thread_num();
29 #pragma omp taskyield
30 if((start_tid[myi] %2) ==0){
31 my_sleep(SLEEPTIME);
32 current_tid[myi] = omp_get_thread_num();
33 } /*end of if*/
34 } /* end of omp task */
35 } /* end of for */
36 } /* end of single */
37 } /* end of parallel */
38 for (i=0;i<NUM_TASKS; i++) {
39 //printf("start_tid[%d]=%d, current_tid[%d]=%d\n",
40 //i, start_tid[i], i , current_tid[i]);
41 if (current_tid[i] == start_tid[i])
42 count++;
43 }
44 return (count<NUM_TASKS);
45}
46
47int main()
48{
49 int i;
50 int num_failed=0;
51
52 if (omp_get_max_threads() < 2)
53 omp_set_num_threads(8);
54
55 for(i = 0; i < REPETITIONS; i++) {
56 if(!test_omp_taskyield()) {
57 num_failed++;
58 }
59 }
60 return num_failed;
61}
62

source code of openmp/runtime/test/tasking/omp_taskyield.c