Skip to content

Commit

Permalink
[OpenMP] Fix distributed barrier hang for OMP_WAIT_POLICY=passive (ll…
Browse files Browse the repository at this point in the history
…vm#83058)

The resume thread logic inside __kmp_free_team() is faulty. Only
checking b_go for sleep status doesn't wake up distributed barrier.
Change to generic check for th_sleep_loc and calling
__kmp_null_resume_wrapper().

Fixes: llvm#80664
  • Loading branch information
jpeyton52 authored Feb 27, 2024
1 parent d2a9df2 commit 0e0bee2
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
5 changes: 2 additions & 3 deletions openmp/runtime/src/kmp_runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5708,9 +5708,8 @@ void __kmp_free_team(kmp_root_t *root,
}
#endif
// first check if thread is sleeping
kmp_flag_64<> fl(&th->th.th_bar[bs_forkjoin_barrier].bb.b_go, th);
if (fl.is_sleeping())
fl.resume(__kmp_gtid_from_thread(th));
if (th->th.th_sleep_loc)
__kmp_null_resume_wrapper(th);
KMP_CPU_PAUSE();
}
}
Expand Down
37 changes: 37 additions & 0 deletions openmp/runtime/test/barrier/llvm-issue-80664.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// RUN: %libomp-compile
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='linear,linear' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='tree,tree' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='hyper,hyper' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='dist,dist' %libomp-run
//
// LLVM ISSUE 80664: https://github.com/llvm/llvm-project/issues/80664
//
// Distributed barrier + OMP_WAIT_POLICY=passive hangs in library termination
// Reason: the resume logic in __kmp_free_team() was faulty and, when checking
// for sleep status, didn't look at correct location for distributed barrier.

#include <stdio.h>
#include <stdlib.h>

int a = 0;

void test_omp_barrier() {
#pragma omp parallel
{
#pragma omp task
{
#pragma omp atomic
a++;
}
}
}

int main() {
test_omp_barrier();
printf("a = %d\n", a);
return EXIT_SUCCESS;
}

0 comments on commit 0e0bee2

Please sign in to comment.