From 86ef2ebd9b2be15a67133625e960c8b2c7e7c57f Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Thu, 15 Aug 2013 11:28:05 -0600 Subject: LoopControl: Explicitly check for consistent loop arguments from the caller --- Carpet/LoopControl/src/loopcontrol.cc | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Carpet/LoopControl/src/loopcontrol.cc b/Carpet/LoopControl/src/loopcontrol.cc index 1785ec3b4..391757162 100644 --- a/Carpet/LoopControl/src/loopcontrol.cc +++ b/Carpet/LoopControl/src/loopcontrol.cc @@ -784,10 +784,44 @@ void lc_control_init(lc_control_t *restrict const control, } #pragma omp barrier + + // Ensure thread counts are consistent assert(get_num_coarse_threads() * get_num_fine_threads() == omp_get_num_threads()); + { + lc_descr_t* global_descr; + int global_num_threads; + int global_num_coarse_threads; + int global_num_fine_threads; + static int is_inconsistent; +#pragma omp single copyprivate(global_descr, global_num_threads, global_num_coarse_threads, global_num_fine_threads) + { + global_descr = descr; + global_num_threads = omp_get_num_threads(); + global_num_coarse_threads = get_num_coarse_threads(); + global_num_fine_threads = get_num_fine_threads(); + is_inconsistent = 0; + } +#pragma omp atomic + is_inconsistent |= + global_descr != descr or + global_num_threads != omp_get_num_threads() or + global_num_coarse_threads != get_num_coarse_threads() or + global_num_fine_threads != get_num_fine_threads(); +#pragma omp barrier + if (is_inconsistent) { +#pragma omp critical + cout << "thread: " << omp_get_thread_num() << "\n" + << " loop name: " << descr->name << "\n" + << " file: " << descr->file << ":" << descr->line << "\n" << flush; +#pragma omp barrier +#pragma omp critical + CCTK_ERROR("Thread inconsistency"); + } + } + // Allocate fine thread communicators if (int(lc_fine_thread_comm.size()) < get_num_coarse_threads()) { #pragma omp barrier -- cgit v1.2.3