File: kmp_task_deps_multiple_edges.c

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (67 lines) | stat: -rw-r--r-- 1,520 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// REQUIRES: linux
// RUN: %libomp-compile && env OMP_NUM_THREADS='2' %libomp-run

#include <assert.h>
#include <omp.h>

#include "kmp_task_deps.h"

// the test
int main(void) {
  volatile int done = 0;

#pragma omp parallel num_threads(2)
  {
    while (omp_get_thread_num() != 0 && !done)
      ;

#pragma omp single
    {
      kmp_task_t *A, *B;
      kmp_depnode_list_t *A_succ;
      kmp_base_depnode_t *B_node;
      dep deps[2];
      int gtid;
      int x, y;

      gtid = __kmpc_global_thread_num(&loc);

      // A - out(x, y)
      A = __kmpc_omp_task_alloc(&loc, gtid, TIED, sizeof(kmp_task_t), 0, NULL);
      deps[0].addr = (size_t)&x;
      deps[0].len = 0;
      deps[0].flags = 2; // OUT

      deps[1].addr = (size_t)&y;
      deps[1].len = 0;
      deps[1].flags = 2; // OUT

      __kmpc_omp_task_with_deps(&loc, gtid, A, 2, deps, 0, 0);

      // B - in(x, y)
      B = __kmpc_omp_task_alloc(&loc, gtid, TIED, sizeof(kmp_task_t), 0, NULL);
      deps[0].addr = (size_t)&x;
      deps[0].len = 0;
      deps[0].flags = 1; // IN

      deps[1].addr = (size_t)&y;
      deps[1].len = 0;
      deps[1].flags = 1; // IN

      __kmpc_omp_task_with_deps(&loc, gtid, B, 2, deps, 0, 0);

      // Retrieve TDG nodes
      A_succ = __kmpc_task_get_successors(A);
      B_node = __kmpc_task_get_depnode(B);

      // 'B' should only be added once to 'A' successors list
      assert(A_succ->node == B_node);
      assert(A_succ->next == NULL);

#pragma omp taskwait

      done = 1;
    }
  }
  return 0;
}