diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -3655,6 +3655,8 @@ } } static inline void __kmp_reset_root_init_mask(int gtid) { + if (!KMP_AFFINITY_CAPABLE()) + return; kmp_info_t *th = __kmp_threads[gtid]; kmp_root_t *r = th->th.th_root; if (r->r.r_uber_thread == th && r->r.r_affinity_assigned) { diff --git a/openmp/runtime/src/kmp_affinity.cpp b/openmp/runtime/src/kmp_affinity.cpp --- a/openmp/runtime/src/kmp_affinity.cpp +++ b/openmp/runtime/src/kmp_affinity.cpp @@ -675,7 +675,11 @@ kmp_hw_t print_types[KMP_HW_LAST + 2]; // Num Available Threads - KMP_INFORM(AvailableOSProc, env_var, num_hw_threads); + if (num_hw_threads) { + KMP_INFORM(AvailableOSProc, env_var, num_hw_threads); + } else { + KMP_INFORM(AvailableOSProc, env_var, __kmp_xproc); + } // Uniform or not if (is_uniform()) { @@ -3062,7 +3066,8 @@ } // Skip this proc if it is not included in the machine model. - if (!KMP_CPU_ISSET(threadInfo[num_avail][osIdIndex], + if (KMP_AFFINITY_CAPABLE() && + !KMP_CPU_ISSET(threadInfo[num_avail][osIdIndex], __kmp_affin_fullMask)) { INIT_PROC_INFO(threadInfo[num_avail]); continue; @@ -4525,6 +4530,9 @@ *affinity = KMP_AFFINITY_INIT(affinity->env_var); } if (__kmp_affin_origMask != NULL) { + if (KMP_AFFINITY_CAPABLE()) { + __kmp_set_system_affinity(__kmp_affin_origMask, FALSE); + } KMP_CPU_FREE(__kmp_affin_origMask); __kmp_affin_origMask = NULL; } diff --git a/openmp/runtime/src/kmp_settings.cpp b/openmp/runtime/src/kmp_settings.cpp --- a/openmp/runtime/src/kmp_settings.cpp +++ b/openmp/runtime/src/kmp_settings.cpp @@ -6296,6 +6296,15 @@ __kmp_affinity_top_method = affinity_top_method_all; } } + } else { + // If affinity is disabled, then still need to assign topology method + // to attempt machine detection and affinity types + if (__kmp_affinity_top_method == affinity_top_method_default) + __kmp_affinity_top_method = affinity_top_method_all; + if (__kmp_affinity.type == affinity_default) + __kmp_affinity.type = affinity_disabled; + if (__kmp_hh_affinity.type == affinity_default) + __kmp_hh_affinity.type = affinity_disabled; } #ifdef KMP_DEBUG diff --git a/openmp/runtime/test/affinity/disabled.c b/openmp/runtime/test/affinity/disabled.c new file mode 100644 --- /dev/null +++ b/openmp/runtime/test/affinity/disabled.c @@ -0,0 +1,25 @@ +// RUN: %libomp-compile +// RUN: env KMP_AFFINITY=disabled %libomp-run +// RUN: env KMP_AFFINITY=disabled,reset %libomp-run +// REQUIRES: affinity +#include +#include +#include + +int main() { + int nthreads, correct_value;; + int a = 0; + #pragma omp parallel reduction(+: a) + { + a += omp_get_thread_num(); + #pragma omp single + nthreads = omp_get_num_threads(); + } + correct_value = nthreads * (nthreads - 1) / 2; + if (a != correct_value) { + printf("Incorrect value: %d should be %d\n", a, correct_value); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} +