[Openmp-commits] [PATCH] D137176: [OpenMP][libomp] Fix disabled affinity
Jonathan Peyton via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Tue Nov 1 10:35:41 PDT 2022
jlpeyton created this revision.
jlpeyton added reviewers: tlwilmar, hbae, Nawrin, mgorny.
jlpeyton added a project: OpenMP.
Herald added subscribers: guansong, yaxunl.
Herald added a project: All.
jlpeyton requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.
Fix setting affinity type and topology method when affinity is `disabled`
and fix places that were not taking into account that affinity can be
explicitly disabled by putting proper `KMP_AFFINITY_CAPABLE()` check.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D137176
Files:
openmp/runtime/src/kmp.h
openmp/runtime/src/kmp_affinity.cpp
openmp/runtime/src/kmp_settings.cpp
openmp/runtime/test/affinity/disabled.c
Index: openmp/runtime/test/affinity/disabled.c
===================================================================
--- /dev/null
+++ 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 <stdio.h>
+#include <stdlib.h>
+#include <omp.h>
+
+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;
+}
+
Index: openmp/runtime/src/kmp_settings.cpp
===================================================================
--- openmp/runtime/src/kmp_settings.cpp
+++ 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
Index: openmp/runtime/src/kmp_affinity.cpp
===================================================================
--- openmp/runtime/src/kmp_affinity.cpp
+++ 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;
}
Index: openmp/runtime/src/kmp.h
===================================================================
--- openmp/runtime/src/kmp.h
+++ 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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137176.472349.patch
Type: text/x-patch
Size: 3286 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20221101/e30ac29d/attachment.bin>
More information about the Openmp-commits
mailing list