[Openmp-commits] [PATCH] D33210: Address default pinning OpenMP process with multiple processor groups

Jonathan Peyton via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Wed May 31 13:34:15 PDT 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL304343: Address default pinning OpenMP process with multiple processor groups (authored by jlpeyton).

Changed prior to commit:
  https://reviews.llvm.org/D33210?vs=99046&id=100914#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D33210

Files:
  openmp/trunk/runtime/src/kmp_settings.cpp


Index: openmp/trunk/runtime/src/kmp_settings.cpp
===================================================================
--- openmp/trunk/runtime/src/kmp_settings.cpp
+++ openmp/trunk/runtime/src/kmp_settings.cpp
@@ -5063,6 +5063,33 @@
     if (KMP_AFFINITY_CAPABLE()) {
 
 #if KMP_GROUP_AFFINITY
+      // This checks to see if the initial affinity mask is equal
+      // to a single windows processor group.  If it is, then we do
+      // not respect the initial affinity mask and instead, use the
+      // entire machine.
+      bool exactly_one_group = false;
+      if (__kmp_num_proc_groups > 1) {
+        int group;
+        bool within_one_group;
+        // Get the initial affinity mask and determine if it is
+        // contained within a single group.
+        kmp_affin_mask_t *init_mask;
+        KMP_CPU_ALLOC(init_mask);
+        __kmp_get_system_affinity(init_mask, TRUE);
+        group = __kmp_get_proc_group(init_mask);
+        within_one_group = (group >= 0);
+        // If the initial affinity is within a single group,
+        // then determine if it is equal to that single group.
+        if (within_one_group) {
+          DWORD num_bits_in_group = __kmp_GetActiveProcessorCount(group);
+          int num_bits_in_mask = 0;
+          for (int bit = init_mask->begin(); bit != init_mask->end();
+               bit = init_mask->next(bit))
+            num_bits_in_mask++;
+          exactly_one_group = (num_bits_in_group == num_bits_in_mask);
+        }
+        KMP_CPU_FREE(init_mask);
+      }
 
       // Handle the Win 64 group affinity stuff if there are multiple
       // processor groups, or if the user requested it, and OMP 4.0
@@ -5073,7 +5100,8 @@
            && (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default))
 #endif
           || (__kmp_affinity_top_method == affinity_top_method_group)) {
-        if (__kmp_affinity_respect_mask == affinity_respect_mask_default) {
+        if (__kmp_affinity_respect_mask == affinity_respect_mask_default &&
+            exactly_one_group) {
           __kmp_affinity_respect_mask = FALSE;
         }
         if (__kmp_affinity_type == affinity_default) {
@@ -5150,7 +5178,7 @@
       {
         if (__kmp_affinity_respect_mask == affinity_respect_mask_default) {
 #if KMP_GROUP_AFFINITY
-          if (__kmp_num_proc_groups > 1) {
+          if (__kmp_num_proc_groups > 1 && exactly_one_group) {
             __kmp_affinity_respect_mask = FALSE;
           } else
 #endif /* KMP_GROUP_AFFINITY */


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33210.100914.patch
Type: text/x-patch
Size: 2495 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20170531/aaa61730/attachment-0001.bin>


More information about the Openmp-commits mailing list