From ad7141fe21742a775b296bbd8a32fc99d494ae7b Mon Sep 17 00:00:00 2001 From: XMRig Date: Thu, 12 Sep 2019 13:49:27 +0700 Subject: [PATCH] Implemented option "dataset_host". --- src/backend/opencl/OclBackend.cpp | 2 +- .../opencl/runners/tools/OclRxDataset.cpp | 19 ++++++++++++++++--- .../opencl/runners/tools/OclRxDataset.h | 10 ++++++++-- src/backend/opencl/wrappers/OclContext.cpp | 4 ++-- src/backend/opencl/wrappers/OclContext.h | 5 ++++- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/backend/opencl/OclBackend.cpp b/src/backend/opencl/OclBackend.cpp index 6471ccd6..b9f5d35a 100644 --- a/src/backend/opencl/OclBackend.cpp +++ b/src/backend/opencl/OclBackend.cpp @@ -305,7 +305,7 @@ void xmrig::OclBackend::setJob(const Job &job) return stop(); } - if (!d_ptr->context.init(d_ptr->devices, threads)) { + if (!d_ptr->context.init(d_ptr->devices, threads, job)) { LOG_WARN("%s " RED_BOLD("disabled") YELLOW(" (OpenCL context unavailable)"), tag); return stop(); diff --git a/src/backend/opencl/runners/tools/OclRxDataset.cpp b/src/backend/opencl/runners/tools/OclRxDataset.cpp index a3b54952..b1d83bd0 100644 --- a/src/backend/opencl/runners/tools/OclRxDataset.cpp +++ b/src/backend/opencl/runners/tools/OclRxDataset.cpp @@ -23,19 +23,32 @@ */ -#include "backend/opencl/wrappers/OclLib.h" #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 Algorithm &algorithm, bool host) +void xmrig::OclRxDataset::createBuffer(cl_context ctx, const Job &job, bool host) { + if (m_dataset) { + return; + } + cl_int ret; if (host) { - // TODO use host memory for dataset + 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 index 198d4075..314a2f5d 100644 --- a/src/backend/opencl/runners/tools/OclRxDataset.h +++ b/src/backend/opencl/runners/tools/OclRxDataset.h @@ -26,6 +26,9 @@ #define XMRIG_OCLRXDATASET_H +#include "base/tools/Object.h" + + #include @@ -36,17 +39,20 @@ using cl_mem = struct _cl_mem *; namespace xmrig { -class Algorithm; +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 Algorithm &algorithm, bool host); + void createBuffer(cl_context ctx,const Job &job, bool host); private: cl_mem m_dataset = nullptr; diff --git a/src/backend/opencl/wrappers/OclContext.cpp b/src/backend/opencl/wrappers/OclContext.cpp index e390478f..a2559335 100644 --- a/src/backend/opencl/wrappers/OclContext.cpp +++ b/src/backend/opencl/wrappers/OclContext.cpp @@ -42,7 +42,7 @@ xmrig::OclContext::~OclContext() } -bool xmrig::OclContext::init(const std::vector &devices, std::vector &threads) +bool xmrig::OclContext::init(const std::vector &devices, std::vector &threads, const Job &job) { if (!m_ctx) { std::vector ids(devices.size()); @@ -62,7 +62,7 @@ bool xmrig::OclContext::init(const std::vector &devices, std::vector< # ifdef XMRIG_ALGO_RANDOMX if (data.algorithm.family() == Algorithm::RANDOM_X) { - data.dataset->createBuffer(m_ctx, data.algorithm, data.thread.isDatasetHost()); + data.dataset->createBuffer(m_ctx, job, data.thread.isDatasetHost()); } # endif } diff --git a/src/backend/opencl/wrappers/OclContext.h b/src/backend/opencl/wrappers/OclContext.h index f5f5380a..8f2cc432 100644 --- a/src/backend/opencl/wrappers/OclContext.h +++ b/src/backend/opencl/wrappers/OclContext.h @@ -37,6 +37,9 @@ using cl_context = struct _cl_context *; namespace xmrig { +class Job; + + class OclContext { public: @@ -46,7 +49,7 @@ public: OclContext(const OclDevice &device); ~OclContext(); - bool init(const std::vector &devices, std::vector &threads); + bool init(const std::vector &devices, std::vector &threads, const Job &job); inline bool isValid() const { return m_ctx != nullptr; } inline cl_context ctx() const { return m_ctx; }