From d9adf1455112edefbfe808a37fa20464f806c925 Mon Sep 17 00:00:00 2001 From: XMRig Date: Fri, 6 Sep 2019 21:48:15 +0700 Subject: [PATCH] Improved OpenCL startup time. --- src/backend/opencl/OclBackend.cpp | 12 +++++++++++- src/backend/opencl/OclWorker.cpp | 8 +++++--- src/backend/opencl/OclWorker.h | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/backend/opencl/OclBackend.cpp b/src/backend/opencl/OclBackend.cpp index 5e46940d..0ec6cc8b 100644 --- a/src/backend/opencl/OclBackend.cpp +++ b/src/backend/opencl/OclBackend.cpp @@ -32,6 +32,7 @@ #include "backend/opencl/OclBackend.h" #include "backend/opencl/OclConfig.h" #include "backend/opencl/OclLaunchData.h" +#include "backend/opencl/OclWorker.h" #include "backend/opencl/wrappers/OclContext.h" #include "backend/opencl/wrappers/OclLib.h" #include "base/io/log/Log.h" @@ -71,7 +72,14 @@ struct OclLaunchStatus public: inline bool started() { m_started++; return m_started == m_threads; } inline size_t threads() const { return m_threads; } - inline void start(size_t threads) { m_started = 0; m_threads = threads; m_ts = Chrono::steadyMSecs(); } + + inline void start(size_t threads) + { + m_started = 0; + m_threads = threads; + m_ts = Chrono::steadyMSecs(); + OclWorker::ready = false; + } inline void print() const { @@ -309,6 +317,8 @@ void xmrig::OclBackend::start(IWorker *worker) if (d_ptr->status.started()) { d_ptr->status.print(); + + OclWorker::ready = true; } mutex.unlock(); diff --git a/src/backend/opencl/OclWorker.cpp b/src/backend/opencl/OclWorker.cpp index bd4f9126..7b92fc72 100644 --- a/src/backend/opencl/OclWorker.cpp +++ b/src/backend/opencl/OclWorker.cpp @@ -47,8 +47,10 @@ namespace xmrig { static constexpr uint32_t kReserveCount = 32768; +std::atomic OclWorker::ready; +static inline bool isReady() { return !Nonce::isPaused() && OclWorker::ready; } static inline uint32_t roundSize(uint32_t intensity) { return kReserveCount / intensity + 1; } @@ -104,7 +106,7 @@ void xmrig::OclWorker::start() cl_uint results[0x100]; while (Nonce::sequence(Nonce::OPENCL) > 0) { - if (Nonce::isPaused()) { + if (!isReady()) { if (m_interleave) { m_interleave->setResumeCounter(0); } @@ -112,7 +114,7 @@ void xmrig::OclWorker::start() do { std::this_thread::sleep_for(std::chrono::milliseconds(200)); } - while (Nonce::isPaused() && Nonce::sequence(Nonce::OPENCL) > 0); + while (!isReady() && Nonce::sequence(Nonce::OPENCL) > 0); if (Nonce::sequence(Nonce::OPENCL) == 0) { break; @@ -164,7 +166,7 @@ void xmrig::OclWorker::consumeJob() void xmrig::OclWorker::storeStats(uint64_t t) { - if (Nonce::isPaused()) { + if (!isReady()) { return; } diff --git a/src/backend/opencl/OclWorker.h b/src/backend/opencl/OclWorker.h index dcee4f0e..95c01d01 100644 --- a/src/backend/opencl/OclWorker.h +++ b/src/backend/opencl/OclWorker.h @@ -52,6 +52,8 @@ public: OclWorker &operator=(const OclWorker &other) = delete; OclWorker &operator=(OclWorker &&other) = delete; + static std::atomic ready; + protected: bool selfTest() override; void start() override;