
From "3.1 Reducing the number of edges" of this [[ https://hal.science/hal-04136674v1/ | paper ]] - Optimization (b) Task (dependency) nodes have a `successors` list built upon passed dependency. Given the following code, B will be added to A's successors list building the graph `A` -> `B` ``` // A # pragma omp task depend(out: x) {} // B # pragma omp task depend(in: x) {} ``` In the following code, B is currently added twice to A's successor list ``` // A # pragma omp task depend(out: x, y) {} // B # pragma omp task depend(in: x, y) {} ``` This patch removes such dupplicates by checking lastly inserted task in `A` successor list. Authored by: Romain Pereira (rpereira-dev) Differential Revision: https://reviews.llvm.org/D158544
68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
// 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;
|
|
}
|