| // 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; |
| } |