From e9e747f0d19a39e6637393ce82aca83fa175ee4d Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 7 Dec 2019 22:18:06 +0700 Subject: [PATCH] #1385 "max-threads-hint" option now also limit RandomX dataset initialization threads. --- src/backend/cpu/CpuConfig.h | 1 + src/backend/cpu/platform/BasicCpuInfo.cpp | 2 +- src/backend/cpu/platform/HwlocCpuInfo.cpp | 2 +- src/core/Miner.cpp | 7 +------ src/crypto/rx/Rx.cpp | 5 +++-- src/crypto/rx/Rx.h | 3 ++- src/crypto/rx/RxConfig.cpp | 13 +++++++++++-- src/crypto/rx/RxConfig.h | 2 +- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/backend/cpu/CpuConfig.h b/src/backend/cpu/CpuConfig.h index 74894dcd..035a1673 100644 --- a/src/backend/cpu/CpuConfig.h +++ b/src/backend/cpu/CpuConfig.h @@ -61,6 +61,7 @@ public: inline const String &argon2Impl() const { return m_argon2Impl; } inline const Threads &threads() const { return m_threads; } inline int priority() const { return m_priority; } + inline uint32_t limit() const { return m_limit; } private: void generate(); diff --git a/src/backend/cpu/platform/BasicCpuInfo.cpp b/src/backend/cpu/platform/BasicCpuInfo.cpp index cdc810c3..e6145278 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.cpp +++ b/src/backend/cpu/platform/BasicCpuInfo.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include diff --git a/src/backend/cpu/platform/HwlocCpuInfo.cpp b/src/backend/cpu/platform/HwlocCpuInfo.cpp index 3983e8b0..a66bf9fd 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.cpp +++ b/src/backend/cpu/platform/HwlocCpuInfo.cpp @@ -262,7 +262,7 @@ xmrig::CpuThreads xmrig::HwlocCpuInfo::threads(const Algorithm &algorithm, uint3 void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const { - constexpr size_t oneMiB = 1024u * 1024u; + constexpr size_t oneMiB = 1024U * 1024U; size_t PUs = countByType(cache, HWLOC_OBJ_PU); if (PUs == 0) { diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index d9b734e5..ed988f26 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -234,12 +234,7 @@ public: # ifdef XMRIG_ALGO_RANDOMX - inline bool initRX() - { - const auto &cpu = controller->config()->cpu(); - - return Rx::init(job, controller->config()->rx(), cpu.isHugePages(), cpu.isOneGbPages(), cpu.priority()); - } + inline bool initRX() { return Rx::init(job, controller->config()->rx(), controller->config()->cpu()); } # endif diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index 7e99efa9..84c9b5fc 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -27,6 +27,7 @@ #include "crypto/rx/Rx.h" #include "backend/common/Tags.h" +#include "backend/cpu/CpuConfig.h" #include "base/io/log/Log.h" #include "crypto/rx/RxConfig.h" #include "crypto/rx/RxQueue.h" @@ -60,7 +61,7 @@ const char *xmrig::rx_tag() } -bool xmrig::Rx::init(const Job &job, const RxConfig &config, bool hugePages, bool oneGbPages, int priority) +bool xmrig::Rx::init(const Job &job, const RxConfig &config, const CpuConfig &cpu) { if (job.algorithm().family() != Algorithm::RANDOM_X) { return true; @@ -70,7 +71,7 @@ bool xmrig::Rx::init(const Job &job, const RxConfig &config, bool hugePages, boo return true; } - d_ptr->queue.enqueue(job, config.nodeset(), config.threads(), hugePages, oneGbPages, config.mode(), priority); + d_ptr->queue.enqueue(job, config.nodeset(), config.threads(cpu.limit()), cpu.isHugePages(), cpu.isOneGbPages(), config.mode(), cpu.priority()); return false; } diff --git a/src/crypto/rx/Rx.h b/src/crypto/rx/Rx.h index 6b1db813..abaca920 100644 --- a/src/crypto/rx/Rx.h +++ b/src/crypto/rx/Rx.h @@ -37,6 +37,7 @@ namespace xmrig class Algorithm; +class CpuConfig; class IRxListener; class Job; class RxConfig; @@ -46,7 +47,7 @@ class RxDataset; class Rx { public: - static bool init(const Job &job, const RxConfig &config, bool hugePages, bool oneGbPages, int priority); + static bool init(const Job &job, const RxConfig &config, const CpuConfig &cpu); static bool isReady(const Job &job); static RxDataset *dataset(const Job &job, uint32_t nodeId); static std::pair hugePages(); diff --git a/src/crypto/rx/RxConfig.cpp b/src/crypto/rx/RxConfig.cpp index ef823e60..7ae7d35d 100644 --- a/src/crypto/rx/RxConfig.cpp +++ b/src/crypto/rx/RxConfig.cpp @@ -30,6 +30,7 @@ #include #include +#include #ifdef _MSC_VER @@ -52,9 +53,17 @@ const char *xmrig::RxConfig::modeName() const } -uint32_t xmrig::RxConfig::threads() const +uint32_t xmrig::RxConfig::threads(uint32_t limit) const { - return m_threads < 1 ? static_cast(Cpu::info()->threads()) : static_cast(m_threads); + if (m_threads > 0) { + return m_threads; + } + + if (limit < 100) { + return std::max(static_cast(round(Cpu::info()->threads() * (limit / 100.0))), 1U); + } + + return Cpu::info()->threads(); } diff --git a/src/crypto/rx/RxConfig.h b/src/crypto/rx/RxConfig.h index 13ebb9d1..e3381fec 100644 --- a/src/crypto/rx/RxConfig.h +++ b/src/crypto/rx/RxConfig.h @@ -55,7 +55,7 @@ public: # endif const char *modeName() const; - uint32_t threads() const; + uint32_t threads(uint32_t limit = 100) const; inline Mode mode() const { return m_mode; }