LLVM OpenMP
20.0.0git
runtime
test
tasking
omp_taskwait.c
Go to the documentation of this file.
1
// RUN: %libomp-compile-and-run
2
3
// This test is known to be fragile on NetBSD kernel at the moment,
4
// https://bugs.llvm.org/show_bug.cgi?id=42020.
5
// UNSUPPORTED: netbsd
6
#include <stdio.h>
7
#include <math.h>
8
#include "
omp_testsuite.h
"
9
#include "
omp_my_sleep.h
"
10
11
int
test_omp_taskwait
()
12
{
13
int
result1 = 0;
/* Stores number of not finished tasks after the taskwait */
14
int
result2 = 0;
/* Stores number of wrong array elements at the end */
15
int
array[
NUM_TASKS
];
16
int
i
;
17
18
/* fill array */
19
for
(
i
= 0;
i
<
NUM_TASKS
;
i
++)
20
array[
i
] = 0;
21
22
#pragma omp parallel
23
{
24
#pragma omp single
25
{
26
for
(
i
= 0;
i
<
NUM_TASKS
;
i
++) {
27
/* First we have to store the value of the loop index in a new variable
28
* which will be private for each task because otherwise it will be overwritten
29
* if the execution of the task takes longer than the time which is needed to
30
* enter the next step of the loop!
31
*/
32
int
myi;
33
myi =
i
;
34
#pragma omp task
35
{
36
my_sleep
(
SLEEPTIME
);
37
array[myi] = 1;
38
}
/* end of omp task */
39
}
/* end of for */
40
#pragma omp taskwait
41
/* check if all tasks were finished */
42
for
(
i
= 0;
i
<
NUM_TASKS
;
i
++)
43
if
(array[
i
] != 1)
44
result1++;
45
46
/* generate some more tasks which now shall overwrite
47
* the values in the tids array */
48
for
(
i
= 0;
i
<
NUM_TASKS
;
i
++) {
49
int
myi;
50
myi =
i
;
51
#pragma omp task
52
{
53
array[myi] = 2;
54
}
/* end of omp task */
55
}
/* end of for */
56
}
/* end of single */
57
}
/*end of parallel */
58
59
/* final check, if all array elements contain the right values: */
60
for
(
i
= 0;
i
<
NUM_TASKS
;
i
++) {
61
if
(array[
i
] != 2)
62
result2++;
63
}
64
return
((result1 == 0) && (result2 == 0));
65
}
66
67
int
main
()
68
{
69
int
i
;
70
int
num_failed=0;
71
72
for
(
i
= 0;
i
<
REPETITIONS
;
i
++) {
73
if
(!
test_omp_taskwait
()) {
74
num_failed++;
75
}
76
}
77
return
num_failed;
78
}
i
#define i
Definition:
kmp_stub.cpp:87
omp_my_sleep.h
my_sleep
static void my_sleep(double sleeptime)
Utility function to have a sleep function with better resolution and which only stops one thread.
Definition:
omp_my_sleep.h:24
test_omp_taskwait
int test_omp_taskwait()
Definition:
omp_taskwait.c:11
main
int main()
Definition:
omp_taskwait.c:67
omp_testsuite.h
SLEEPTIME
#define SLEEPTIME
Definition:
omp_testsuite.h:16
NUM_TASKS
#define NUM_TASKS
Definition:
omp_testsuite.h:20
REPETITIONS
#define REPETITIONS
Definition:
omp_testsuite.h:13
Generated on Wed Jan 29 2025 20:58:02 for LLVM OpenMP by
1.9.6