diff --git a/src/mx/util/core_set.cpp b/src/mx/util/core_set.cpp index 10efa4a..6bbb998 100644 --- a/src/mx/util/core_set.cpp +++ b/src/mx/util/core_set.cpp @@ -43,6 +43,21 @@ core_set core_set::build(std::uint16_t cores, const Order order) return core_set; } +core_set core_set::build(std::uint64_t *core_mask, std::uint16_t count) +{ + core_set core_set; + for (int c = 0; c < count; ++count) + { + std::bitset mask{core_mask[c]}; + long core = 0; + + while ((core = util::bit_scan_forward(mask.to_ulong())) != -1) { + mask.reset(core); + core_set.emplace_back(core); + } + } +} + namespace mx::util { std::ostream &operator<<(std::ostream &stream, const core_set &core_set) { diff --git a/src/mx/util/core_set.h b/src/mx/util/core_set.h index 99ded80..1189d89 100644 --- a/src/mx/util/core_set.h +++ b/src/mx/util/core_set.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace mx::util { /** @@ -91,6 +92,8 @@ public: */ static core_set build(std::uint16_t cores, Order order = Ascending); + static core_set build(std::uint64_t *core_mask, std::uint16_t count); + bool operator==(const core_set &other) const noexcept { return _core_identifier == other._core_identifier && _size == other._size && _numa_nodes == other._numa_nodes;