summaryrefslogtreecommitdiffstats
path: root/openmp/libomptarget/deviceRTLs/nvptx/test/parallel/flush.c
blob: 412538b6dd156d3a27c379dfd32322363dc661e3 (plain)
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
// RUN: %compile-run-and-check

#include <omp.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  int data, out, flag = 0;
#pragma omp target parallel num_threads(64) map(tofrom                         \
                                                : out, flag) map(to            \
                                                                 : data)
  {
    if (omp_get_thread_num() == 0) {
      /* Write to the data buffer that will be read by thread */
      data = 42;
/* Flush data to thread 32 */
#pragma omp flush(data)
      /* Set flag to release thread 32 */
#pragma omp atomic write
      flag = 1;
    } else if (omp_get_thread_num() == 32) {
      /* Loop until we see the update to the flag */
      int val;
      do {
#pragma omp atomic read
        val = flag;
      } while (val < 1);
      out = data;
#pragma omp flush(out)
    }
  }
  // CHECK: out=42.
  /* Value of out will be 42 */
  printf("out=%d.\n", out);
  return !(out == 42);
}
OpenPOWER on IntegriCloud