diff options
| author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2015-08-25 18:44:41 +0000 |
|---|---|---|
| committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2015-08-25 18:44:41 +0000 |
| commit | 62f3840c9b0ad668241572016ca17846d8d440bb (patch) | |
| tree | a3078568b73d4bb752aac62c8210de7010c61288 | |
| parent | 8cdb3f90ef8be523758b8b9a1d4e1950b2fe5cd8 (diff) | |
| download | bcm5719-llvm-62f3840c9b0ad668241572016ca17846d8d440bb.tar.gz bcm5719-llvm-62f3840c9b0ad668241572016ca17846d8d440bb.zip | |
Fix machine topology pruning.
This patch fixes a bug when eliminating layers in the machine topology (namely
cores, and threads). Before this patch, if a user specifies using only one
thread per socket, then affinity is not set properly due to bad topology
pruning.
Differential Revision: http://reviews.llvm.org/D11158
llvm-svn: 245966
| -rw-r--r-- | openmp/runtime/src/kmp_affinity.cpp | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/openmp/runtime/src/kmp_affinity.cpp b/openmp/runtime/src/kmp_affinity.cpp index 5fcee142c04..2e91c14e8d8 100644 --- a/openmp/runtime/src/kmp_affinity.cpp +++ b/openmp/runtime/src/kmp_affinity.cpp @@ -1791,24 +1791,26 @@ __kmp_affinity_create_x2apicid_map(AddrUnsPair **address2os, new_retval[proc] = AddrUnsPair(addr, retval[proc].second); } int new_level = 0; + int newPkgLevel = -1; + int newCoreLevel = -1; + int newThreadLevel = -1; + int i; for (level = 0; level < depth; level++) { - if ((maxCt[level] == 1) && (level != pkgLevel)) { - if (level == threadLevel) { - threadLevel = -1; - } - else if ((threadLevel >= 0) && (level < threadLevel)) { - threadLevel--; - } - if (level == coreLevel) { - coreLevel = -1; - } - else if ((coreLevel >= 0) && (level < coreLevel)) { - coreLevel--; - } - if (level < pkgLevel) { - pkgLevel--; - } - continue; + if ((maxCt[level] == 1) + && (level != pkgLevel)) { + // + // Remove this level. Never remove the package level + // + continue; + } + if (level == pkgLevel) { + newPkgLevel = level; + } + if (level == coreLevel) { + newCoreLevel = level; + } + if (level == threadLevel) { + newThreadLevel = level; } for (proc = 0; (int)proc < nApics; proc++) { new_retval[proc].first.labels[new_level] @@ -1820,6 +1822,9 @@ __kmp_affinity_create_x2apicid_map(AddrUnsPair **address2os, __kmp_free(retval); retval = new_retval; depth = new_depth; + pkgLevel = newPkgLevel; + coreLevel = newCoreLevel; + threadLevel = newThreadLevel; } if (__kmp_affinity_gran_levels < 0) { |

