[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