// REQUIRES: linux // RUN: %libomp-compile && env OMP_NUM_THREADS='2' %libomp-run #include #include #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; }