forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[OpenMP] Fix distributed barrier hang for OMP_WAIT_POLICY=passive (ll…
…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
Showing
2 changed files
with
39 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |