From cbc08e696ff6579237c6a9f987ab889e88f8ae56 Mon Sep 17 00:00:00 2001 From: Matthew Sembinelli Date: Fri, 20 Sep 2019 14:06:38 -0600 Subject: [PATCH 01/19] Improve grammar and spelling on usage section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee499d475..51a470ea3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ XMRig is a high performance RandomX and CryptoNight CPU miner, with official sup * Clone with `git clone https://github.com/xmrig/xmrig.git` :hammer: [Build instructions](https://github.com/xmrig/xmrig/wiki/Build). ## Usage -Preferend way to configure miner is [JSON config file](src/config.json) as more flexible and human frendly, command line interface not cover all features, for example mining profiles for different algorithms. Most impotant options can be changed in runtime without miner restart by editing config or via API. +The preferred way to configure the miner is the [JSON config file](src/config.json) as it is more flexible and human friendly. The command line interface does not cover all features, such as mining profiles for different algorithms. Important options can be changed during runtime without miner restart by editing the config file or executing API calls. ### Options ``` From 17b40ac4ad9f5c15c8801236976ac0efa7190e67 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 28 Sep 2019 03:40:53 +0700 Subject: [PATCH 02/19] v3.2.0-dev --- CHANGELOG.md | 4 ++++ src/version.h | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3cda0cf..45eb61bcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v3.2.0 +- Added per pool option `coin` with single possible value `monero` for pools without algorithm negotiation, for upcoming Monero fork. +- [#1183](https://github.com/xmrig/xmrig/issues/1183) Fixed compatibility with systemd. + # v3.1.3 - [#1180](https://github.com/xmrig/xmrig/issues/1180) Fixed possible duplicated shares after algorithm switching. - Fixed wrong config file permissions after write (only gcc builds on recent Windows 10 affected). diff --git a/src/version.h b/src/version.h index 81e2bccea..9e2cdcc5a 100644 --- a/src/version.h +++ b/src/version.h @@ -28,15 +28,15 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig CPU miner" -#define APP_VERSION "3.1.4-dev" +#define APP_VERSION "3.2.0-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" #define APP_KIND "cpu" #define APP_VER_MAJOR 3 -#define APP_VER_MINOR 1 -#define APP_VER_PATCH 4 +#define APP_VER_MINOR 2 +#define APP_VER_PATCH 0 #ifdef _MSC_VER # if (_MSC_VER >= 1920) From 9ad174c1296699fc04bb860a453e15e6f70b343c Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 28 Sep 2019 08:28:31 +0700 Subject: [PATCH 03/19] Update ALGORITHMS.md --- doc/ALGORITHMS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/ALGORITHMS.md b/doc/ALGORITHMS.md index aff8b3bf8..73ae3fb56 100644 --- a/doc/ALGORITHMS.md +++ b/doc/ALGORITHMS.md @@ -25,10 +25,9 @@ Since version 3 mining [algorithm](#algorithm-names) should specified for each p | Name | Memory | Version | Notes | |------|--------|---------|-------| +| `rx/0` | 2 MB | 3.2.0+ | RandomX (Monero). | | `argon2/chukwa` | 512 KB | 3.1.0+ | Argon2id (Chukwa). | | `argon2/wrkz` | 256 KB | 3.1.0+ | Argon2id (WRKZ) | -| `rx/test` | 2 MB | 3.0.0+ | RandomX (reference configuration). | -| `rx/0` | 2 MB | 3.0.0+ | RandomX (reference configuration), reserved for future use. | | `rx/wow` | 1 MB | 3.0.0+ | RandomWOW. | | `rx/loki` | 2 MB | 3.0.0+ | RandomXL. | | `cn/fast` | 2 MB | 3.0.0+ | CryptoNight variant 1 with half iterations. | From f96538dfba1125dcd10f78eb8b0fb3264c43783a Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 28 Sep 2019 08:43:31 +0700 Subject: [PATCH 04/19] Update ALGORITHMS.md --- doc/ALGORITHMS.md | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/doc/ALGORITHMS.md b/doc/ALGORITHMS.md index 73ae3fb56..ab22468d5 100644 --- a/doc/ALGORITHMS.md +++ b/doc/ALGORITHMS.md @@ -1,27 +1,12 @@ # Algorithms -Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all. - -#### Example -```json -{ - "pools": [ - { - "url": "...", - "algo": "cn/r", - ... - } - ], - ... -} -``` +Algorithm can be defined in 3 ways: -#### Pools with mining algorithm negotiation support. +1. By pool, using algorithm negotiation, in this case no need specify algorithm on miner side. +2. Per pool `coin` option, currently only usable value for this option is `monero`. +3. Per pool `algo` option. - * [www.hashvault.pro](https://www.hashvault.pro/) - * [moneroocean.stream](https://moneroocean.stream) - - ## Algorithm names +## Algorithm names | Name | Memory | Version | Notes | |------|--------|---------|-------| @@ -49,3 +34,21 @@ Since version 3 mining [algorithm](#algorithm-names) should specified for each p | `cn-lite/1` | 1 MB | 2.5.0+ | CryptoNight-Lite variant 1. | | `cn-lite/0` | 1 MB | 0.8.0+ | CryptoNight-Lite variant 0. | | `cn/0` | 2 MB | 0.5.0+ | CryptoNight (original). | + +## Migration to v3 +Since version 3 mining [algorithm](#algorithm-names) should specified for each pool separately (`algo` option), earlier versions was use one global `algo` option and per pool `variant` option (this option was removed in v3). If your pool support [mining algorithm negotiation](https://github.com/xmrig/xmrig-proxy/issues/168) you may not specify this option at all. + +#### Example +```json +{ + "pools": [ + { + "url": "...", + "algo": "cn/r", + "coin": null + ... + } + ], + ... +} +``` From 8e9e8cd16960a785732fdcfe182c91e09c75e42c Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 28 Sep 2019 09:00:50 +0700 Subject: [PATCH 05/19] Update ALGORITHMS.md --- doc/ALGORITHMS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ALGORITHMS.md b/doc/ALGORITHMS.md index ab22468d5..c31ad6c7d 100644 --- a/doc/ALGORITHMS.md +++ b/doc/ALGORITHMS.md @@ -6,6 +6,8 @@ Algorithm can be defined in 3 ways: 2. Per pool `coin` option, currently only usable value for this option is `monero`. 3. Per pool `algo` option. +Option `coin` useful for pools without algorithm negotiation support or daemon to allow automatically switch algorithm in next hard fork. + ## Algorithm names | Name | Memory | Version | Notes | From 427b6516e0550200c17ca28675118f0fffcc323f Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 28 Sep 2019 23:03:12 +0700 Subject: [PATCH 06/19] v3.2.0 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 9e2cdcc5a..36d89e61a 100644 --- a/src/version.h +++ b/src/version.h @@ -28,7 +28,7 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig CPU miner" -#define APP_VERSION "3.2.0-dev" +#define APP_VERSION "3.2.0" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" From 919a6c0cc4af9b943a8f0ac0655f71777fd50bf1 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 29 Sep 2019 04:10:38 +0700 Subject: [PATCH 07/19] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 51a470ea3..be1ed702c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # XMRig +**:warning: [Monero will change PoW algorithm to RandomX on November 30.](https://github.com/xmrig/xmrig/issues/1204)** + [![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub Release Date](https://img.shields.io/github/release-date-pre/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/releases) From da39ed2ce0be607baefc9a748777292d94760615 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 29 Sep 2019 04:25:35 +0700 Subject: [PATCH 08/19] v3.2.1-dev --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index 36d89e61a..c92b33770 100644 --- a/src/version.h +++ b/src/version.h @@ -28,7 +28,7 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig CPU miner" -#define APP_VERSION "3.2.0" +#define APP_VERSION "3.2.1-dev" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" @@ -36,7 +36,7 @@ #define APP_VER_MAJOR 3 #define APP_VER_MINOR 2 -#define APP_VER_PATCH 0 +#define APP_VER_PATCH 1 #ifdef _MSC_VER # if (_MSC_VER >= 1920) From c908ef248958eb05c347701cc4328b34129e9709 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 29 Sep 2019 04:27:23 +0700 Subject: [PATCH 09/19] v4.3.0-evo --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index f803340d4..7d7c996da 100644 --- a/src/version.h +++ b/src/version.h @@ -28,14 +28,14 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig miner" -#define APP_VERSION "4.2.0-beta" +#define APP_VERSION "4.3.0-evo" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2019 xmrig.com" #define APP_KIND "miner" #define APP_VER_MAJOR 4 -#define APP_VER_MINOR 2 +#define APP_VER_MINOR 3 #define APP_VER_PATCH 0 #ifdef _MSC_VER From f4943b77f3bce6a1988c453c527b64bfabfcc94d Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 30 Sep 2019 05:18:53 +0700 Subject: [PATCH 10/19] Class OclInterleave renamed to OclSharedData and added class OclSharedState. --- src/backend/opencl/OclBackend.cpp | 5 ++ src/backend/opencl/OclConfig.cpp | 3 - src/backend/opencl/OclLaunchData.h | 3 +- src/backend/opencl/OclWorker.cpp | 20 +++--- src/backend/opencl/OclWorker.h | 2 +- src/backend/opencl/opencl.cmake | 6 +- .../tools/OclSharedData.cpp} | 22 +++++-- .../tools/OclSharedData.h} | 17 ++--- .../opencl/runners/tools/OclSharedState.cpp | 62 +++++++++++++++++++ .../opencl/runners/tools/OclSharedState.h | 48 ++++++++++++++ 10 files changed, 154 insertions(+), 34 deletions(-) rename src/backend/opencl/{OclInterleave.cpp => runners/tools/OclSharedData.cpp} (89%) rename src/backend/opencl/{OclInterleave.h => runners/tools/OclSharedData.h} (84%) create mode 100644 src/backend/opencl/runners/tools/OclSharedState.cpp create mode 100644 src/backend/opencl/runners/tools/OclSharedState.h diff --git a/src/backend/opencl/OclBackend.cpp b/src/backend/opencl/OclBackend.cpp index 9b226811f..718fd9660 100644 --- a/src/backend/opencl/OclBackend.cpp +++ b/src/backend/opencl/OclBackend.cpp @@ -35,6 +35,7 @@ #include "backend/opencl/OclConfig.h" #include "backend/opencl/OclLaunchData.h" #include "backend/opencl/OclWorker.h" +#include "backend/opencl/runners/tools/OclSharedState.h" #include "backend/opencl/wrappers/OclContext.h" #include "backend/opencl/wrappers/OclLib.h" #include "base/io/log/Log.h" @@ -194,6 +195,8 @@ public: i++; } + OclSharedState::start(threads); + status.start(threads.size()); workers.start(threads); } @@ -371,6 +374,8 @@ void xmrig::OclBackend::stop() d_ptr->workers.stop(); d_ptr->threads.clear(); + OclSharedState::release(); + LOG_INFO("%s" YELLOW(" stopped") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, Chrono::steadyMSecs() - ts); } diff --git a/src/backend/opencl/OclConfig.cpp b/src/backend/opencl/OclConfig.cpp index 7424dba7a..fc4f9ef0c 100644 --- a/src/backend/opencl/OclConfig.cpp +++ b/src/backend/opencl/OclConfig.cpp @@ -198,11 +198,8 @@ std::vector xmrig::OclConfig::get(const Miner *miner, cons # endif if (thread.threads().size() > 1) { - auto interleave = std::make_shared(thread.threads().size()); - for (int64_t affinity : thread.threads()) { OclLaunchData data(miner, algorithm, *this, platform, thread, devices[thread.index()], affinity); - data.interleave = interleave; # ifdef XMRIG_ALGO_RANDOMX data.dataset = dataset; diff --git a/src/backend/opencl/OclLaunchData.h b/src/backend/opencl/OclLaunchData.h index ab4ca09b9..8c2def2d5 100644 --- a/src/backend/opencl/OclLaunchData.h +++ b/src/backend/opencl/OclLaunchData.h @@ -27,8 +27,8 @@ #define XMRIG_OCLLAUNCHDATA_H -#include "backend/opencl/OclInterleave.h" #include "backend/opencl/OclThread.h" +#include "backend/opencl/runners/tools/OclSharedData.h" #include "backend/opencl/wrappers/OclDevice.h" #include "backend/opencl/wrappers/OclPlatform.h" #include "crypto/common/Algorithm.h" @@ -72,7 +72,6 @@ public: const OclDevice device; const OclPlatform platform; const OclThread thread; - OclInterleavePtr interleave; # ifdef XMRIG_ALGO_RANDOMX OclRxDatasetPtr dataset; diff --git a/src/backend/opencl/OclWorker.cpp b/src/backend/opencl/OclWorker.cpp index b4132e3dd..f79bc59b6 100644 --- a/src/backend/opencl/OclWorker.cpp +++ b/src/backend/opencl/OclWorker.cpp @@ -28,6 +28,8 @@ #include "backend/common/Tags.h" #include "backend/opencl/runners/OclCnRunner.h" +#include "backend/opencl/runners/tools/OclSharedData.h" +#include "backend/opencl/runners/tools/OclSharedState.h" #include "base/io/log/Log.h" #include "base/tools/Chrono.h" #include "core/Miner.h" @@ -75,7 +77,7 @@ xmrig::OclWorker::OclWorker(size_t id, const OclLaunchData &data) : m_algorithm(data.algorithm), m_miner(data.miner), m_intensity(data.thread.intensity()), - m_interleave(data.interleave) + m_sharedData(OclSharedState::get(data.device.index())) { switch (m_algorithm.family()) { case Algorithm::RANDOM_X: @@ -149,9 +151,7 @@ void xmrig::OclWorker::start() while (Nonce::sequence(Nonce::OPENCL) > 0) { if (!isReady()) { - if (m_interleave) { - m_interleave->setResumeCounter(0); - } + m_sharedData.setResumeCounter(0); do { std::this_thread::sleep_for(std::chrono::milliseconds(200)); @@ -162,9 +162,7 @@ void xmrig::OclWorker::start() break; } - if (m_interleave) { - m_interleave->resumeDelay(m_id); - } + m_sharedData.resumeDelay(m_id); if (!consumeJob()) { return; @@ -172,9 +170,7 @@ void xmrig::OclWorker::start() } while (!Nonce::isOutdated(Nonce::OPENCL, m_job.sequence())) { - if (m_interleave) { - m_interleave->adjustDelay(m_id); - } + m_sharedData.adjustDelay(m_id); const uint64_t t = Chrono::steadyMSecs(); @@ -233,9 +229,7 @@ void xmrig::OclWorker::storeStats(uint64_t t) m_count += m_intensity; - if (m_interleave) { - m_interleave->setRunTime(Chrono::steadyMSecs() - t); - } + m_sharedData.setRunTime(Chrono::steadyMSecs() - t); Worker::storeStats(); } diff --git a/src/backend/opencl/OclWorker.h b/src/backend/opencl/OclWorker.h index 93de8afd7..76cb63dbc 100644 --- a/src/backend/opencl/OclWorker.h +++ b/src/backend/opencl/OclWorker.h @@ -67,7 +67,7 @@ private: const Miner *m_miner; const uint32_t m_intensity; IOclRunner *m_runner = nullptr; - OclInterleavePtr m_interleave; + OclSharedData &m_sharedData; WorkerJob<1> m_job; }; diff --git a/src/backend/opencl/opencl.cmake b/src/backend/opencl/opencl.cmake index c5a6335fb..d45ef5e33 100644 --- a/src/backend/opencl/opencl.cmake +++ b/src/backend/opencl/opencl.cmake @@ -14,7 +14,6 @@ if (WITH_OPENCL) src/backend/opencl/OclCache.h src/backend/opencl/OclConfig.h src/backend/opencl/OclGenerator.h - src/backend/opencl/OclInterleave.h src/backend/opencl/OclLaunchData.h src/backend/opencl/OclThread.h src/backend/opencl/OclThreads.h @@ -22,6 +21,8 @@ if (WITH_OPENCL) src/backend/opencl/runners/OclBaseRunner.h src/backend/opencl/runners/OclCnRunner.h src/backend/opencl/runners/tools/OclCnR.h + src/backend/opencl/runners/tools/OclSharedData.h + src/backend/opencl/runners/tools/OclSharedState.h src/backend/opencl/wrappers/OclContext.h src/backend/opencl/wrappers/OclDevice.h src/backend/opencl/wrappers/OclError.h @@ -42,7 +43,6 @@ if (WITH_OPENCL) src/backend/opencl/OclBackend.cpp src/backend/opencl/OclCache.cpp src/backend/opencl/OclConfig.cpp - src/backend/opencl/OclInterleave.cpp src/backend/opencl/OclLaunchData.cpp src/backend/opencl/OclThread.cpp src/backend/opencl/OclThreads.cpp @@ -50,6 +50,8 @@ if (WITH_OPENCL) src/backend/opencl/runners/OclBaseRunner.cpp src/backend/opencl/runners/OclCnRunner.cpp src/backend/opencl/runners/tools/OclCnR.cpp + src/backend/opencl/runners/tools/OclSharedData.cpp + src/backend/opencl/runners/tools/OclSharedState.cpp src/backend/opencl/wrappers/OclContext.cpp src/backend/opencl/wrappers/OclDevice.cpp src/backend/opencl/wrappers/OclError.cpp diff --git a/src/backend/opencl/OclInterleave.cpp b/src/backend/opencl/runners/tools/OclSharedData.cpp similarity index 89% rename from src/backend/opencl/OclInterleave.cpp rename to src/backend/opencl/runners/tools/OclSharedData.cpp index d7226f416..3aed25380 100644 --- a/src/backend/opencl/OclInterleave.cpp +++ b/src/backend/opencl/runners/tools/OclSharedData.cpp @@ -23,7 +23,7 @@ */ -#include "backend/opencl/OclInterleave.h" +#include "backend/opencl/runners/tools/OclSharedData.h" #include "base/io/log/Log.h" #include "base/tools/Chrono.h" @@ -32,8 +32,12 @@ #include -uint64_t xmrig::OclInterleave::adjustDelay(size_t id) +uint64_t xmrig::OclSharedData::adjustDelay(size_t id) { + if (m_threads < 2) { + return 0; + } + const uint64_t t0 = Chrono::steadyMSecs(); uint64_t delay = 0; @@ -69,8 +73,12 @@ uint64_t xmrig::OclInterleave::adjustDelay(size_t id) } -uint64_t xmrig::OclInterleave::resumeDelay(size_t id) +uint64_t xmrig::OclSharedData::resumeDelay(size_t id) { + if (m_threads < 2) { + return 0; + } + uint64_t delay = 0; { @@ -99,14 +107,18 @@ uint64_t xmrig::OclInterleave::resumeDelay(size_t id) } -void xmrig::OclInterleave::setResumeCounter(uint32_t value) +void xmrig::OclSharedData::setResumeCounter(uint32_t value) { + if (m_threads < 2) { + return; + } + std::lock_guard lock(m_mutex); m_resumeCounter = value; } -void xmrig::OclInterleave::setRunTime(uint64_t time) +void xmrig::OclSharedData::setRunTime(uint64_t time) { // averagingBias = 1.0 - only the last delta time is taken into account // averagingBias = 0.5 - the last delta time has the same weight as all the previous ones combined diff --git a/src/backend/opencl/OclInterleave.h b/src/backend/opencl/runners/tools/OclSharedData.h similarity index 84% rename from src/backend/opencl/OclInterleave.h rename to src/backend/opencl/runners/tools/OclSharedData.h index 663272955..05f725a6d 100644 --- a/src/backend/opencl/OclInterleave.h +++ b/src/backend/opencl/runners/tools/OclSharedData.h @@ -22,8 +22,8 @@ * along with this program. If not, see . */ -#ifndef XMRIG_OCLINTERLEAVE_H -#define XMRIG_OCLINTERLEAVE_H +#ifndef XMRIG_OCLSHAREDDATA_H +#define XMRIG_OCLSHAREDDATA_H #include @@ -33,31 +33,32 @@ namespace xmrig { -class OclInterleave +class OclSharedData { public: - OclInterleave() = delete; - inline OclInterleave(size_t threads) : m_threads(threads) {} + OclSharedData() = default; uint64_t adjustDelay(size_t id); uint64_t resumeDelay(size_t id); void setResumeCounter(uint32_t value); void setRunTime(uint64_t time); + inline OclSharedData &operator++() { ++m_threads; return *this; } + private: - const size_t m_threads; double m_averageRunTime = 0.0; double m_threshold = 0.95; + size_t m_threads = 0; std::mutex m_mutex; uint32_t m_resumeCounter = 0; uint64_t m_timestamp = 0; }; -using OclInterleavePtr = std::shared_ptr; +using OclSharedDataPtr = std::shared_ptr; } /* namespace xmrig */ -#endif /* XMRIG_OCLINTERLEAVE_H */ +#endif /* XMRIG_OCLSHAREDDATA_H */ diff --git a/src/backend/opencl/runners/tools/OclSharedState.cpp b/src/backend/opencl/runners/tools/OclSharedState.cpp new file mode 100644 index 000000000..608fefbba --- /dev/null +++ b/src/backend/opencl/runners/tools/OclSharedState.cpp @@ -0,0 +1,62 @@ +/* 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/opencl/runners/tools/OclSharedState.h" +#include "backend/opencl/runners/tools/OclSharedData.h" + + +#include +#include + + +namespace xmrig { + + +static std::map map; + + +} // namespace xmrig + + +xmrig::OclSharedData &xmrig::OclSharedState::get(uint32_t index) +{ + return map[index]; +} + + +void xmrig::OclSharedState::release() +{ + map.clear(); +} + + +void xmrig::OclSharedState::start(const std::vector &threads) +{ + assert(map.empty()); + + for (const auto &data : threads) { + ++map[data.device.index()]; + } +} diff --git a/src/backend/opencl/runners/tools/OclSharedState.h b/src/backend/opencl/runners/tools/OclSharedState.h new file mode 100644 index 000000000..ed7c4f166 --- /dev/null +++ b/src/backend/opencl/runners/tools/OclSharedState.h @@ -0,0 +1,48 @@ +/* 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 . + */ + +#ifndef XMRIG_OCLSHAREDSTATE_H +#define XMRIG_OCLSHAREDSTATE_H + + +#include "backend/opencl/OclLaunchData.h" + + +namespace xmrig { + + +class OclSharedState +{ +public: + static OclSharedData &get(uint32_t index); + static void release(); + static void start(const std::vector &threads); + +}; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_OCLSHAREDSTATE_H */ From 77eecdd2c267c744328a5b93e489ec25af2a1726 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 30 Sep 2019 06:59:44 +0700 Subject: [PATCH 11/19] RandomX dataset specific code moved into OclSharedData class. --- src/backend/opencl/OclBackend.cpp | 8 +-- src/backend/opencl/OclConfig.cpp | 20 +----- src/backend/opencl/OclLaunchData.h | 9 --- src/backend/opencl/opencl.cmake | 2 - .../opencl/runners/OclRxBaseRunner.cpp | 4 +- src/backend/opencl/runners/OclRxBaseRunner.h | 1 + src/backend/opencl/runners/OclRxJitRunner.cpp | 2 +- src/backend/opencl/runners/OclRxVmRunner.cpp | 2 +- .../opencl/runners/tools/OclRxDataset.cpp | 54 --------------- .../opencl/runners/tools/OclRxDataset.h | 68 ------------------- .../opencl/runners/tools/OclSharedData.cpp | 43 ++++++++++++ .../opencl/runners/tools/OclSharedData.h | 20 +++++- .../opencl/runners/tools/OclSharedState.cpp | 16 ++++- .../opencl/runners/tools/OclSharedState.h | 3 +- src/backend/opencl/wrappers/OclContext.cpp | 9 +-- src/backend/opencl/wrappers/OclContext.h | 2 +- 16 files changed, 90 insertions(+), 173 deletions(-) delete mode 100644 src/backend/opencl/runners/tools/OclRxDataset.cpp delete mode 100644 src/backend/opencl/runners/tools/OclRxDataset.h diff --git a/src/backend/opencl/OclBackend.cpp b/src/backend/opencl/OclBackend.cpp index 718fd9660..5b0780069 100644 --- a/src/backend/opencl/OclBackend.cpp +++ b/src/backend/opencl/OclBackend.cpp @@ -165,7 +165,7 @@ public: } - inline void start() + inline void start(const Job &job) { LOG_INFO("%s use profile " BLUE_BG(WHITE_BOLD_S " %s ") WHITE_BOLD_S " (" CYAN_BOLD("%zu") WHITE_BOLD(" threads)") " scratchpad " CYAN_BOLD("%zu KB"), tag, @@ -195,7 +195,7 @@ public: i++; } - OclSharedState::start(threads); + OclSharedState::start(threads, job); status.start(threads.size()); workers.start(threads); @@ -332,7 +332,7 @@ void xmrig::OclBackend::setJob(const Job &job) return stop(); } - if (!d_ptr->context.init(d_ptr->devices, threads, job)) { + if (!d_ptr->context.init(d_ptr->devices, threads)) { LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), tag); return stop(); @@ -341,7 +341,7 @@ void xmrig::OclBackend::setJob(const Job &job) stop(); d_ptr->threads = std::move(threads); - d_ptr->start(); + d_ptr->start(job); } diff --git a/src/backend/opencl/OclConfig.cpp b/src/backend/opencl/OclConfig.cpp index fc4f9ef0c..bdefcaae3 100644 --- a/src/backend/opencl/OclConfig.cpp +++ b/src/backend/opencl/OclConfig.cpp @@ -193,29 +193,13 @@ std::vector xmrig::OclConfig::get(const Miner *miner, cons continue; } -# ifdef XMRIG_ALGO_RANDOMX - auto dataset = algorithm.family() == Algorithm::RANDOM_X ? std::make_shared() : nullptr; -# endif - if (thread.threads().size() > 1) { for (int64_t affinity : thread.threads()) { - OclLaunchData data(miner, algorithm, *this, platform, thread, devices[thread.index()], affinity); - -# ifdef XMRIG_ALGO_RANDOMX - data.dataset = dataset; -# endif - - out.emplace_back(std::move(data)); + out.emplace_back(miner, algorithm, *this, platform, thread, devices[thread.index()], affinity); } } else { - OclLaunchData data(miner, algorithm, *this, platform, thread, devices[thread.index()], thread.threads().front()); - -# ifdef XMRIG_ALGO_RANDOMX - data.dataset = dataset; -# endif - - out.emplace_back(std::move(data)); + out.emplace_back(miner, algorithm, *this, platform, thread, devices[thread.index()], thread.threads().front()); } } diff --git a/src/backend/opencl/OclLaunchData.h b/src/backend/opencl/OclLaunchData.h index 8c2def2d5..644023be8 100644 --- a/src/backend/opencl/OclLaunchData.h +++ b/src/backend/opencl/OclLaunchData.h @@ -35,11 +35,6 @@ #include "crypto/common/Nonce.h" -#ifdef XMRIG_ALGO_RANDOMX -# include "backend/opencl/runners/tools/OclRxDataset.h" -#endif - - using cl_context = struct _cl_context *; @@ -72,10 +67,6 @@ public: const OclDevice device; const OclPlatform platform; const OclThread thread; - -# ifdef XMRIG_ALGO_RANDOMX - OclRxDatasetPtr dataset; -# endif }; diff --git a/src/backend/opencl/opencl.cmake b/src/backend/opencl/opencl.cmake index d45ef5e33..376757170 100644 --- a/src/backend/opencl/opencl.cmake +++ b/src/backend/opencl/opencl.cmake @@ -80,7 +80,6 @@ if (WITH_OPENCL) src/backend/opencl/runners/OclRxBaseRunner.h src/backend/opencl/runners/OclRxJitRunner.h src/backend/opencl/runners/OclRxVmRunner.h - src/backend/opencl/runners/tools/OclRxDataset.h ) list(APPEND SOURCES_BACKEND_OPENCL @@ -97,7 +96,6 @@ if (WITH_OPENCL) src/backend/opencl/runners/OclRxBaseRunner.cpp src/backend/opencl/runners/OclRxJitRunner.cpp src/backend/opencl/runners/OclRxVmRunner.cpp - src/backend/opencl/runners/tools/OclRxDataset.cpp ) endif() diff --git a/src/backend/opencl/runners/OclRxBaseRunner.cpp b/src/backend/opencl/runners/OclRxBaseRunner.cpp index 767b10834..0d6915a89 100644 --- a/src/backend/opencl/runners/OclRxBaseRunner.cpp +++ b/src/backend/opencl/runners/OclRxBaseRunner.cpp @@ -30,6 +30,7 @@ #include "backend/opencl/kernels/rx/FindSharesKernel.h" #include "backend/opencl/kernels/rx/HashAesKernel.h" #include "backend/opencl/OclLaunchData.h" +#include "backend/opencl/runners/tools/OclSharedState.h" #include "backend/opencl/wrappers/OclLib.h" #include "base/net/stratum/Job.h" #include "crypto/rx/Rx.h" @@ -120,7 +121,7 @@ void xmrig::OclRxBaseRunner::set(const Job &job, uint8_t *blob) m_seed = job.seed(); auto dataset = Rx::dataset(job, 0); - enqueueWriteBuffer(data().dataset->get(), CL_TRUE, 0, dataset->size(), dataset->raw()); + enqueueWriteBuffer(m_dataset, CL_TRUE, 0, dataset->size(), dataset->raw()); } if (job.size() < Job::kMaxBlobSize) { @@ -177,4 +178,5 @@ void xmrig::OclRxBaseRunner::init() m_hashes = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, 64 * m_intensity); m_entropy = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, (128 + 2560) * m_intensity); m_rounding = createSubBuffer(CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, sizeof(uint32_t) * m_intensity); + m_dataset = OclSharedState::get(data().device.index()).dataset(); } diff --git a/src/backend/opencl/runners/OclRxBaseRunner.h b/src/backend/opencl/runners/OclRxBaseRunner.h index 48b0ff8e8..c7770e6c7 100644 --- a/src/backend/opencl/runners/OclRxBaseRunner.h +++ b/src/backend/opencl/runners/OclRxBaseRunner.h @@ -62,6 +62,7 @@ protected: Blake2bHashRegistersKernel *m_blake2b_hash_registers_64 = nullptr; Blake2bInitialHashKernel *m_blake2b_initial_hash = nullptr; Buffer m_seed; + cl_mem m_dataset = nullptr; cl_mem m_entropy = nullptr; cl_mem m_hashes = nullptr; cl_mem m_rounding = nullptr; diff --git a/src/backend/opencl/runners/OclRxJitRunner.cpp b/src/backend/opencl/runners/OclRxJitRunner.cpp index 29020fe17..ca3163336 100644 --- a/src/backend/opencl/runners/OclRxJitRunner.cpp +++ b/src/backend/opencl/runners/OclRxJitRunner.cpp @@ -74,7 +74,7 @@ void xmrig::OclRxJitRunner::build() } m_randomx_run = new RxRunKernel(m_asmProgram); - m_randomx_run->setArgs(data().dataset->get(), m_scratchpads, m_registers, m_rounding, m_programs, m_intensity, m_algorithm); + m_randomx_run->setArgs(m_dataset, m_scratchpads, m_registers, m_rounding, m_programs, m_intensity, m_algorithm); } diff --git a/src/backend/opencl/runners/OclRxVmRunner.cpp b/src/backend/opencl/runners/OclRxVmRunner.cpp index 193b68f02..3a30d5610 100644 --- a/src/backend/opencl/runners/OclRxVmRunner.cpp +++ b/src/backend/opencl/runners/OclRxVmRunner.cpp @@ -70,7 +70,7 @@ void xmrig::OclRxVmRunner::build() m_init_vm->setArgs(m_entropy, m_vm_states, m_rounding); m_execute_vm = new ExecuteVmKernel(m_program); - m_execute_vm->setArgs(m_vm_states, m_rounding, m_scratchpads, data().dataset->get(), m_intensity); + m_execute_vm->setArgs(m_vm_states, m_rounding, m_scratchpads, m_dataset, m_intensity); } diff --git a/src/backend/opencl/runners/tools/OclRxDataset.cpp b/src/backend/opencl/runners/tools/OclRxDataset.cpp deleted file mode 100644 index b1d83bd0b..000000000 --- a/src/backend/opencl/runners/tools/OclRxDataset.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* 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/opencl/runners/tools/OclRxDataset.h" -#include "backend/opencl/wrappers/OclLib.h" -#include "crypto/rx/Rx.h" -#include "crypto/rx/RxDataset.h" - - -void xmrig::OclRxDataset::createBuffer(cl_context ctx, const Job &job, bool host) -{ - if (m_dataset) { - return; - } - - cl_int ret; - - if (host) { - auto dataset = Rx::dataset(job, 0); - - m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, RxDataset::maxSize(), dataset->raw(), &ret); - } - else { - m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY, RxDataset::maxSize(), nullptr, &ret); - } -} - - -xmrig::OclRxDataset::~OclRxDataset() -{ - OclLib::release(m_dataset); -} diff --git a/src/backend/opencl/runners/tools/OclRxDataset.h b/src/backend/opencl/runners/tools/OclRxDataset.h deleted file mode 100644 index 314a2f5d6..000000000 --- a/src/backend/opencl/runners/tools/OclRxDataset.h +++ /dev/null @@ -1,68 +0,0 @@ -/* 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 . - */ - -#ifndef XMRIG_OCLRXDATASET_H -#define XMRIG_OCLRXDATASET_H - - -#include "base/tools/Object.h" - - -#include - - -using cl_context = struct _cl_context *; -using cl_mem = struct _cl_mem *; - - -namespace xmrig { - - -class Job; - - -class OclRxDataset -{ -public: - XMRIG_DISABLE_COPY_MOVE(OclRxDataset) - - OclRxDataset() = default; - ~OclRxDataset(); - - inline cl_mem get() const { return m_dataset; } - - void createBuffer(cl_context ctx,const Job &job, bool host); - -private: - cl_mem m_dataset = nullptr; -}; - - -using OclRxDatasetPtr = std::shared_ptr; - - -} /* namespace xmrig */ - - -#endif /* XMRIG_OCLINTERLEAVE_H */ diff --git a/src/backend/opencl/runners/tools/OclSharedData.cpp b/src/backend/opencl/runners/tools/OclSharedData.cpp index 3aed25380..24ef5aff0 100644 --- a/src/backend/opencl/runners/tools/OclSharedData.cpp +++ b/src/backend/opencl/runners/tools/OclSharedData.cpp @@ -24,11 +24,15 @@ #include "backend/opencl/runners/tools/OclSharedData.h" +#include "backend/opencl/wrappers/OclLib.h" #include "base/io/log/Log.h" #include "base/tools/Chrono.h" +#include "crypto/rx/Rx.h" +#include "crypto/rx/RxDataset.h" #include +#include #include @@ -107,6 +111,14 @@ uint64_t xmrig::OclSharedData::resumeDelay(size_t id) } +void xmrig::OclSharedData::release() +{ +# ifdef XMRIG_ALGO_RANDOMX + OclLib::release(m_dataset); +# endif +} + + void xmrig::OclSharedData::setResumeCounter(uint32_t value) { if (m_threads < 2) { @@ -128,3 +140,34 @@ void xmrig::OclSharedData::setRunTime(uint64_t time) std::lock_guard lock(m_mutex); m_averageRunTime = m_averageRunTime * (1.0 - averagingBias) + time * averagingBias; } + + +#ifdef XMRIG_ALGO_RANDOMX +cl_mem xmrig::OclSharedData::dataset() const +{ + if (!m_dataset) { + throw std::runtime_error("RandomX dataset is not available"); + } + + return m_dataset; +} + + +void xmrig::OclSharedData::createDataset(cl_context ctx, const Job &job, bool host) +{ + if (m_dataset) { + return; + } + + cl_int ret; + + if (host) { + auto dataset = Rx::dataset(job, 0); + + m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, RxDataset::maxSize(), dataset->raw(), &ret); + } + else { + m_dataset = OclLib::createBuffer(ctx, CL_MEM_READ_ONLY, RxDataset::maxSize(), nullptr, &ret); + } +} +#endif diff --git a/src/backend/opencl/runners/tools/OclSharedData.h b/src/backend/opencl/runners/tools/OclSharedData.h index 05f725a6d..75ce04830 100644 --- a/src/backend/opencl/runners/tools/OclSharedData.h +++ b/src/backend/opencl/runners/tools/OclSharedData.h @@ -30,9 +30,16 @@ #include +using cl_context = struct _cl_context *; +using cl_mem = struct _cl_mem *; + + namespace xmrig { +class Job; + + class OclSharedData { public: @@ -40,11 +47,17 @@ public: uint64_t adjustDelay(size_t id); uint64_t resumeDelay(size_t id); + void release(); void setResumeCounter(uint32_t value); void setRunTime(uint64_t time); inline OclSharedData &operator++() { ++m_threads; return *this; } +# ifdef XMRIG_ALGO_RANDOMX + cl_mem dataset() const; + void createDataset(cl_context ctx, const Job &job, bool host); +# endif + private: double m_averageRunTime = 0.0; double m_threshold = 0.95; @@ -52,12 +65,13 @@ private: std::mutex m_mutex; uint32_t m_resumeCounter = 0; uint64_t m_timestamp = 0; + +# ifdef XMRIG_ALGO_RANDOMX + cl_mem m_dataset = nullptr; +# endif }; -using OclSharedDataPtr = std::shared_ptr; - - } /* namespace xmrig */ diff --git a/src/backend/opencl/runners/tools/OclSharedState.cpp b/src/backend/opencl/runners/tools/OclSharedState.cpp index 608fefbba..0b16a301f 100644 --- a/src/backend/opencl/runners/tools/OclSharedState.cpp +++ b/src/backend/opencl/runners/tools/OclSharedState.cpp @@ -48,15 +48,27 @@ xmrig::OclSharedData &xmrig::OclSharedState::get(uint32_t index) void xmrig::OclSharedState::release() { + for (auto &kv : map) { + kv.second.release(); + } + map.clear(); } -void xmrig::OclSharedState::start(const std::vector &threads) +void xmrig::OclSharedState::start(const std::vector &threads, const Job &job) { assert(map.empty()); for (const auto &data : threads) { - ++map[data.device.index()]; + auto &sharedData = map[data.device.index()]; + + ++sharedData; + +# ifdef XMRIG_ALGO_RANDOMX + if (data.algorithm.family() == Algorithm::RANDOM_X) { + sharedData.createDataset(data.ctx, job, data.thread.isDatasetHost()); + } +# endif } } diff --git a/src/backend/opencl/runners/tools/OclSharedState.h b/src/backend/opencl/runners/tools/OclSharedState.h index ed7c4f166..610056cd8 100644 --- a/src/backend/opencl/runners/tools/OclSharedState.h +++ b/src/backend/opencl/runners/tools/OclSharedState.h @@ -37,8 +37,7 @@ class OclSharedState public: static OclSharedData &get(uint32_t index); static void release(); - static void start(const std::vector &threads); - + static void start(const std::vector &threads, const Job &job); }; diff --git a/src/backend/opencl/wrappers/OclContext.cpp b/src/backend/opencl/wrappers/OclContext.cpp index a25593350..eed4272c8 100644 --- a/src/backend/opencl/wrappers/OclContext.cpp +++ b/src/backend/opencl/wrappers/OclContext.cpp @@ -24,6 +24,7 @@ #include "backend/opencl/wrappers/OclContext.h" +#include "backend/opencl/runners/tools/OclSharedState.h" #include "backend/opencl/wrappers/OclLib.h" @@ -42,7 +43,7 @@ xmrig::OclContext::~OclContext() } -bool xmrig::OclContext::init(const std::vector &devices, std::vector &threads, const Job &job) +bool xmrig::OclContext::init(const std::vector &devices, std::vector &threads) { if (!m_ctx) { std::vector ids(devices.size()); @@ -59,12 +60,6 @@ bool xmrig::OclContext::init(const std::vector &devices, std::vector< for (OclLaunchData &data : threads) { data.ctx = m_ctx; - -# ifdef XMRIG_ALGO_RANDOMX - if (data.algorithm.family() == Algorithm::RANDOM_X) { - data.dataset->createBuffer(m_ctx, job, data.thread.isDatasetHost()); - } -# endif } return true; diff --git a/src/backend/opencl/wrappers/OclContext.h b/src/backend/opencl/wrappers/OclContext.h index 8f2cc432c..fb45358e9 100644 --- a/src/backend/opencl/wrappers/OclContext.h +++ b/src/backend/opencl/wrappers/OclContext.h @@ -49,7 +49,7 @@ public: OclContext(const OclDevice &device); ~OclContext(); - bool init(const std::vector &devices, std::vector &threads, const Job &job); + bool init(const std::vector &devices, std::vector &threads); inline bool isValid() const { return m_ctx != nullptr; } inline cl_context ctx() const { return m_ctx; } From 3560b6a3c29b2e79c11072d116f5e90681e1acec Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 30 Sep 2019 07:30:14 +0700 Subject: [PATCH 12/19] Added clRetainMemObject support. --- src/backend/opencl/runners/OclRxBaseRunner.cpp | 1 + .../opencl/runners/tools/OclSharedData.cpp | 2 +- src/backend/opencl/wrappers/OclLib.cpp | 16 ++++++++++++++++ src/backend/opencl/wrappers/OclLib.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/opencl/runners/OclRxBaseRunner.cpp b/src/backend/opencl/runners/OclRxBaseRunner.cpp index 0d6915a89..fa0259b49 100644 --- a/src/backend/opencl/runners/OclRxBaseRunner.cpp +++ b/src/backend/opencl/runners/OclRxBaseRunner.cpp @@ -76,6 +76,7 @@ xmrig::OclRxBaseRunner::~OclRxBaseRunner() OclLib::release(m_hashes); OclLib::release(m_rounding); OclLib::release(m_scratchpads); + OclLib::release(m_dataset); } diff --git a/src/backend/opencl/runners/tools/OclSharedData.cpp b/src/backend/opencl/runners/tools/OclSharedData.cpp index 24ef5aff0..51571c027 100644 --- a/src/backend/opencl/runners/tools/OclSharedData.cpp +++ b/src/backend/opencl/runners/tools/OclSharedData.cpp @@ -149,7 +149,7 @@ cl_mem xmrig::OclSharedData::dataset() const throw std::runtime_error("RandomX dataset is not available"); } - return m_dataset; + return OclLib::retain(m_dataset); } diff --git a/src/backend/opencl/wrappers/OclLib.cpp b/src/backend/opencl/wrappers/OclLib.cpp index 826b88c5d..1b530bae9 100644 --- a/src/backend/opencl/wrappers/OclLib.cpp +++ b/src/backend/opencl/wrappers/OclLib.cpp @@ -73,6 +73,7 @@ static const char *kReleaseDevice = "clReleaseDevice"; static const char *kReleaseKernel = "clReleaseKernel"; static const char *kReleaseMemObject = "clReleaseMemObject"; static const char *kReleaseProgram = "clReleaseProgram"; +static const char *kRetainMemObject = "clRetainMemObject"; static const char *kRetainProgram = "clRetainProgram"; static const char *kSetKernelArg = "clSetKernelArg"; static const char *kSetMemObjectDestructorCallback = "clSetMemObjectDestructorCallback"; @@ -106,6 +107,7 @@ typedef cl_int (CL_API_CALL *releaseDevice_t)(cl_device_id device); typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel); typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem); typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program); +typedef cl_int (CL_API_CALL *retainMemObject_t)(cl_mem); typedef cl_int (CL_API_CALL *retainProgram_t)(cl_program); typedef cl_int (CL_API_CALL *setKernelArg_t)(cl_kernel, cl_uint, size_t, const void *); typedef cl_int (CL_API_CALL *setMemObjectDestructorCallback_t)(cl_mem, void (CL_CALLBACK *)(cl_mem, void *), void *); @@ -148,6 +150,7 @@ static releaseDevice_t pReleaseDevice = nu static releaseKernel_t pReleaseKernel = nullptr; static releaseMemObject_t pReleaseMemObject = nullptr; static releaseProgram_t pReleaseProgram = nullptr; +static retainMemObject_t pRetainMemObject = nullptr; static retainProgram_t pRetainProgram = nullptr; static setKernelArg_t pSetKernelArg = nullptr; static setMemObjectDestructorCallback_t pSetMemObjectDestructorCallback = nullptr; @@ -239,6 +242,7 @@ bool xmrig::OclLib::load() DLSYM(SetMemObjectDestructorCallback); DLSYM(CreateSubBuffer); DLSYM(RetainProgram); + DLSYM(RetainMemObject); # if defined(CL_VERSION_2_0) uv_dlsym(&oclLib, kCreateCommandQueueWithProperties, reinterpret_cast(&pCreateCommandQueueWithProperties)); @@ -670,6 +674,18 @@ cl_mem xmrig::OclLib::createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t } +cl_mem xmrig::OclLib::retain(cl_mem memobj) noexcept +{ + assert(pRetainMemObject != nullptr); + + if (memobj != nullptr) { + pRetainMemObject(memobj); + } + + return memobj; +} + + cl_program xmrig::OclLib::createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept { assert(pCreateProgramWithBinary != nullptr); diff --git a/src/backend/opencl/wrappers/OclLib.h b/src/backend/opencl/wrappers/OclLib.h index e9e4b8f3d..0c0eb0d4d 100644 --- a/src/backend/opencl/wrappers/OclLib.h +++ b/src/backend/opencl/wrappers/OclLib.h @@ -79,6 +79,7 @@ public: static cl_mem createBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) noexcept; static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size, cl_int *errcode_ret) noexcept; static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size); + static cl_mem retain(cl_mem memobj) noexcept; static cl_program createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept; static cl_program createProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret) noexcept; static cl_program retain(cl_program program) noexcept; From 6bc217e985d933223756237396fd9b80bde9e45c Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 30 Sep 2019 08:28:25 +0700 Subject: [PATCH 13/19] Fixed excessive memory allocation. --- src/backend/opencl/runners/OclBaseRunner.cpp | 17 +++++++++------ .../opencl/runners/tools/OclSharedData.cpp | 21 +++++++++++++++++++ .../opencl/runners/tools/OclSharedData.h | 7 ++++++- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/backend/opencl/runners/OclBaseRunner.cpp b/src/backend/opencl/runners/OclBaseRunner.cpp index 71b35edc4..d8497e94f 100644 --- a/src/backend/opencl/runners/OclBaseRunner.cpp +++ b/src/backend/opencl/runners/OclBaseRunner.cpp @@ -23,10 +23,11 @@ */ +#include "backend/opencl/runners/OclBaseRunner.h" #include "backend/opencl/cl/OclSource.h" #include "backend/opencl/OclCache.h" #include "backend/opencl/OclLaunchData.h" -#include "backend/opencl/runners/OclBaseRunner.h" +#include "backend/opencl/runners/tools/OclSharedState.h" #include "backend/opencl/wrappers/OclError.h" #include "backend/opencl/wrappers/OclLib.h" #include "base/io/log/Log.h" @@ -34,6 +35,9 @@ #include "crypto/common/VirtualMemory.h" +constexpr size_t oneGiB = 1024 * 1024 * 1024; + + xmrig::OclBaseRunner::OclBaseRunner(size_t id, const OclLaunchData &data) : m_algorithm(data.algorithm), m_ctx(data.ctx), @@ -93,16 +97,17 @@ void xmrig::OclBaseRunner::build() void xmrig::OclBaseRunner::init() { - m_queue = OclLib::createCommandQueue(m_ctx, data().device.id()); + m_queue = OclLib::createCommandQueue(m_ctx, data().device.id()); - constexpr size_t oneGiB = 1024 * 1024 * 1024; - size_t size = bufferSize(); + size_t size = align(bufferSize()); if (size < oneGiB && data().device.vendorId() == OCL_VENDOR_AMD && data().device.freeMemSize() >= oneGiB) { - size = oneGiB; + m_buffer = OclSharedState::get(data().device.index()).createBuffer(m_ctx, size, m_offset); + } + else { + m_buffer = OclLib::createBuffer(m_ctx, CL_MEM_READ_WRITE, size); } - m_buffer = OclLib::createBuffer(m_ctx, CL_MEM_READ_WRITE, size); m_input = createSubBuffer(CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY, Job::kMaxBlobSize); m_output = createSubBuffer(CL_MEM_READ_WRITE, sizeof(cl_uint) * 0x100); } diff --git a/src/backend/opencl/runners/tools/OclSharedData.cpp b/src/backend/opencl/runners/tools/OclSharedData.cpp index 51571c027..355ab7755 100644 --- a/src/backend/opencl/runners/tools/OclSharedData.cpp +++ b/src/backend/opencl/runners/tools/OclSharedData.cpp @@ -31,11 +31,30 @@ #include "crypto/rx/RxDataset.h" +#include #include #include #include +constexpr size_t oneGiB = 1024 * 1024 * 1024; + + +cl_mem xmrig::OclSharedData::createBuffer(cl_context context, size_t size, size_t &offset) +{ + std::lock_guard lock(m_mutex); + + offset += size * m_offset++; + size = std::max(size * m_threads, oneGiB); + + if (!m_buffer) { + m_buffer = OclLib::createBuffer(context, CL_MEM_READ_WRITE, size); + } + + return OclLib::retain(m_buffer); +} + + uint64_t xmrig::OclSharedData::adjustDelay(size_t id) { if (m_threads < 2) { @@ -113,6 +132,8 @@ uint64_t xmrig::OclSharedData::resumeDelay(size_t id) void xmrig::OclSharedData::release() { + OclLib::release(m_buffer); + # ifdef XMRIG_ALGO_RANDOMX OclLib::release(m_dataset); # endif diff --git a/src/backend/opencl/runners/tools/OclSharedData.h b/src/backend/opencl/runners/tools/OclSharedData.h index 75ce04830..caf7b4d66 100644 --- a/src/backend/opencl/runners/tools/OclSharedData.h +++ b/src/backend/opencl/runners/tools/OclSharedData.h @@ -45,13 +45,16 @@ class OclSharedData public: OclSharedData() = default; + cl_mem createBuffer(cl_context context, size_t size, size_t &offset); uint64_t adjustDelay(size_t id); uint64_t resumeDelay(size_t id); void release(); void setResumeCounter(uint32_t value); void setRunTime(uint64_t time); - inline OclSharedData &operator++() { ++m_threads; return *this; } + inline size_t threads() const { return m_threads; } + + inline OclSharedData &operator++() { ++m_threads; return *this; } # ifdef XMRIG_ALGO_RANDOMX cl_mem dataset() const; @@ -59,8 +62,10 @@ public: # endif private: + cl_mem m_buffer = nullptr; double m_averageRunTime = 0.0; double m_threshold = 0.95; + size_t m_offset = 0; size_t m_threads = 0; std::mutex m_mutex; uint32_t m_resumeCounter = 0; From 158d2e4302100805804eabf56faac3cd6ab424f1 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 1 Oct 2019 01:18:22 +0700 Subject: [PATCH 14/19] #1150 Fixed argon2 header conflict. --- src/3rdparty/argon2/CMakeLists.txt | 4 ++-- src/3rdparty/argon2/lib/argon2.c | 2 +- src/3rdparty/argon2/lib/core.h | 2 +- src/3rdparty/argon2/lib/encoding.h | 2 +- src/3rdparty/argon2/lib/impl-select.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/3rdparty/argon2/CMakeLists.txt b/src/3rdparty/argon2/CMakeLists.txt index f77835f3b..f800a0c89 100644 --- a/src/3rdparty/argon2/CMakeLists.txt +++ b/src/3rdparty/argon2/CMakeLists.txt @@ -38,7 +38,7 @@ if (CMAKE_C_COMPILER_ID MATCHES MSVC) elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8) function(add_feature_impl FEATURE GCC_FLAG DEF) add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c) - target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../) target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib) set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True) @@ -84,5 +84,5 @@ endif() add_library(argon2 STATIC ${ARGON2_SOURCES}) target_link_libraries(argon2 ${ARGON2_LIBS}) -target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../) target_include_directories(argon2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib) diff --git a/src/3rdparty/argon2/lib/argon2.c b/src/3rdparty/argon2/lib/argon2.c index d4d038a97..b2eafd2fd 100644 --- a/src/3rdparty/argon2/lib/argon2.c +++ b/src/3rdparty/argon2/lib/argon2.c @@ -15,7 +15,7 @@ #include #include -#include "argon2.h" +#include "3rdparty/argon2.h" #include "encoding.h" #include "core.h" diff --git a/src/3rdparty/argon2/lib/core.h b/src/3rdparty/argon2/lib/core.h index 5c67fa364..8a3227a98 100644 --- a/src/3rdparty/argon2/lib/core.h +++ b/src/3rdparty/argon2/lib/core.h @@ -14,7 +14,7 @@ #ifndef ARGON2_CORE_H #define ARGON2_CORE_H -#include "argon2.h" +#include "3rdparty/argon2.h" #if defined(_MSC_VER) #define ALIGN(n) __declspec(align(16)) diff --git a/src/3rdparty/argon2/lib/encoding.h b/src/3rdparty/argon2/lib/encoding.h index e7834e4f5..742fe888c 100644 --- a/src/3rdparty/argon2/lib/encoding.h +++ b/src/3rdparty/argon2/lib/encoding.h @@ -1,6 +1,6 @@ #ifndef ENCODING_H #define ENCODING_H -#include "argon2.h" +#include "3rdparty/argon2.h" #define ARGON2_MAX_DECODED_LANES UINT32_C(255) #define ARGON2_MIN_DECODED_SALT_LEN UINT32_C(8) diff --git a/src/3rdparty/argon2/lib/impl-select.c b/src/3rdparty/argon2/lib/impl-select.c index d618010ca..965b639e8 100644 --- a/src/3rdparty/argon2/lib/impl-select.c +++ b/src/3rdparty/argon2/lib/impl-select.c @@ -3,7 +3,7 @@ #include "impl-select.h" -#include "argon2.h" +#include "3rdparty/argon2.h" #define BENCH_SAMPLES 1024 #define BENCH_MEM_BLOCKS 512 From bc18b5d0be6d83f2bd1325172eb8163d914868d5 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 1 Oct 2019 01:25:47 +0700 Subject: [PATCH 15/19] Fixed msvc build. --- src/3rdparty/argon2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty/argon2/CMakeLists.txt b/src/3rdparty/argon2/CMakeLists.txt index f800a0c89..0217382af 100644 --- a/src/3rdparty/argon2/CMakeLists.txt +++ b/src/3rdparty/argon2/CMakeLists.txt @@ -22,7 +22,7 @@ set(ARGON2_X86_64_SOURCES arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flag if (CMAKE_C_COMPILER_ID MATCHES MSVC) function(add_feature_impl FEATURE MSVC_FLAG DEF) add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c) - target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../) target_include_directories(argon2-${FEATURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/lib) set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True) From 3badeb56a0c0b7e83bd1497d3979bf9b1c41af23 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 1 Oct 2019 07:19:13 +0700 Subject: [PATCH 16/19] Fixed support for systems where total count of NUMA nodes not equal usable count. --- src/backend/cpu/platform/HwlocCpuInfo.cpp | 2 +- src/crypto/rx/Rx.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/cpu/platform/HwlocCpuInfo.cpp b/src/backend/cpu/platform/HwlocCpuInfo.cpp index 9e5037424..244e6cd35 100644 --- a/src/backend/cpu/platform/HwlocCpuInfo.cpp +++ b/src/backend/cpu/platform/HwlocCpuInfo.cpp @@ -178,7 +178,7 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo() : BasicCpuInfo(), m_threads = countByType(m_topology, HWLOC_OBJ_PU); m_cores = countByType(m_topology, HWLOC_OBJ_CORE); - m_nodes = std::max(countByType(m_topology, HWLOC_OBJ_NUMANODE), 1); + m_nodes = std::max(hwloc_bitmap_weight(hwloc_topology_get_complete_nodeset(m_topology)), 1); m_packages = countByType(m_topology, HWLOC_OBJ_PACKAGE); if (m_nodes > 1) { diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index 8e757ddf2..8e3730adf 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -246,7 +246,7 @@ xmrig::RxDataset *xmrig::Rx::dataset(const Job &job, uint32_t nodeId) return nullptr; } - return d_ptr->datasets.at(d_ptr->isNUMA() ? nodeId : 0); + return d_ptr->datasets.at(d_ptr->isNUMA() ? (d_ptr->datasets.count(nodeId) ? nodeId : HwlocCpuInfo::nodeIndexes().front()) : 0); } From 42fd146c2b3091502a9c0c81452c69d7074d77b3 Mon Sep 17 00:00:00 2001 From: XMRig Date: Wed, 2 Oct 2019 06:35:49 +0700 Subject: [PATCH 17/19] #1212 Fixed RandomX dataset re-initialization. --- src/backend/common/Workers.cpp | 1 + src/crypto/rx/Rx.cpp | 38 +++++++++++++++++++--------------- src/crypto/rx/RxVm.h | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/backend/common/Workers.cpp b/src/backend/common/Workers.cpp index 2c90dfe02..9fb6859ea 100644 --- a/src/backend/common/Workers.cpp +++ b/src/backend/common/Workers.cpp @@ -100,6 +100,7 @@ void xmrig::Workers::start(const std::vector &data) } d_ptr->hashrate = new Hashrate(m_workers.size()); + Nonce::touch(T::backend()); for (Thread *worker : m_workers) { worker->start(Workers::onReady); diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index 9ef8c0fa2..d0674b299 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -47,6 +47,7 @@ #endif +#include #include #include #include @@ -96,12 +97,14 @@ class RxPrivate public: XMRIG_DISABLE_COPY_MOVE(RxPrivate) - inline RxPrivate() + inline RxPrivate() : + m_counter(0), + m_last(0) { m_async = new uv_async_t; m_async->data = this; - uv_async_init(uv_default_loop(), m_async, RxPrivate::onReady); + uv_async_init(uv_default_loop(), m_async, [](uv_async_t *) { d_ptr->onReady(); }); # ifdef XMRIG_FEATURE_HWLOC if (Cpu::info()->nodes() > 1) { @@ -130,11 +133,12 @@ public: inline bool isNUMA() const { return m_numa; } + inline bool isReady(const Job &job) const { return m_ready == count() && m_algorithm == job.algorithm() && m_seed == job.seed(); } inline const Algorithm &algorithm() const { return m_algorithm; } inline const Buffer &seed() const { return m_seed; } inline size_t count() const { return isNUMA() ? datasets.size() : 1; } - inline void asyncSend() { m_ready++; if (m_ready == count()) { uv_async_send(m_async); } } - + inline uint64_t counter() { return m_counter.load(std::memory_order_relaxed); } + inline void asyncSend(uint64_t counter) { m_ready++; if (m_ready == count()) { m_last = counter; uv_async_send(m_async); } } static void allocate(uint32_t nodeId) { @@ -176,14 +180,14 @@ public: } - static void initDataset(uint32_t nodeId, uint32_t threads) + static void initDataset(uint32_t nodeId, uint32_t threads, uint64_t counter) { std::lock_guard lock(mutex); const uint64_t ts = Chrono::steadyMSecs(); d_ptr->getOrAllocate(nodeId)->init(d_ptr->seed(), threads); - d_ptr->asyncSend(); + d_ptr->asyncSend(counter); LOG_INFO("%s" CYAN_BOLD("#%u") GREEN(" init done ") CYAN_BOLD("%zu/%zu") BLACK_BOLD(" (%" PRIu64 " ms)"), tag, nodeId, d_ptr->m_ready, d_ptr->count(), Chrono::steadyMSecs() - ts); } @@ -222,32 +226,31 @@ public: m_hugePages = hugePages; m_listener = listener; m_seed = job.seed(); - } - - inline bool isReady(const Job &job) - { - return m_ready == count() && m_algorithm == job.algorithm() && m_seed == job.seed(); + ++m_counter; } std::map datasets; private: - static void onReady(uv_async_t *) + inline void onReady() { - if (d_ptr->m_listener) { - d_ptr->m_listener->onDatasetReady(); + if (m_listener && counter() == m_last.load(std::memory_order_relaxed)) { + m_listener->onDatasetReady(); } } + Algorithm m_algorithm; bool m_hugePages = true; bool m_numa = true; Buffer m_seed; IRxListener *m_listener = nullptr; size_t m_ready = 0; - uv_async_t *m_async; + std::atomic m_counter; + std::atomic m_last; + uv_async_t *m_async = nullptr; }; @@ -269,6 +272,7 @@ bool xmrig::Rx::init(const Job &job, int initThreads, bool hugePages, bool numa, d_ptr->setState(job, hugePages, numa, listener); const uint32_t threads = initThreads < 1 ? static_cast(Cpu::info()->threads()) : static_cast(initThreads); const String buf = Buffer::toHex(job.seed().data(), 8); + const uint64_t counter = d_ptr->counter(); LOG_INFO("%s" MAGENTA_BOLD("init dataset%s") " algo " WHITE_BOLD("%s (") CYAN_BOLD("%u") WHITE_BOLD(" threads)") BLACK_BOLD(" seed %s..."), tag, @@ -281,14 +285,14 @@ bool xmrig::Rx::init(const Job &job, int initThreads, bool hugePages, bool numa, # ifdef XMRIG_FEATURE_HWLOC if (d_ptr->isNUMA()) { for (auto const &item : d_ptr->datasets) { - std::thread thread(RxPrivate::initDataset, item.first, threads); + std::thread thread(RxPrivate::initDataset, item.first, threads, counter); thread.detach(); } } else # endif { - std::thread thread(RxPrivate::initDataset, 0, threads); + std::thread thread(RxPrivate::initDataset, 0, threads, counter); thread.detach(); } diff --git a/src/crypto/rx/RxVm.h b/src/crypto/rx/RxVm.h index 5154b66d7..30a31c2e4 100644 --- a/src/crypto/rx/RxVm.h +++ b/src/crypto/rx/RxVm.h @@ -63,4 +63,4 @@ private: } /* namespace xmrig */ -#endif /* XMRIG_RX_CACHE_H */ +#endif /* XMRIG_RX_VM_H */ From a7e8ac6cf8d51adff5c906674af3e77fe0e34755 Mon Sep 17 00:00:00 2001 From: xmrig Date: Wed, 2 Oct 2019 07:23:49 +0700 Subject: [PATCH 18/19] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 207e70537..3dcb231f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v4.2.1-beta +- [#1150](https://github.com/xmrig/xmrig/issues/1150) Fixed build on FreeBSD. +- [#1199](https://github.com/xmrig/xmrig/issues/1199) Fixed excessive memory allocation for OpenCL threads with low intensity. +- [#1212](https://github.com/xmrig/xmrig/issues/1212) Fixed low RandomX performance after fast algorithm switching. +- Fixed support for systems where total count of NUMA nodes not equal usable nodes count. + # v4.2.0-beta - [#1202](https://github.com/xmrig/xmrig/issues/1202) Fixed algorithm verification in donate strategy. - Added per pool option `coin` with single possible value `monero` for pools without algorithm negotiation, for upcoming Monero fork. From 542a27a032db27fb1ad2bc84ff93f24d77c09eb5 Mon Sep 17 00:00:00 2001 From: xmrig Date: Wed, 2 Oct 2019 07:25:17 +0700 Subject: [PATCH 19/19] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dcb231f6..7dd9cb256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # v4.2.1-beta - [#1150](https://github.com/xmrig/xmrig/issues/1150) Fixed build on FreeBSD. +- [#1175](https://github.com/xmrig/xmrig/issues/1175) Fixed support for systems where total count of NUMA nodes not equal usable nodes count. - [#1199](https://github.com/xmrig/xmrig/issues/1199) Fixed excessive memory allocation for OpenCL threads with low intensity. - [#1212](https://github.com/xmrig/xmrig/issues/1212) Fixed low RandomX performance after fast algorithm switching. -- Fixed support for systems where total count of NUMA nodes not equal usable nodes count. # v4.2.0-beta - [#1202](https://github.com/xmrig/xmrig/issues/1202) Fixed algorithm verification in donate strategy.