From 7508411faf94582bd314f0240a91e744a1aca46c Mon Sep 17 00:00:00 2001 From: XMRig Date: Fri, 4 Oct 2019 10:49:55 +0700 Subject: [PATCH] Extended "numa" option for RandomX. --- cmake/randomx.cmake | 10 +++ src/backend/cpu/platform/HwlocCpuInfo.cpp | 5 +- src/backend/cpu/platform/HwlocCpuInfo.h | 7 +- src/crypto/rx/Rx.cpp | 6 +- src/crypto/rx/RxConfig.cpp | 45 ---------- src/crypto/rx/RxConfig.h | 12 ++- src/crypto/rx/RxConfig_basic.cpp | 59 +++++++++++++ src/crypto/rx/RxConfig_hwloc.cpp | 100 ++++++++++++++++++++++ 8 files changed, 189 insertions(+), 55 deletions(-) create mode 100644 src/crypto/rx/RxConfig_basic.cpp create mode 100644 src/crypto/rx/RxConfig_hwloc.cpp diff --git a/cmake/randomx.cmake b/cmake/randomx.cmake index 6c150d491..40727e93f 100644 --- a/cmake/randomx.cmake +++ b/cmake/randomx.cmake @@ -66,6 +66,16 @@ if (WITH_RANDOMX) if (CMAKE_CXX_COMPILER_ID MATCHES Clang) set_source_files_properties(src/crypto/randomx/jit_compiler_x86.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-const-variable) endif() + + if (WITH_HWLOC) + list(APPEND SOURCES_CRYPTO + src/crypto/rx/RxConfig_hwloc.cpp + ) + else() + list(APPEND SOURCES_CRYPTO + src/crypto/rx/RxConfig_basic.cpp + ) + endif() else() remove_definitions(/DXMRIG_ALGO_RANDOMX) endif() diff --git a/src/backend/cpu/platform/HwlocCpuInfo.cpp b/src/backend/cpu/platform/HwlocCpuInfo.cpp index c9a45e1d5..dfb946863 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.cpp +++ b/src/backend/cpu/platform/HwlocCpuInfo.cpp @@ -46,7 +46,6 @@ namespace xmrig { -std::vector HwlocCpuInfo::m_nodeIndexes; uint32_t HwlocCpuInfo::m_features = 0; @@ -185,11 +184,11 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() m_features |= SET_THISTHREAD_MEMBIND; } - m_nodeIndexes.reserve(m_nodes); + m_nodeset.reserve(m_nodes); hwloc_obj_t node = nullptr; while ((node = hwloc_get_next_obj_by_type(m_topology, HWLOC_OBJ_NUMANODE, node)) != nullptr) { - m_nodeIndexes.emplace_back(node->os_index); + m_nodeset.emplace_back(node->os_index); } } } diff --git a/src/backend/cpu/platform/HwlocCpuInfo.h b/src/backend/cpu/platform/HwlocCpuInfo.h index ec4aea2cb..b796afb22 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.h +++ b/src/backend/cpu/platform/HwlocCpuInfo.h @@ -52,7 +52,9 @@ public: ~HwlocCpuInfo() override; static inline bool has(Feature feature) { return m_features & feature; } - static inline const std::vector &nodeIndexes() { return m_nodeIndexes; } + + inline const std::vector &nodeset() const { return m_nodeset; } + inline hwloc_topology_t topology() const { return m_topology; } protected: CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override; @@ -67,7 +69,7 @@ protected: private: void processTopLevelCache(hwloc_obj_t obj, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const; - static std::vector m_nodeIndexes; + static uint32_t m_features; char m_backend[20] = { 0 }; @@ -76,6 +78,7 @@ private: size_t m_cores = 0; size_t m_nodes = 0; size_t m_packages = 0; + std::vector m_nodeset; }; diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index f688a9dd7..3e8d06e07 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -104,13 +104,13 @@ public: } - static void initDataset(const RxSeed &seed, uint32_t threads, bool hugePages) + static void initDataset(const RxSeed &seed, const std::vector &nodeset, uint32_t threads, bool hugePages) { std::lock_guard lock(mutex); LOG_INFO("%s" MAGENTA_BOLD("init dataset%s") " algo " WHITE_BOLD("%s (") CYAN_BOLD("%u") WHITE_BOLD(" threads)") BLACK_BOLD(" seed %s..."), tag, - false ? "s" : "", // FIXME + nodeset.size() > 1 ? "s" : "", seed.algorithm().shortName(), threads, Buffer::toHex(seed.data().data(), 8).data() @@ -168,7 +168,7 @@ bool xmrig::Rx::init(const Job &job, const RxConfig &config, bool hugePages, IRx d_ptr->setState(job, listener); - std::thread thread(RxPrivate::initDataset, job, config.threads(), hugePages); + std::thread thread(RxPrivate::initDataset, job, config.nodeset(), config.threads(), hugePages); thread.detach(); return false; diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index 63f60b3bf..07f45eac9 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -25,51 +25,6 @@ #include "crypto/rx/RxConfig.h" #include "backend/cpu/Cpu.h" -#include "base/io/json/Json.h" -#include "rapidjson/document.h" - - -namespace xmrig { - -static const char *kInit = "init"; -static const char *kNUMA = "numa"; - -} - - -rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const -{ - using namespace rapidjson; - auto &allocator = doc.GetAllocator(); - - Value obj(kObjectType); - - obj.AddMember(StringRef(kInit), m_threads, allocator); - obj.AddMember(StringRef(kNUMA), m_numa, allocator); - - return obj; -} - - -bool xmrig::RxConfig::read(const rapidjson::Value &value) -{ - if (value.IsObject()) { - m_numa = Json::getBool(value, kNUMA, m_numa); - m_threads = Json::getInt(value, kInit, m_threads); - - return true; - } - - return false; -} - - -#ifdef XMRIG_FEATURE_HWLOC -bool xmrig::RxConfig::isNUMA() const -{ - return m_numa && Cpu::info()->nodes() > 1; -} -#endif uint32_t xmrig::RxConfig::threads() const diff --git a/src/crypto/rx/RxConfig.h b/src/crypto/rx/RxConfig.h index 343a884b0..52a832a22 100644 --- a/src/crypto/rx/RxConfig.h +++ b/src/crypto/rx/RxConfig.h @@ -29,6 +29,9 @@ #include "rapidjson/fwd.h" +#include + + namespace xmrig { @@ -39,9 +42,9 @@ public: rapidjson::Value toJSON(rapidjson::Document &doc) const; # ifdef XMRIG_FEATURE_HWLOC - bool isNUMA() const; + std::vector nodeset() const; # else - inline constexpr bool isNUMA() const { return false; } + inline std::vector nodeset() const { return std::vector(); } # endif uint32_t threads() const; @@ -49,6 +52,11 @@ public: private: bool m_numa = true; int m_threads = -1; + +# ifdef XMRIG_FEATURE_HWLOC + std::vector m_nodeset; +# endif + }; diff --git a/src/crypto/rx/RxConfig_basic.cpp b/src/crypto/rx/RxConfig_basic.cpp new file mode 100644 index 000000000..26ef7a90c --- /dev/null +++ b/src/crypto/rx/RxConfig_basic.cpp @@ -0,0 +1,59 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "crypto/rx/RxConfig.h" +#include "base/io/json/Json.h" +#include "rapidjson/document.h" + + +namespace xmrig { + +static const char *kInit = "init"; + +} + + +rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const +{ + using namespace rapidjson; + auto &allocator = doc.GetAllocator(); + + Value obj(kObjectType); + obj.AddMember(StringRef(kInit), m_threads, allocator); + + return obj; +} + + +bool xmrig::RxConfig::read(const rapidjson::Value &value) +{ + if (value.IsObject()) { + m_threads = Json::getInt(value, kInit, m_threads); + + return true; + } + + return false; +} diff --git a/src/crypto/rx/RxConfig_hwloc.cpp b/src/crypto/rx/RxConfig_hwloc.cpp new file mode 100644 index 000000000..66f086f2f --- /dev/null +++ b/src/crypto/rx/RxConfig_hwloc.cpp @@ -0,0 +1,100 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "backend/cpu/Cpu.h" +#include "backend/cpu/platform/HwlocCpuInfo.h" +#include "base/io/json/Json.h" +#include "crypto/rx/RxConfig.h" +#include "rapidjson/document.h" + + +namespace xmrig { + +static const char *kInit = "init"; +static const char *kNUMA = "numa"; + +} + + +rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const +{ + using namespace rapidjson; + auto &allocator = doc.GetAllocator(); + + Value obj(kObjectType); + + obj.AddMember(StringRef(kInit), m_threads, allocator); + + if (!m_nodeset.empty()) { + Value numa(kArrayType); + + for (uint32_t i : m_nodeset) { + numa.PushBack(i, allocator); + } + + obj.AddMember(StringRef(kNUMA), numa, allocator); + } + else { + obj.AddMember(StringRef(kNUMA), m_numa, allocator); + } + + return obj; +} + + +bool xmrig::RxConfig::read(const rapidjson::Value &value) +{ + if (value.IsObject()) { + m_threads = Json::getInt(value, kInit, m_threads); + + const auto &numa = Json::getValue(value, kNUMA); + if (numa.IsArray()) { + m_nodeset.reserve(numa.Size()); + + for (const auto &node : numa.GetArray()) { + if (node.IsUint()) { + m_nodeset.emplace_back(node.GetUint()); + } + } + } + else if (numa.IsBool()) { + m_numa = numa.GetBool(); + } + + return true; + } + + return false; +} + + +std::vector xmrig::RxConfig::nodeset() const +{ + if (!m_nodeset.empty()) { + return m_nodeset; + } + + return (m_numa && Cpu::info()->nodes() > 1) ? static_cast(Cpu::info())->nodeset() : std::vector(); +}