// RUN: %compile-run-and-check #include #include 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); }