From 426bc8f0c4eade47396a16c6ac59c245004d48fc Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 9 Nov 2019 17:29:12 +0100 Subject: [PATCH 1/4] Optimized hashrate calculation --- src/backend/common/Hashrate.cpp | 48 +++++++++++++-------------------- src/backend/common/Hashrate.h | 3 --- src/backend/common/Workers.cpp | 2 -- 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/backend/common/Hashrate.cpp b/src/backend/common/Hashrate.cpp index 1c9873e0..dedb7495 100644 --- a/src/backend/common/Hashrate.cpp +++ b/src/backend/common/Hashrate.cpp @@ -47,7 +47,6 @@ inline static const char *format(double h, char *buf, size_t size) xmrig::Hashrate::Hashrate(size_t threads) : - m_highest(0.0), m_threads(threads) { m_counts = new uint64_t*[threads]; @@ -100,30 +99,30 @@ double xmrig::Hashrate::calc(size_t threadId, size_t ms) const uint64_t earliestHashCount = 0; uint64_t earliestStamp = 0; - uint64_t lastestStamp = 0; - uint64_t lastestHashCnt = 0; bool haveFullSet = false; - for (size_t i = 1; i < kBucketSize; i++) { - const size_t idx = (m_top[threadId] - i) & kBucketMask; + const uint64_t timeStampLimit = xmrig::Chrono::highResolutionMSecs() - ms; + uint64_t* timestamps = m_timestamps[threadId]; + uint64_t* counts = m_counts[threadId]; - if (m_timestamps[threadId][idx] == 0) { + const size_t idx_start = (m_top[threadId] - 1) & kBucketMask; + size_t idx = idx_start; + + uint64_t lastestStamp = timestamps[idx]; + uint64_t lastestHashCnt = counts[idx]; + + do { + if (timestamps[idx] < timeStampLimit) { + haveFullSet = (timestamps[idx] != 0); + if (idx != idx_start) { + idx = (idx + 1) & kBucketMask; + earliestStamp = timestamps[idx]; + earliestHashCount = counts[idx]; + } break; } - - if (lastestStamp == 0) { - lastestStamp = m_timestamps[threadId][idx]; - lastestHashCnt = m_counts[threadId][idx]; - } - - if (xmrig::Chrono::highResolutionMSecs() - m_timestamps[threadId][idx] > ms) { - haveFullSet = true; - break; - } - - earliestStamp = m_timestamps[threadId][idx]; - earliestHashCount = m_counts[threadId][idx]; - } + idx = (idx - 1) & kBucketMask; + } while (idx != idx_start); if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) { return nan(""); @@ -150,15 +149,6 @@ void xmrig::Hashrate::add(size_t threadId, uint64_t count, uint64_t timestamp) } -void xmrig::Hashrate::updateHighest() -{ - double highest = calc(ShortInterval); - if (std::isnormal(highest) && highest > m_highest) { - m_highest = highest; - } -} - - const char *xmrig::Hashrate::format(double h, char *buf, size_t size) { return ::format(h, buf, size); diff --git a/src/backend/common/Hashrate.h b/src/backend/common/Hashrate.h index b9ca8430..ba60d2ad 100644 --- a/src/backend/common/Hashrate.h +++ b/src/backend/common/Hashrate.h @@ -53,9 +53,7 @@ public: double calc(size_t ms) const; double calc(size_t threadId, size_t ms) const; void add(size_t threadId, uint64_t count, uint64_t timestamp); - void updateHighest(); - inline double highest() const { return m_highest; } inline size_t threads() const { return m_threads; } static const char *format(double h, char *buf, size_t size); @@ -70,7 +68,6 @@ private: constexpr static size_t kBucketSize = 2 << 11; constexpr static size_t kBucketMask = kBucketSize - 1; - double m_highest; size_t m_threads; uint32_t* m_top; uint64_t** m_counts; diff --git a/src/backend/common/Workers.cpp b/src/backend/common/Workers.cpp index 319f2804..8e195b66 100644 --- a/src/backend/common/Workers.cpp +++ b/src/backend/common/Workers.cpp @@ -144,8 +144,6 @@ void xmrig::Workers::tick(uint64_t) d_ptr->hashrate->add(handle->id(), handle->worker()->hashCount(), handle->worker()->timestamp()); } - - d_ptr->hashrate->updateHighest(); } From e450e62b40a9b4a6e570c057a978790429392c72 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 10 Nov 2019 13:54:10 +0700 Subject: [PATCH 2/4] v4.6.1 --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index c3c67996..e4fcc736 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 miner" -#define APP_VERSION "4.6.0-beta" +#define APP_VERSION "4.6.1-evo" #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 4 #define APP_VER_MINOR 6 -#define APP_VER_PATCH 0 +#define APP_VER_PATCH 1 #ifdef _MSC_VER # if (_MSC_VER >= 1920) From 2abea46a87743f076759843136d7e3af3015b670 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 10 Nov 2019 22:05:52 +0700 Subject: [PATCH 3/4] #1273 Fixed crash when use "GET /2/backends" API endpoint with disabled CUDA. --- src/backend/cuda/CudaBackend.cpp | 24 +++++++++++++----------- src/backend/cuda/wrappers/CudaLib.h | 5 +++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/backend/cuda/CudaBackend.cpp b/src/backend/cuda/CudaBackend.cpp index feb1dd93..812ee270 100644 --- a/src/backend/cuda/CudaBackend.cpp +++ b/src/backend/cuda/CudaBackend.cpp @@ -474,19 +474,21 @@ rapidjson::Value xmrig::CudaBackend::toJSON(rapidjson::Document &doc) const out.AddMember("algo", d_ptr->algo.toJSON(), allocator); out.AddMember("profile", profileName().toJSON(), allocator); - Value versions(kObjectType); - versions.AddMember("cuda-runtime", Value(CudaLib::version(d_ptr->runtimeVersion).c_str(), allocator), allocator); - versions.AddMember("cuda-driver", Value(CudaLib::version(d_ptr->driverVersion).c_str(), allocator), allocator); - versions.AddMember("plugin", String(CudaLib::pluginVersion()).toJSON(doc), allocator); + if (CudaLib::isReady()) { + Value versions(kObjectType); + versions.AddMember("cuda-runtime", Value(CudaLib::version(d_ptr->runtimeVersion).c_str(), allocator), allocator); + versions.AddMember("cuda-driver", Value(CudaLib::version(d_ptr->driverVersion).c_str(), allocator), allocator); + versions.AddMember("plugin", String(CudaLib::pluginVersion()).toJSON(doc), allocator); -# ifdef XMRIG_FEATURE_NVML - if (NvmlLib::isReady()) { - versions.AddMember("nvml", StringRef(NvmlLib::version()), allocator); - versions.AddMember("driver", StringRef(NvmlLib::driverVersion()), allocator); +# ifdef XMRIG_FEATURE_NVML + if (NvmlLib::isReady()) { + versions.AddMember("nvml", StringRef(NvmlLib::version()), allocator); + versions.AddMember("driver", StringRef(NvmlLib::driverVersion()), allocator); + } +# endif + + out.AddMember("versions", versions, allocator); } -# endif - - out.AddMember("versions", versions, allocator); if (d_ptr->threads.empty() || !hashrate()) { return out; diff --git a/src/backend/cuda/wrappers/CudaLib.h b/src/backend/cuda/wrappers/CudaLib.h index 10ef24fe..f18ed350 100644 --- a/src/backend/cuda/wrappers/CudaLib.h +++ b/src/backend/cuda/wrappers/CudaLib.h @@ -69,8 +69,9 @@ public: static const char *lastError() noexcept; static void close(); - static inline bool isInitialized() { return m_initialized; } - static inline const String &loader() { return m_loader; } + static inline bool isInitialized() { return m_initialized; } + static inline bool isReady() noexcept { return m_ready; } + static inline const String &loader() { return m_loader; } static bool cnHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t height, uint64_t target, uint32_t *rescount, uint32_t *resnonce); static bool deviceInit(nvid_ctx *ctx) noexcept; From d19c152d9affa308338534359947c4e66025d2b4 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 10 Nov 2019 22:09:18 +0700 Subject: [PATCH 4/4] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e908ca5..c9909de4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v4.6.1-beta +- [#1272](https://github.com/xmrig/xmrig/pull/1272) Optimized hashrate calculation. +- [#1273](https://github.com/xmrig/xmrig/issues/1273) Fixed crash when use `GET /2/backends` API endpoint with disabled CUDA. + # v4.6.0-beta - [#1263](https://github.com/xmrig/xmrig/pull/1263) Added new option `dataset_host` for NVIDIA GPUs with less than 4 GB memory (RandomX only).