diff --git a/runtime/src/kmp.h b/runtime/src/kmp.h index 6f97ab27ecbb65895f74198dbf2dbcd2cf8d6df1..400c02f78bda0b43a1e91ae993df2e25d68c2f19 100644 --- a/runtime/src/kmp.h +++ b/runtime/src/kmp.h @@ -662,7 +662,10 @@ public: // Return true iff two sets are equals virtual int isequal(const Mask *d) const {} // Convert cpuset mask type to nodeset mask - virtual void cpuset2nodeset(Mask *d) const {} + virtual void cpuset2nodeset(Mask *d) const { + fprintf(stderr, "Using cpuset2nodeset with another topology than hwloc, it makes no sense. Please use KMP_TOPOLOGY_METHOD=hwloc!\n"); + KMP_ASSERT(0); + } // Set the system's affinity to this affinity mask's value virtual int set_system_affinity(bool abort_on_error) const { return -1; } // Set this affinity mask to the current system affinity diff --git a/runtime/src/kmp_affinity.cpp b/runtime/src/kmp_affinity.cpp index bc50288d9d6d96ea80ae6c178bee1e72857187d2..d97c2dfc433bb0bb4503ec6816db344931bec7db 100644 --- a/runtime/src/kmp_affinity.cpp +++ b/runtime/src/kmp_affinity.cpp @@ -65,9 +65,10 @@ void KMPAffinity::pick_api() { return; #if KMP_USE_HWLOC // Only use Hwloc if affinity isn't explicitly disabled and - // user requests Hwloc topology method - if (__kmp_affinity_top_method == affinity_top_method_hwloc && - __kmp_affinity_type != affinity_disabled) { + // unless the user specified a specific method + if (__kmp_affinity_type != affinity_disabled && + (__kmp_affinity_top_method == affinity_top_method_default || + __kmp_affinity_top_method == affinity_top_method_hwloc)) { affinity_dispatch = new KMPHwlocAffinity(); } else #endif diff --git a/runtime/src/kmp_affinity.h b/runtime/src/kmp_affinity.h index c479a8b697c9934c0bb3e356dc53d3a47d0b4629..edec3c613acc9e33f1a49e469a5caf0310dc7bec 100644 --- a/runtime/src/kmp_affinity.h +++ b/runtime/src/kmp_affinity.h @@ -262,7 +262,10 @@ class KMPNativeAffinity : public KMPAffinity { __kmp_free(mask); } int size() override { - return BITS_PER_MASK_T; + int weight = 0; + for (size_t i = 0; i < __kmp_affin_mask_size; ++i) + weight += __builtin_popcount(mask[i]); + return weight; } void set(int i) override { mask[i / BITS_PER_MASK_T] |= ((mask_t)1 << (i % BITS_PER_MASK_T));