diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 000000000..d0a830b92 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,3 @@ +[codespell] +skip = ./src/3rdparty,./src/crypto/ghostrider,./src/crypto/randomx/blake2,./src/crypto/cn/sse2neon.h,./src/backend/opencl/cl/cn/groestl256.cl,./src/backend/opencl/cl/cn/jh.cl +ignore-words-list = Carmel,vor diff --git a/CHANGELOG.md b/CHANGELOG.md index dc25c1b97..248fc8b15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -160,7 +160,7 @@ # v6.16.2 - [#2751](https://github.com/xmrig/xmrig/pull/2751) Fixed crash on CPUs supporting VAES and running GCC-compiled xmrig. - [#2761](https://github.com/xmrig/xmrig/pull/2761) Fixed broken auto-tuning in GCC Windows build. -- [#2771](https://github.com/xmrig/xmrig/issues/2771) Fixed environment variables support for GhostRider and KawPow. +- [#2771](https://github.com/xmrig/xmrig/issues/2771) Fixed environment variables support for GhostRider and KawPow. - [#2769](https://github.com/xmrig/xmrig/pull/2769) Performance fixes: - Fixed several performance bottlenecks introduced in v6.16.1. - Fixed overall GCC-compiled build performance, it's the same speed as MSVC build now. @@ -468,7 +468,7 @@ - Compiler for Windows gcc builds updated to v10.1. # v5.11.1 -- [#1652](https://github.com/xmrig/xmrig/pull/1652) Up to 1% RandomX perfomance improvement on recent AMD CPUs. +- [#1652](https://github.com/xmrig/xmrig/pull/1652) Up to 1% RandomX performance improvement on recent AMD CPUs. - [#1306](https://github.com/xmrig/xmrig/issues/1306) Fixed possible double connection to a pool. - [#1654](https://github.com/xmrig/xmrig/issues/1654) Fixed build with LibreSSL. @@ -574,9 +574,9 @@ - Added automatic huge pages configuration on Linux if use the miner with root privileges. - **Added [automatic Intel prefetchers configuration](https://xmrig.com/docs/miner/randomx-optimization-guide#intel-specific-optimizations) on Linux.** - Added new option `wrmsr` in `randomx` object with command line equivalent `--randomx-wrmsr=6`. -- [#1396](https://github.com/xmrig/xmrig/pull/1396) [#1401](https://github.com/xmrig/xmrig/pull/1401) New performance optimizations for Ryzen CPUs. -- [#1385](https://github.com/xmrig/xmrig/issues/1385) Added `max-threads-hint` option support for RandomX dataset initialization threads. -- [#1386](https://github.com/xmrig/xmrig/issues/1386) Added `priority` option support for RandomX dataset initialization threads. +- [#1396](https://github.com/xmrig/xmrig/pull/1396) [#1401](https://github.com/xmrig/xmrig/pull/1401) New performance optimizations for Ryzen CPUs. +- [#1385](https://github.com/xmrig/xmrig/issues/1385) Added `max-threads-hint` option support for RandomX dataset initialization threads. +- [#1386](https://github.com/xmrig/xmrig/issues/1386) Added `priority` option support for RandomX dataset initialization threads. - For official builds all dependencies (libuv, hwloc, openssl) updated to recent versions. - Windows `msvc` builds now use Visual Studio 2019 instead of 2017. @@ -622,7 +622,7 @@ This release based on 4.x.x series and include all features from v4.6.2-beta, ch - Removed command line option `--http-enabled`, HTTP API enabled automatically if any other `--http-*` option provided. - [#1172](https://github.com/xmrig/xmrig/issues/1172) **Added OpenCL mining backend.** - [#268](https://github.com/xmrig/xmrig-amd/pull/268) [#270](https://github.com/xmrig/xmrig-amd/pull/270) [#271](https://github.com/xmrig/xmrig-amd/pull/271) [#273](https://github.com/xmrig/xmrig-amd/pull/273) [#274](https://github.com/xmrig/xmrig-amd/pull/274) [#1171](https://github.com/xmrig/xmrig/pull/1171) Added RandomX support for OpenCL, thanks [@SChernykh](https://github.com/SChernykh). -- Algorithm `cn/wow` removed, as no longer alive. +- Algorithm `cn/wow` removed, as no longer alive. # Previous versions [doc/CHANGELOG_OLD.md](doc/CHANGELOG_OLD.md) diff --git a/doc/API.md b/doc/API.md index 2cd0fbbe1..acfc64bab 100644 --- a/doc/API.md +++ b/doc/API.md @@ -1,8 +1,8 @@ # HTTP API -If you want use HTTP API you need enable it (`"enabled": true,`) then choice `port` and optionaly `host`. API not available if miner built without HTTP support (`-DWITH_HTTP=OFF`). +If you want use HTTP API you need enable it (`"enabled": true,`) then choice `port` and optionally `host`. API not available if miner built without HTTP support (`-DWITH_HTTP=OFF`). -Offical HTTP client for API: http://workers.xmrig.info/ +Official HTTP client for API: http://workers.xmrig.info/ Example configuration: diff --git a/doc/BENCHMARK.md b/doc/BENCHMARK.md index 63b679262..3822fbce9 100644 --- a/doc/BENCHMARK.md +++ b/doc/BENCHMARK.md @@ -17,7 +17,7 @@ Double check that you see `Huge pages 100%` both for dataset and for all threads ### Benchmark with custom config -You can run benchmark with any configuration you want. Just start without command line parameteres, use regular config.json and add `"benchmark":"1M",` on the next line after pool url. +You can run benchmark with any configuration you want. Just start without command line parameters, use regular config.json and add `"benchmark":"1M",` on the next line after pool url. # Stress test @@ -26,4 +26,4 @@ You can also run continuous stress-test that is as close to the real RandomX min xmrig --stress xmrig --stress -a rx/wow ``` -This will require Internet connection and will run indefinitely. \ No newline at end of file +This will require Internet connection and will run indefinitely. diff --git a/doc/CHANGELOG_OLD.md b/doc/CHANGELOG_OLD.md index a799cb389..64797376e 100644 --- a/doc/CHANGELOG_OLD.md +++ b/doc/CHANGELOG_OLD.md @@ -57,7 +57,7 @@ # v4.0.0-beta - [#1172](https://github.com/xmrig/xmrig/issues/1172) **Added OpenCL mining backend.** - [#268](https://github.com/xmrig/xmrig-amd/pull/268) [#270](https://github.com/xmrig/xmrig-amd/pull/270) [#271](https://github.com/xmrig/xmrig-amd/pull/271) [#273](https://github.com/xmrig/xmrig-amd/pull/273) [#274](https://github.com/xmrig/xmrig-amd/pull/274) [#1171](https://github.com/xmrig/xmrig/pull/1171) Added RandomX support for OpenCL, thanks [@SChernykh](https://github.com/SChernykh). -- Algorithm `cn/wow` removed, as no longer alive. +- Algorithm `cn/wow` removed, as no longer alive. # v3.2.0 - Added per pool option `coin` with single possible value `monero` for pools without algorithm negotiation, for upcoming Monero fork. @@ -103,7 +103,7 @@ - [#1105](https://github.com/xmrig/xmrig/issues/1105) Improved auto configuration for `cn-pico` algorithm. - Added commands `pause` and `resume` via JSON RPC 2.0 API (`POST /json_rpc`). - Added command line option `--export-topology` for export hwloc topology to a XML file. -- Breaked backward compatibility with previous configs and command line, `variant` option replaced to `algo`, global option `algo` removed, all CPU related settings moved to `cpu` object. +- Broken backward compatibility with previous configs and command line, `variant` option replaced to `algo`, global option `algo` removed, all CPU related settings moved to `cpu` object. - Options `av`, `safe` and `max-cpu-usage` removed. - Algorithm `cn/msr` renamed to `cn/fast`. - Algorithm `cn/xtl` removed. @@ -122,7 +122,7 @@ - [#1092](https://github.com/xmrig/xmrig/issues/1092) Fixed crash if wrong CPU affinity used. - [#1103](https://github.com/xmrig/xmrig/issues/1103) Improved auto configuration for RandomX for CPUs where L2 cache is limiting factor. - [#1105](https://github.com/xmrig/xmrig/issues/1105) Improved auto configuration for `cn-pico` algorithm. -- [#1106](https://github.com/xmrig/xmrig/issues/1106) Fixed `hugepages` field in summary API. +- [#1106](https://github.com/xmrig/xmrig/issues/1106) Fixed `hugepages` field in summary API. - Added alternative short format for CPU threads. - Changed format for CPU threads with intensity above 1. - Name for reference RandomX configuration changed to `rx/test` to avoid potential conflicts in future. @@ -150,7 +150,7 @@ - [#1050](https://github.com/xmrig/xmrig/pull/1050) Added RandomXL algorithm for [Loki](https://loki.network/), algorithm name used by miner is `randomx/loki` or `rx/loki`. - Added [flexible](https://github.com/xmrig/xmrig/blob/evo/doc/CPU.md) multi algorithm configuration. - Added unlimited switching between incompatible algorithms, all mining options can be changed in runtime. -- Breaked backward compatibility with previous configs and command line, `variant` option replaced to `algo`, global option `algo` removed, all CPU related settings moved to `cpu` object. +- Broken backward compatibility with previous configs and command line, `variant` option replaced to `algo`, global option `algo` removed, all CPU related settings moved to `cpu` object. - Options `av`, `safe` and `max-cpu-usage` removed. - Algorithm `cn/msr` renamed to `cn/fast`. - Algorithm `cn/xtl` removed. @@ -183,7 +183,7 @@ - [#314](https://github.com/xmrig/xmrig-proxy/issues/314) Added donate over proxy feature. - Added new option `donate-over-proxy`. - Added real graceful exit. - + # v2.14.4 - [#992](https://github.com/xmrig/xmrig/pull/992) Fixed compilation with Clang 3.5. - [#1012](https://github.com/xmrig/xmrig/pull/1012) Fixed compilation with Clang 9.0. @@ -250,7 +250,7 @@ # v2.8.1 - [#768](https://github.com/xmrig/xmrig/issues/768) Fixed build with Visual Studio 2015. - [#769](https://github.com/xmrig/xmrig/issues/769) Fixed regression, some ANSI escape sequences was in log with disabled colors. -- [#777](https://github.com/xmrig/xmrig/issues/777) Better report about pool connection issues. +- [#777](https://github.com/xmrig/xmrig/issues/777) Better report about pool connection issues. - Simplified checks for ASM auto detection, only AES support necessary. - Added missing options to `--help` output. @@ -259,7 +259,7 @@ - Added global and per thread option `"asm"` and command line equivalent. - **[#758](https://github.com/xmrig/xmrig/issues/758) Added SSL/TLS support for secure connections to pools.** - Added per pool options `"tls"` and `"tls-fingerprint"` and command line equivalents. -- [#767](https://github.com/xmrig/xmrig/issues/767) Added config autosave feature, same with GPU miners. +- [#767](https://github.com/xmrig/xmrig/issues/767) Added config autosave feature, same with GPU miners. - [#245](https://github.com/xmrig/xmrig-proxy/issues/245) Fixed API ID collision when run multiple miners on same machine. - [#757](https://github.com/xmrig/xmrig/issues/757) Fixed send buffer overflow. @@ -346,7 +346,7 @@ # v2.4.4 - Added libmicrohttpd version to --version output. - - Fixed bug in singal handler, in some cases miner wasn't shutdown properly. + - Fixed bug in signal handler, in some cases miner wasn't shutdown properly. - Fixed recent MSVC 2017 version detection. - [#279](https://github.com/xmrig/xmrig/pull/279) Fixed build on some macOS versions. @@ -359,7 +359,7 @@ # v2.4.2 - [#60](https://github.com/xmrig/xmrig/issues/60) Added FreeBSD support, thanks [vcambur](https://github.com/vcambur). - [#153](https://github.com/xmrig/xmrig/issues/153) Fixed issues with dwarfpool.com. - + # v2.4.1 - [#147](https://github.com/xmrig/xmrig/issues/147) Fixed comparability with monero-stratum. @@ -371,7 +371,7 @@ - [#101](https://github.com/xmrig/xmrig/issues/101) Fixed MSVC 2017 (15.3) compile time version detection. - [#108](https://github.com/xmrig/xmrig/issues/108) Silently ignore invalid values for `donate-level` option. - [#111](https://github.com/xmrig/xmrig/issues/111) Fixed build without AEON support. - + # v2.3.1 - [#68](https://github.com/xmrig/xmrig/issues/68) Fixed compatibility with Docker containers, was nothing print on console. @@ -398,7 +398,7 @@ # v2.1.0 - [#40](https://github.com/xmrig/xmrig/issues/40) Improved miner shutdown, fixed crash on exit for Linux and OS X. -- Fixed, login request was contain malformed JSON if username or password has some special characters for example `\`. +- Fixed, login request was contain malformed JSON if username or password has some special characters for example `\`. - [#220](https://github.com/fireice-uk/xmr-stak-cpu/pull/220) Better support for Round Robin DNS, IP address now always chosen randomly instead of stuck on first one. - Changed donation address, new [xmrig-proxy](https://github.com/xmrig/xmrig-proxy) is coming soon. @@ -418,16 +418,16 @@ Improved miner shutdown, fixed crash on exit for Linux and OS X. - Fixed Windows XP support. - Fixed regression, option `--no-color` was not fully disable colored output. - Show resolved pool IP address in miner output. - + # v1.0.1 - Fix broken software AES implementation, app has crashed if CPU not support AES-NI, only version 1.0.0 affected. # v1.0.0 - Miner complete rewritten in C++ with libuv. -- This version should be fully compatible (except config file) with previos versions, many new nice features will come in next versions. -- This is still beta. If you found regression, stability or perfomance issues or have an idea for new feature please fell free to open new [issue](https://github.com/xmrig/xmrig/issues/new). +- This version should be fully compatible (except config file) with previous versions, many new nice features will come in next versions. +- This is still beta. If you found regression, stability or performance issues or have an idea for new feature please fell free to open new [issue](https://github.com/xmrig/xmrig/issues/new). - Added new option `--print-time=N`, print hashrate report every N seconds. -- New hashrate reports, by default every 60 secons. +- New hashrate reports, by default every 60 seconds. - Added Microsoft Visual C++ 2015 and 2017 support. - Removed dependency on libcurl. - To compile this version from source please switch to [dev](https://github.com/xmrig/xmrig/tree/dev) branch. @@ -440,7 +440,7 @@ Improved miner shutdown, fixed crash on exit for Linux and OS X. - Fixed gcc 7.1 support. # v0.8.1 -- Added nicehash support, detects automaticaly by pool URL, for example `cryptonight.eu.nicehash.com:3355` or manually via option `--nicehash`. +- Added nicehash support, detects automatically by pool URL, for example `cryptonight.eu.nicehash.com:3355` or manually via option `--nicehash`. # v0.8.0 - Added double hash mode, also known as lower power mode. `--av=2` and `--av=4`. diff --git a/doc/CPU.md b/doc/CPU.md index 9cd51b903..675349165 100644 --- a/doc/CPU.md +++ b/doc/CPU.md @@ -124,7 +124,7 @@ Force enable (`true`) or disable (`false`) hardware AES support. Default value ` Mining threads priority, value from `1` (lowest priority) to `5` (highest possible priority). Default value `null` means miner don't change threads priority at all. Setting priority higher than 2 can make your PC unresponsive. #### `memory-pool` (since v4.3.0) -Use continuous, persistent memory block for mining threads, useful for preserve huge pages allocation while algorithm switching. Possible values `false` (feature disabled, by default) or `true` or specific count of 2 MB huge pages. It helps to avoid loosing huge pages for scratchpads when RandomX dataset is updated and mining threads restart after a 2-3 days of mining. +Use continuous, persistent memory block for mining threads, useful for preserve huge pages allocation while algorithm switching. Possible values `false` (feature disabled, by default) or `true` or specific count of 2 MB huge pages. It helps to avoid losing huge pages for scratchpads when RandomX dataset is updated and mining threads restart after a 2-3 days of mining. #### `yield` (since v5.1.1) Prefer system better system response/stability `true` (default value) or maximum hashrate `false`. @@ -133,7 +133,7 @@ Prefer system better system response/stability `true` (default value) or maximum Enable/configure or disable ASM optimizations. Possible values: `true`, `false`, `"intel"`, `"ryzen"`, `"bulldozer"`. #### `argon2-impl` (since v3.1.0) -Allow override automatically detected Argon2 implementation, this option added mostly for debug purposes, default value `null` means autodetect. This is used in RandomX dataset initialization and also in some other mining algorithms. Other possible values: `"x86_64"`, `"SSE2"`, `"SSSE3"`, `"XOP"`, `"AVX2"`, `"AVX-512F"`. Manual selection has no safe guards - if your CPU doesn't support required instuctions, miner will crash. +Allow override automatically detected Argon2 implementation, this option added mostly for debug purposes, default value `null` means autodetect. This is used in RandomX dataset initialization and also in some other mining algorithms. Other possible values: `"x86_64"`, `"SSE2"`, `"SSSE3"`, `"XOP"`, `"AVX2"`, `"AVX-512F"`. Manual selection has no safe guards - if your CPU doesn't support required instructions, miner will crash. #### `astrobwt-max-size` AstroBWT algorithm: skip hashes with large stage 2 size, default: `550`, min: `400`, max: `1200`. Optimal value depends on your CPU/GPU diff --git a/src/backend/common/Thread.h b/src/backend/common/Thread.h index fb6c618b0..95664466a 100644 --- a/src/backend/common/Thread.h +++ b/src/backend/common/Thread.h @@ -65,7 +65,7 @@ public: } } # else - inline ~Thread() { m_thread.join(); delete m_worker; } + inline ~Thread() { if (m_thread.joinable()) { m_thread.join(); } delete m_worker; } inline void start(void *(*callback)(void *)) { m_thread = std::thread(callback, this); } # endif diff --git a/src/backend/opencl/cl/cn/cryptonight.cl b/src/backend/opencl/cl/cn/cryptonight.cl index 0385677a5..f7663bb8f 100644 --- a/src/backend/opencl/cl/cn/cryptonight.cl +++ b/src/backend/opencl/cl/cn/cryptonight.cl @@ -706,7 +706,7 @@ __kernel void cn2(__global uint4 *Scratchpad, __global ulong *states, __global u } # if (ALGO_FAMILY == FAMILY_CN_HEAVY) - /* Also left over threads performe this loop. + /* Also left over threads perform this loop. * The left over thread results will be ignored */ #pragma unroll 16 @@ -1005,7 +1005,7 @@ __kernel void Groestl(__global ulong *states, __global uint *BranchBuf, __global ulong State[8] = { 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0x0001000000000000UL }; ulong H[8], M[8]; - // BUG: AMD driver 19.7.X crashs if this is written as loop + // BUG: AMD driver 19.7.X crashes if this is written as loop // Thx AMD for so bad software { ((ulong8 *)M)[0] = vload8(0, states); diff --git a/src/backend/opencl/cl/cn/wolf-skein.cl b/src/backend/opencl/cl/cn/wolf-skein.cl index 61efd4be9..1cf43eb39 100644 --- a/src/backend/opencl/cl/cn/wolf-skein.cl +++ b/src/backend/opencl/cl/cn/wolf-skein.cl @@ -10,7 +10,7 @@ #else # define STATIC /* taken from https://www.khronos.org/registry/OpenCL/extensions/amd/cl_amd_media_ops.txt - * Build-in Function + * Built-in Function * uintn amd_bitalign (uintn src0, uintn src1, uintn src2) * Description * dst.s0 = (uint) (((((long)src0.s0) << 32) | (long)src1.s0) >> (src2.s0 & 31)) diff --git a/src/backend/opencl/cl/kawpow/kawpow.cl b/src/backend/opencl/cl/kawpow/kawpow.cl index 8f914e8b6..70bc24d2f 100644 --- a/src/backend/opencl/cl/kawpow/kawpow.cl +++ b/src/backend/opencl/cl/kawpow/kawpow.cl @@ -77,7 +77,7 @@ void keccak_f800_round(uint32_t st[25], const int r) void keccak_f800(uint32_t* st) { // Complete all 22 rounds as a separate impl to - // evaluate only first 8 words is wasteful of regsters + // evaluate only first 8 words is wasteful of registers for (int r = 0; r < 22; r++) { keccak_f800_round(st, r); } @@ -181,7 +181,7 @@ __kernel void progpow_search(__global dag_t const* g_dag, __global uint* job_blo for (int i = 10; i < 25; i++) state[i] = ravencoin_rndc[i-10]; - // Run intial keccak round + // Run initial keccak round keccak_f800(state); for (int i = 0; i < 8; i++) diff --git a/src/base/crypto/sha3.cpp b/src/base/crypto/sha3.cpp index d05f9b626..68797192a 100644 --- a/src/base/crypto/sha3.cpp +++ b/src/base/crypto/sha3.cpp @@ -48,7 +48,7 @@ #define KECCAK_ROUNDS 24 -/* *************************** Public Inteface ************************ */ +/* *************************** Public Interface ************************ */ /* For Init or Reset call these: */ sha3_return_t diff --git a/src/base/net/stratum/NetworkState.cpp b/src/base/net/stratum/NetworkState.cpp index 40516a7f3..4e402eb1c 100644 --- a/src/base/net/stratum/NetworkState.cpp +++ b/src/base/net/stratum/NetworkState.cpp @@ -210,7 +210,7 @@ void xmrig::NetworkState::printResults() const printHashes(m_accepted, m_hashes); printDiff(m_diff); - if (m_active && !m_latency.empty()) { + if (m_active && m_latencyCount > 0) { printAvgTime(avgTime()); } @@ -298,13 +298,19 @@ void xmrig::NetworkState::onResultAccepted(IStrategy *strategy, IClient *client, uint32_t xmrig::NetworkState::latency() const { - const size_t calls = m_latency.size(); + const size_t calls = m_latencyCount; if (calls == 0) { return 0; } - auto v = m_latency; - std::nth_element(v.begin(), v.begin() + calls / 2, v.end()); + std::array v; + const size_t start = (m_latencyPos + kLatencyWindow - calls) % kLatencyWindow; + + for (size_t i = 0; i < calls; ++i) { + v[i] = m_latency[(start + i) % kLatencyWindow]; + } + + std::nth_element(v.begin(), v.begin() + calls / 2, v.begin() + calls); return v[calls / 2]; } @@ -312,11 +318,11 @@ uint32_t xmrig::NetworkState::latency() const uint64_t xmrig::NetworkState::avgTime() const { - if (m_latency.empty()) { + if (m_latencyCount == 0) { return 0; } - return connectionTime() / m_latency.size(); + return connectionTime() / m_latencyCount; } @@ -342,7 +348,12 @@ void xmrig::NetworkState::add(const SubmitResult &result, const char *error) std::sort(m_topDiff.rbegin(), m_topDiff.rend()); } - m_latency.push_back(result.elapsed > 0xFFFF ? 0xFFFF : static_cast(result.elapsed)); + m_latency[m_latencyPos] = result.elapsed > 0xFFFF ? 0xFFFF : static_cast(result.elapsed); + m_latencyPos = (m_latencyPos + 1) % kLatencyWindow; + + if (m_latencyCount < kLatencyWindow) { + m_latencyCount++; + } } @@ -355,5 +366,6 @@ void xmrig::NetworkState::stop() m_fingerprint = nullptr; m_failures++; - m_latency.clear(); + m_latencyCount = 0; + m_latencyPos = 0; } diff --git a/src/base/net/stratum/NetworkState.h b/src/base/net/stratum/NetworkState.h index d47a3511f..8507ab51d 100644 --- a/src/base/net/stratum/NetworkState.h +++ b/src/base/net/stratum/NetworkState.h @@ -27,7 +27,6 @@ #include #include -#include namespace xmrig { @@ -60,6 +59,8 @@ protected: void onResultAccepted(IStrategy *strategy, IClient *client, const SubmitResult &result, const char *error) override; private: + constexpr static size_t kLatencyWindow = 1024; + uint32_t latency() const; uint64_t avgTime() const; uint64_t connectionTime() const; @@ -70,7 +71,9 @@ private: bool m_active = false; char m_pool[256]{}; std::array m_topDiff { { } }; - std::vector m_latency; + std::array m_latency { { } }; + size_t m_latencyCount = 0; + size_t m_latencyPos = 0; String m_fingerprint; String m_ip; String m_tls; diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 626175aeb..763885fa7 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -76,10 +76,12 @@ void xmrig::Controller::stop() { Base::stop(); - m_network.reset(); + if (m_miner) { + m_miner->stop(); + m_miner.reset(); + } - m_miner->stop(); - m_miner.reset(); + m_network.reset(); } diff --git a/src/crypto/cn/CnCtx.cpp b/src/crypto/cn/CnCtx.cpp index c0dc8b344..ceace2bd9 100644 --- a/src/crypto/cn/CnCtx.cpp +++ b/src/crypto/cn/CnCtx.cpp @@ -49,6 +49,15 @@ void xmrig::CnCtx::release(cryptonight_ctx **ctx, size_t count) } for (size_t i = 0; i < count; ++i) { + if (ctx[i] && ctx[i]->generated_code) { +# ifdef XMRIG_OS_WIN + VirtualMemory::freeLargePagesMemory(reinterpret_cast(ctx[i]->generated_code), 0); +# else + VirtualMemory::freeLargePagesMemory(reinterpret_cast(ctx[i]->generated_code), 0x4000); +# endif + ctx[i]->generated_code = nullptr; + } + _mm_free(ctx[i]); } } diff --git a/src/crypto/cn/c_jh.c b/src/crypto/cn/c_jh.c index 9e4e7efdb..ba3fbc056 100644 --- a/src/crypto/cn/c_jh.c +++ b/src/crypto/cn/c_jh.c @@ -235,7 +235,7 @@ static HashReturn Init(hashState *state, int hashbitlen) /*initialize the initial hash value of JH*/ state->hashbitlen = hashbitlen; - /*load the intital hash value into state*/ + /*load the initial hash value into state*/ switch (hashbitlen) { case 224: memcpy(state->x,JH224_H0,128); break; diff --git a/src/crypto/cn/skein_port.h b/src/crypto/cn/skein_port.h index 4b521c7cf..071b37cf9 100644 --- a/src/crypto/cn/skein_port.h +++ b/src/crypto/cn/skein_port.h @@ -48,7 +48,7 @@ multiple of size / 8) ptr_cast(x,size) casts a pointer to a pointer to a - varaiable of length 'size' bits + variable of length 'size' bits */ #define ui_type(size) uint##size##_t diff --git a/src/crypto/common/VirtualMemory.cpp b/src/crypto/common/VirtualMemory.cpp index d7d3a545e..437b63cff 100644 --- a/src/crypto/common/VirtualMemory.cpp +++ b/src/crypto/common/VirtualMemory.cpp @@ -124,6 +124,7 @@ uint32_t xmrig::VirtualMemory::bindToNUMANode(int64_t) void xmrig::VirtualMemory::destroy() { delete pool; + pool = nullptr; } diff --git a/src/crypto/randomx/aes_hash.cpp b/src/crypto/randomx/aes_hash.cpp index 0b0687128..97b12cdf4 100644 --- a/src/crypto/randomx/aes_hash.cpp +++ b/src/crypto/randomx/aes_hash.cpp @@ -86,7 +86,7 @@ void hashAes1Rx4(const void *input, size_t inputSize, void *hash) rx_vec_i128 state0, state1, state2, state3; rx_vec_i128 in0, in1, in2, in3; - //intial state + //initial state state0 = rx_set_int_vec_i128(AES_HASH_1R_STATE0); state1 = rx_set_int_vec_i128(AES_HASH_1R_STATE1); state2 = rx_set_int_vec_i128(AES_HASH_1R_STATE2); diff --git a/src/crypto/randomx/intrin_portable.h b/src/crypto/randomx/intrin_portable.h index 7e3641ea8..a24c21ac8 100644 --- a/src/crypto/randomx/intrin_portable.h +++ b/src/crypto/randomx/intrin_portable.h @@ -174,7 +174,7 @@ FORCE_INLINE void rx_set_rounding_mode(uint32_t mode) { _mm_setcsr(rx_mxcsr_default | (mode << 13)); } -#elif defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__) //sadly only POWER7 and newer will be able to use SIMD acceleration. Earlier processors cant use doubles or 64 bit integers with SIMD +#elif defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__) //sadly only POWER7 and newer will be able to use SIMD acceleration. Earlier processors can't use doubles or 64 bit integers with SIMD #include #include #include diff --git a/src/crypto/randomx/randomx.h b/src/crypto/randomx/randomx.h index 70abff348..fb0376962 100644 --- a/src/crypto/randomx/randomx.h +++ b/src/crypto/randomx/randomx.h @@ -231,7 +231,7 @@ RANDOMX_EXPORT unsigned long randomx_dataset_item_count(void); * * @param dataset is a pointer to a previously allocated randomx_dataset structure. Must not be NULL. * @param cache is a pointer to a previously allocated and initialized randomx_cache structure. Must not be NULL. - * @param startItem is the item number where intialization should start. + * @param startItem is the item number where initialization should start. * @param itemCount is the number of items that should be initialized. */ RANDOMX_EXPORT void randomx_init_dataset(randomx_dataset *dataset, randomx_cache *cache, unsigned long startItem, unsigned long itemCount); diff --git a/src/net/JobResults.cpp b/src/net/JobResults.cpp index 57e4a8db0..d1a78a4e4 100644 --- a/src/net/JobResults.cpp +++ b/src/net/JobResults.cpp @@ -56,6 +56,7 @@ #include +#include #include #include #include @@ -66,6 +67,9 @@ namespace xmrig { #if defined(XMRIG_FEATURE_OPENCL) || defined(XMRIG_FEATURE_CUDA) +class JobResultsPrivate; + + class JobBundle { public: @@ -86,14 +90,14 @@ public: class JobBaton : public Baton { public: - inline JobBaton(std::list &&bundles, IJobResultListener *listener, bool hwAES) : + inline JobBaton(std::list &&bundles, JobResultsPrivate *owner, bool hwAES) : hwAES(hwAES), - listener(listener), + owner(owner), bundles(std::move(bundles)) {} const bool hwAES; - IJobResultListener *listener; + JobResultsPrivate *owner; std::list bundles; std::vector results; uint32_t errors = 0; @@ -188,6 +192,8 @@ static void getResults(JobBundle &bundle, std::vector &results, uint3 checkHash(bundle, results, nonce, hash, errors); } + + CnCtx::release(ctx, 1); } delete memory; @@ -200,6 +206,11 @@ class JobResultsPrivate : public IAsyncListener public: XMRIG_DISABLE_COPY_MOVE_DEFAULT(JobResultsPrivate) + constexpr static size_t kMaxQueuedResults = 4096; +# if defined(XMRIG_FEATURE_OPENCL) || defined(XMRIG_FEATURE_CUDA) + constexpr static size_t kMaxQueuedBundles = 256; +# endif + inline JobResultsPrivate(IJobResultListener *listener, bool hwAES) : m_hwAES(hwAES), m_listener(listener) @@ -214,9 +225,20 @@ public: inline void submit(const JobResult &result) { std::lock_guard lock(m_mutex); + + if (m_stopping) { + return; + } + + if (m_results.size() >= kMaxQueuedResults) { + return; + } + m_results.push_back(result); - m_async->send(); + if (m_async && !m_pendingAsync.exchange(true)) { + m_async->send(); + } } @@ -224,13 +246,55 @@ public: inline void submit(const Job &job, uint32_t *results, size_t count, uint32_t device_index) { std::lock_guard lock(m_mutex); + + if (count > 0xFF) { + count = 0xFF; + } + + if (m_stopping) { + return; + } + + if (m_bundles.size() >= kMaxQueuedBundles) { + return; + } + m_bundles.emplace_back(job, results, count, device_index); - m_async->send(); + if (m_async && !m_pendingAsync.exchange(true)) { + m_async->send(); + } } # endif + inline void stop() + { + bool deleteNow = false; + + { + std::lock_guard lock(m_mutex); + m_stopping = true; + m_listener = nullptr; + m_results.clear(); + +# if defined(XMRIG_FEATURE_OPENCL) || defined(XMRIG_FEATURE_CUDA) + m_bundles.clear(); + m_workScheduled = false; + m_deleteWhenDone = true; + deleteNow = (m_pendingWork == 0); +# else + deleteNow = true; +# endif + } + + if (deleteNow) { + m_async.reset(); + delete this; + } + } + + protected: inline void onAsync() override { submit(); } @@ -239,23 +303,33 @@ private: # if defined(XMRIG_FEATURE_OPENCL) || defined(XMRIG_FEATURE_CUDA) inline void submit() { + m_pendingAsync.store(false); + std::list bundles; std::list results; m_mutex.lock(); - m_bundles.swap(bundles); m_results.swap(results); + + const bool canScheduleWork = !m_workScheduled && !m_stopping && !m_bundles.empty(); + if (canScheduleWork) { + m_bundles.swap(bundles); + m_workScheduled = true; + m_pendingWork++; + } m_mutex.unlock(); for (const auto &result : results) { - m_listener->onJobResult(result); + if (m_listener) { + m_listener->onJobResult(result); + } } if (bundles.empty()) { return; } - auto baton = new JobBaton(std::move(bundles), m_listener, m_hwAES); + auto baton = new JobBaton(std::move(bundles), this, m_hwAES); uv_queue_work(uv_default_loop(), &baton->req, [](uv_work_t *req) { @@ -268,8 +342,67 @@ private: [](uv_work_t *req, int) { auto baton = static_cast(req->data); - for (const auto &result : baton->results) { - baton->listener->onJobResult(result); + if (baton->owner) { + baton->owner->onBatonDone(std::move(baton->results)); + } + + delete baton; + } + ); + } + + + inline void onBatonDone(std::vector &&results) + { + for (const auto &result : results) { + if (m_listener) { + m_listener->onJobResult(result); + } + } + + std::list bundles; + + m_mutex.lock(); + + m_pendingWork--; + + const bool canScheduleWork = !m_stopping && !m_bundles.empty(); + if (canScheduleWork) { + m_bundles.swap(bundles); + m_pendingWork++; + } + else { + m_workScheduled = false; + } + + const bool canDelete = m_deleteWhenDone && m_pendingWork == 0; + m_mutex.unlock(); + + if (canDelete) { + m_async.reset(); + delete this; + return; + } + + if (bundles.empty()) { + return; + } + + auto baton = new JobBaton(std::move(bundles), this, m_hwAES); + + uv_queue_work(uv_default_loop(), &baton->req, + [](uv_work_t *req) { + auto baton = static_cast(req->data); + + for (JobBundle &bundle : baton->bundles) { + getResults(bundle, baton->results, baton->errors, baton->hwAES); + } + }, + [](uv_work_t *req, int) { + auto baton = static_cast(req->data); + + if (baton->owner) { + baton->owner->onBatonDone(std::move(baton->results)); } delete baton; @@ -279,6 +412,8 @@ private: # else inline void submit() { + m_pendingAsync.store(false); + std::list results; m_mutex.lock(); @@ -286,7 +421,9 @@ private: m_mutex.unlock(); for (const auto &result : results) { - m_listener->onJobResult(result); + if (m_listener) { + m_listener->onJobResult(result); + } } } # endif @@ -296,9 +433,14 @@ private: std::list m_results; std::mutex m_mutex; std::shared_ptr m_async; + std::atomic m_pendingAsync{ false }; + bool m_stopping = false; # if defined(XMRIG_FEATURE_OPENCL) || defined(XMRIG_FEATURE_CUDA) std::list m_bundles; + bool m_workScheduled = false; + uint32_t m_pendingWork = 0; + bool m_deleteWhenDone = false; # endif }; @@ -325,11 +467,12 @@ void xmrig::JobResults::setListener(IJobResultListener *listener, bool hwAES) void xmrig::JobResults::stop() { - assert(handler != nullptr); - - delete handler; - + auto h = handler; handler = nullptr; + + if (h) { + h->stop(); + } } @@ -347,8 +490,6 @@ void xmrig::JobResults::submit(const Job& job, uint32_t nonce, const uint8_t* re void xmrig::JobResults::submit(const JobResult &result) { - assert(handler != nullptr); - if (handler) { handler->submit(result); }