Skip to content

Commit

Permalink
Reset cancellation status for 'parallel', 'sections' and 'for' constr…
Browse files Browse the repository at this point in the history
…acts.

Without this fix cancellation status for parallel, sections and for persists 
across construct boundaries.

Differential Revision: https://reviews.llvm.org/D31419

llvm-svn: 299434
  • Loading branch information
omalyshe committed Apr 4, 2017
1 parent db7ed37 commit dbdcfa1
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 0 deletions.
7 changes: 7 additions & 0 deletions openmp/runtime/src/kmp_barrier.cpp
Expand Up @@ -1212,6 +1212,13 @@ __kmp_barrier(enum barrier_type bt, int gtid, int is_split, size_t reduce_size,
team->t.t_bar[bt].b_team_arrived += 1;
#endif

#if OMP_40_ENABLED
// Reset cancellation flag for worksharing constructs
if(team->t.t_cancel_request == cancel_loop ||
team->t.t_cancel_request == cancel_sections ) {
team->t.t_cancel_request = cancel_noreq;
}
#endif
#if USE_ITT_BUILD
/* TODO: In case of split reduction barrier, master thread may send acquired event early,
before the final summation into the shared variable is done (final summation can be a
Expand Down
3 changes: 3 additions & 0 deletions openmp/runtime/src/kmp_runtime.cpp
Expand Up @@ -1372,6 +1372,9 @@ __kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid)

KMP_MB();
}
#if OMP_40_ENABLED
KMP_CHECK_UPDATE(serial_team->t.t_cancel_request, cancel_noreq);
#endif

if ( __kmp_env_consistency_check )
__kmp_push_parallel( global_tid, NULL );
Expand Down
61 changes: 61 additions & 0 deletions openmp/runtime/test/misc_bugs/cancellation_for_sections.c
@@ -0,0 +1,61 @@
// RUN: %libomp-compile && env OMP_CANCELLATION=true %libomp-run
// Regression test for a bug in cancellation to cover effect of `#pragma omp cancel`
// in a loop construct, on sections construct.
// Pass condition: Cancellation status from `for` does not persist
// to `sections`.

#include <stdio.h>
#include <omp.h>

int result[2] = {0, 0};

void cq416850_for_sections() {

unsigned i;
// 1) loop
#pragma omp for
for (i = 0; i < 1; i++) {
result[0] = 1;
#pragma omp cancel for
result[0] = 2;
}

// printf("thread %d: result[0] = %d, result[1] = %d \n", omp_get_thread_num(), result[0], result[1]);


// 2) sections
#pragma omp sections
{
#pragma omp section
{
result[1] = 1;
#pragma omp cancellation point sections
result[1] = 2;
}
}
}

int main(void) {
if(!omp_get_cancellation()) {
printf("Cancellation not enabled!\n");
return 2;
}

#pragma omp parallel num_threads(4)
{
cq416850_for_sections();
}

if (result[0] != 1 || result[1] != 2) {
printf("Incorrect values. "
"result[0] = %d (expected 1), "
"result[1] = %d (expected 2).\n",
result[0], result[1]);
printf("FAILED\n");
return 1;
}

printf("PASSED\n");
return 0;
}

0 comments on commit dbdcfa1

Please sign in to comment.