LLVM OpenMP 19.0.0git
kmp_task_deps_multiple_edges.c
Go to the documentation of this file.
1// REQUIRES: linux
2// RUN: %libomp-compile && env OMP_NUM_THREADS='2' %libomp-run
3
4#include <assert.h>
5#include <omp.h>
6
7#include "kmp_task_deps.h"
8
9// the test
10int main(void) {
11 volatile int done = 0;
12
13#pragma omp parallel num_threads(2)
14 {
15 while (omp_get_thread_num() != 0 && !done)
16 ;
17
18#pragma omp single
19 {
20 kmp_task_t *A, *B;
21 kmp_depnode_list_t *A_succ;
22 kmp_base_depnode_t *B_node;
23 dep deps[2];
24 int gtid;
25 int x, y;
26
28
29 // A - out(x, y)
30 A = __kmpc_omp_task_alloc(&loc, gtid, TIED, sizeof(kmp_task_t), 0, NULL);
31 deps[0].addr = (size_t)&x;
32 deps[0].len = 0;
33 deps[0].flags = 2; // OUT
34
35 deps[1].addr = (size_t)&y;
36 deps[1].len = 0;
37 deps[1].flags = 2; // OUT
38
39 __kmpc_omp_task_with_deps(&loc, gtid, A, 2, deps, 0, 0);
40
41 // B - in(x, y)
42 B = __kmpc_omp_task_alloc(&loc, gtid, TIED, sizeof(kmp_task_t), 0, NULL);
43 deps[0].addr = (size_t)&x;
44 deps[0].len = 0;
45 deps[0].flags = 1; // IN
46
47 deps[1].addr = (size_t)&y;
48 deps[1].len = 0;
49 deps[1].flags = 1; // IN
50
51 __kmpc_omp_task_with_deps(&loc, gtid, B, 2, deps, 0, 0);
52
53 // Retrieve TDG nodes
55 B_node = __kmpc_task_get_depnode(B);
56
57 // 'B' should only be added once to 'A' successors list
58 assert(A_succ->node == B_node);
59 assert(A_succ->next == NULL);
60
61#pragma omp taskwait
62
63 done = 1;
64 }
65 }
66 return 0;
67}
KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list)
KMP_EXPORT kmp_int32 __kmpc_global_thread_num(ident_t *)
KMP_EXPORT kmp_task_t * __kmpc_omp_task_alloc(ident_t *loc_ref, kmp_int32 gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, size_t sizeof_shareds, kmp_routine_entry_t task_entry)
KMP_EXPORT kmp_depnode_list_t * __kmpc_task_get_successors(kmp_task_t *task)
KMP_EXPORT kmp_base_depnode_t * __kmpc_task_get_depnode(kmp_task_t *task)
int main(void)
static id loc
#define TIED
size_t len
unsigned char flags
size_t addr
kmp_depnode_list_t * next
Definition: kmp.h:2533
kmp_depnode_t * node
Definition: kmp.h:2532
Definition: kmp.h:2463