diff --git a/src/backend/cpu/platform/BasicCpuInfo.cpp b/src/backend/cpu/platform/BasicCpuInfo.cpp index d0ae612a..8b3e3e8f 100644 --- a/src/backend/cpu/platform/BasicCpuInfo.cpp +++ b/src/backend/cpu/platform/BasicCpuInfo.cpp @@ -222,9 +222,12 @@ const char *xmrig::BasicCpuInfo::backend() const } -xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint32_t) const +xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint32_t limit) const { - const size_t count = std::thread::hardware_concurrency(); + const uint32_t count = std::thread::hardware_concurrency(); + const uint32_t count_limit = std::max(static_cast(count * (limit / 100.0f)), 1U); + const uint32_t count_limit2 = std::max(count_limit / 2, 1U); + const uint32_t count_limit4 = std::max(count_limit / 4, 1U); if (count == 1) { return 1; @@ -232,42 +235,42 @@ xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint3 # ifdef XMRIG_ALGO_CN_LITE if (algorithm.family() == Algorithm::CN_LITE) { - return CpuThreads(count, 1); + return CpuThreads(count_limit, 1); } # endif # ifdef XMRIG_ALGO_CN_PICO if (algorithm.family() == Algorithm::CN_PICO) { - return CpuThreads(count, 2); + return CpuThreads(count_limit, 2); } # endif # ifdef XMRIG_ALGO_CN_HEAVY if (algorithm.family() == Algorithm::CN_HEAVY) { - return CpuThreads(std::max(count / 4, 1), 1); + return CpuThreads(count_limit4, 1); } # endif # ifdef XMRIG_ALGO_RANDOMX if (algorithm.family() == Algorithm::RANDOM_X) { if (algorithm == Algorithm::RX_WOW) { - return count; + return count_limit; } - return std::max(count / 2, 1); + return count_limit2; } # endif # ifdef XMRIG_ALGO_ARGON2 if (algorithm.family() == Algorithm::ARGON2) { - return count; + return count_limit; } # endif # ifdef XMRIG_ALGO_ASTROBWT if (algorithm.family() == Algorithm::ASTROBWT) { CpuThreads threads; - for (size_t i = 0; i < count; ++i) { + for (size_t i = 0; i < count_limit; ++i) { threads.add(i, 0); } return threads; @@ -276,11 +279,11 @@ xmrig::CpuThreads xmrig::BasicCpuInfo::threads(const Algorithm &algorithm, uint3 # ifdef XMRIG_ALGO_CN_GPU if (algorithm == Algorithm::CN_GPU) { - return count; + return count_limit; } # endif - return CpuThreads(std::max(count / 2, 1), 1); + return CpuThreads(count_limit2, 1); }