LLVM OpenMP
omp_task_depend_completed.c
Go to the documentation of this file.
1// RUN: %libomp-compile-and-run
2
3// A dependent task must see its predecessor's writes even when the predecessor
4// completes before the dependent task is created. Failures on weakly ordered
5// machines are intermittent; use several buffers and repeat the handoff.
6#include <omp.h>
7#include <stdio.h>
8
9enum { Pairs = 16, Elements = 3072, Regions = 2000 };
10static int data[Pairs][Elements];
11static int ready[Pairs];
12
13int main(void) {
14 int errors = 0;
16 for (int region = 1; region <= Regions; ++region) {
17 for (int p = 0; p < Pairs; ++p)
18 ready[p] = 0;
19#pragma omp parallel num_threads(4)
20 {
21 // Bring old buffer contents into each worker's cache.
22 volatile int old;
23 for (int p = 0; p < Pairs; ++p)
24 for (int i = 0; i < Elements; i += 16)
25 old = data[p][i];
26 (void)old;
27#pragma omp barrier
28#pragma omp single
29 for (int p = 0; p < Pairs; ++p) {
30#pragma omp task firstprivate(p, region) depend(out : data[p])
31 {
32 for (int i = 0; i < Elements; ++i)
33 data[p][i] = region;
34 // Only delay creation of the consumer. A release/acquire handoff
35 // here would hide the missing ordering in dependence processing.
36 __atomic_store_n(&ready[p], 1, __ATOMIC_RELAXED);
37 }
38 while (!__atomic_load_n(&ready[p], __ATOMIC_RELAXED)) {
39 }
40#pragma omp task firstprivate(p, region) shared(errors) depend(inout : data[p])
41 {
42 int stale = 0;
43 for (int i = 0; i < Elements; ++i)
44 stale |= data[p][i] != region;
45#pragma omp atomic update
46 errors += stale;
47 }
48 }
49 }
50 if (errors) {
51 fprintf(stderr, "Dependent task read stale data in region %d\n", region);
52 return 1;
53 }
54 }
55 return 0;
56}
void
Definition ittnotify.h:3324
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void * data
void const char const char int ITT_FORMAT __itt_group_sync p
#define i
Definition kmp_stub.cpp:88
#define omp_set_dynamic
Definition kmp_stub.cpp:36
static int ready[Pairs]
int main(void)