From 270d3ba6a2bed53d132a4d8960ba867d35776137 Mon Sep 17 00:00:00 2001 From: XMRig Date: Wed, 10 Jul 2019 10:14:33 +0700 Subject: [PATCH] Added class RxVm. --- CMakeLists.txt | 2 ++ src/crypto/rx/Rx.cpp | 48 ++++++++++++++++---------- src/crypto/rx/RxCache.h | 2 +- src/crypto/rx/RxDataset.cpp | 4 +++ src/crypto/rx/RxVm.cpp | 68 +++++++++++++++++++++++++++++++++++++ src/crypto/rx/RxVm.h | 61 +++++++++++++++++++++++++++++++++ src/workers/MultiWorker.cpp | 21 +++--------- src/workers/MultiWorker.h | 10 +++--- 8 files changed, 176 insertions(+), 40 deletions(-) create mode 100644 src/crypto/rx/RxVm.cpp create mode 100644 src/crypto/rx/RxVm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c315e1cf5..9094d3818 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,6 +197,8 @@ if (WITH_RANDOMX) src/crypto/rx/RxCache.h src/crypto/rx/RxDataset.cpp src/crypto/rx/RxDataset.h + src/crypto/rx/RxVm.cpp + src/crypto/rx/RxVm.h ) if (NOT ARCH_ID) set(ARCH_ID ${CMAKE_HOST_SYSTEM_PROCESSOR}) diff --git a/src/crypto/rx/Rx.cpp b/src/crypto/rx/Rx.cpp index 735169e2e..630dd45a5 100644 --- a/src/crypto/rx/Rx.cpp +++ b/src/crypto/rx/Rx.cpp @@ -90,29 +90,43 @@ xmrig::RxDataset *xmrig::Rx::dataset(const uint8_t *seed, const Algorithm &algor d_ptr->dataset = new RxDataset(hugePages); - const auto hugePages = d_ptr->dataset->hugePages(); - const double percent = hugePages.first == 0 ? 0.0 : static_cast(hugePages.first) / hugePages.second * 100.0; + if (d_ptr->dataset->get() != nullptr) { + const auto hugePages = d_ptr->dataset->hugePages(); + const double percent = hugePages.first == 0 ? 0.0 : static_cast(hugePages.first) / hugePages.second * 100.0; - LOG_INFO("%s" GREEN(" allocate done") " huge pages %s%u/%u %1.0f%%" CLEAR " %sJIT" BLACK_BOLD(" (%" PRIu64 " ms)"), - tag, - (hugePages.first == hugePages.second ? GREEN_BOLD_S : (hugePages.first == 0 ? RED_BOLD_S : YELLOW_BOLD_S)), - hugePages.first, - hugePages.second, - percent, - d_ptr->dataset->cache()->isJIT() ? GREEN_BOLD_S "+" : RED_BOLD_S "-", - Chrono::steadyMSecs() - ts - ); + LOG_INFO("%s" GREEN(" allocate done") " huge pages %s%u/%u %1.0f%%" CLEAR " %sJIT" BLACK_BOLD(" (%" PRIu64 " ms)"), + tag, + (hugePages.first == hugePages.second ? GREEN_BOLD_S : (hugePages.first == 0 ? RED_BOLD_S : YELLOW_BOLD_S)), + hugePages.first, + hugePages.second, + percent, + d_ptr->dataset->cache()->isJIT() ? GREEN_BOLD_S "+" : RED_BOLD_S "-", + Chrono::steadyMSecs() - ts + ); + } + else { + LOG_WARN(CLEAR "%s" YELLOW_BOLD_S " failed to allocate RandomX dataset, switching to slow mode", tag); + } } if (!d_ptr->dataset->isReady(seed, algorithm)) { const uint64_t ts = Chrono::steadyMSecs(); - LOG_INFO("%s" MAGENTA_BOLD(" init dataset") " algo " WHITE_BOLD("%s") " threads " WHITE_BOLD("%u") BLACK_BOLD(" seed %s..."), - tag, - algorithm.shortName(), - d_ptr->initThreads, - Buffer::toHex(seed, 8).data() - ); + if (d_ptr->dataset->get() != nullptr) { + LOG_INFO("%s" MAGENTA_BOLD(" init dataset") " algo " WHITE_BOLD("%s") " threads " WHITE_BOLD("%u") BLACK_BOLD(" seed %s..."), + tag, + algorithm.shortName(), + d_ptr->initThreads, + Buffer::toHex(seed, 8).data() + ); + } + else { + LOG_INFO("%s" MAGENTA_BOLD(" init cache") " algo " WHITE_BOLD("%s") BLACK_BOLD(" seed %s..."), + tag, + algorithm.shortName(), + Buffer::toHex(seed, 8).data() + ); + } d_ptr->dataset->init(seed, algorithm, d_ptr->initThreads); diff --git a/src/crypto/rx/RxCache.h b/src/crypto/rx/RxCache.h index 893ebf06e..c48924a11 100644 --- a/src/crypto/rx/RxCache.h +++ b/src/crypto/rx/RxCache.h @@ -58,7 +58,7 @@ public: static inline constexpr size_t size() { return RANDOMX_CACHE_MAX_SIZE; } private: - int m_flags = 0; + int m_flags = 0; randomx_cache *m_cache = nullptr; uint8_t m_seed[32]; }; diff --git a/src/crypto/rx/RxDataset.cpp b/src/crypto/rx/RxDataset.cpp index 5c3b9f375..603cf578c 100644 --- a/src/crypto/rx/RxDataset.cpp +++ b/src/crypto/rx/RxDataset.cpp @@ -76,6 +76,10 @@ bool xmrig::RxDataset::init(const void *seed, const Algorithm &algorithm, uint32 cache()->init(seed); + if (!get()) { + return true; + } + const uint32_t datasetItemCount = randomx_dataset_item_count(); if (numThreads > 1) { diff --git a/src/crypto/rx/RxVm.cpp b/src/crypto/rx/RxVm.cpp new file mode 100644 index 000000000..3ee0f859b --- /dev/null +++ b/src/crypto/rx/RxVm.cpp @@ -0,0 +1,68 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2019 XMR-Stak , + * Copyright 2018 Lee Clagett + * Copyright 2018-2019 tevador + * 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 "crypto/randomx/randomx.h" +#include "crypto/rx/RxCache.h" +#include "crypto/rx/RxDataset.h" +#include "crypto/rx/RxVm.h" + + +xmrig::RxVm::RxVm(RxDataset *dataset, bool hugePages, bool softAes) +{ + m_flags = RANDOMX_FLAG_JIT; + if (hugePages) { + m_flags |= RANDOMX_FLAG_LARGE_PAGES; + } + + if (!softAes) { + m_flags |= RANDOMX_FLAG_HARD_AES; + } + + if (dataset->get()) { + m_flags |= RANDOMX_FLAG_FULL_MEM; + } + + m_vm = randomx_create_vm(static_cast(m_flags), dataset->cache()->get(), dataset->get()); + + if (!m_vm) { + m_flags &= ~RANDOMX_FLAG_LARGE_PAGES; + m_vm = randomx_create_vm(static_cast(m_flags), dataset->cache()->get(), dataset->get()); + } + + if (!m_vm) { + m_flags &= ~RANDOMX_FLAG_JIT; + m_vm = randomx_create_vm(static_cast(m_flags), dataset->cache()->get(), dataset->get()); + } +} + + +xmrig::RxVm::~RxVm() +{ + if (m_vm) { + randomx_destroy_vm(m_vm); + } +} diff --git a/src/crypto/rx/RxVm.h b/src/crypto/rx/RxVm.h new file mode 100644 index 000000000..90af8187e --- /dev/null +++ b/src/crypto/rx/RxVm.h @@ -0,0 +1,61 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2019 XMR-Stak , + * Copyright 2018 Lee Clagett + * Copyright 2018-2019 tevador + * 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_RX_VM_H +#define XMRIG_RX_VM_H + + +#include + + +struct randomx_vm; + + +namespace xmrig +{ + + +class RxDataset; + + +class RxVm +{ +public: + RxVm(RxDataset *dataset, bool hugePages, bool softAes); + ~RxVm(); + + inline randomx_vm *get() const { return m_vm; } + +private: + int m_flags = 0; + randomx_vm *m_vm = nullptr; +}; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_RX_CACHE_H */ diff --git a/src/workers/MultiWorker.cpp b/src/workers/MultiWorker.cpp index 059a7171f..684d92f93 100644 --- a/src/workers/MultiWorker.cpp +++ b/src/workers/MultiWorker.cpp @@ -29,7 +29,7 @@ #include "crypto/cn/CryptoNight_test.h" #include "crypto/rx/Rx.h" -#include "crypto/rx/RxDataset.h" +#include "crypto/rx/RxVm.h" #include "net/JobResults.h" #include "workers/CpuThreadLegacy.h" #include "workers/MultiWorker.h" @@ -52,9 +52,7 @@ xmrig::MultiWorker::~MultiWorker() Mem::release(m_ctx, N, m_memory); # ifdef XMRIG_ALGO_RANDOMX - if (m_rx_vm) { - randomx_destroy_vm(m_rx_vm); - } + delete m_vm; # endif } @@ -63,18 +61,9 @@ xmrig::MultiWorker::~MultiWorker() template void xmrig::MultiWorker::allocateRandomX_VM() { - if (!m_rx_vm) { - int flags = RANDOMX_FLAG_LARGE_PAGES | RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT; - if (!m_thread->isSoftAES()) { - flags |= RANDOMX_FLAG_HARD_AES; - } - + if (!m_vm) { RxDataset *dataset = Rx::dataset(m_state.job.seedHash(), m_state.job.algorithm()); - - m_rx_vm = randomx_create_vm(static_cast(flags), nullptr, dataset->get()); - if (!m_rx_vm) { - m_rx_vm = randomx_create_vm(static_cast(flags - RANDOMX_FLAG_LARGE_PAGES), nullptr, dataset->get()); - } + m_vm = new RxVm(dataset, true, m_thread->isSoftAES()); } } #endif @@ -164,7 +153,7 @@ void xmrig::MultiWorker::start() # ifdef XMRIG_ALGO_RANDOMX if (m_state.job.algorithm().family() == Algorithm::RANDOM_X) { allocateRandomX_VM(); - randomx_calculate_hash(m_rx_vm, m_state.blob, m_state.job.size(), m_hash); + randomx_calculate_hash(m_vm->get(), m_state.blob, m_state.job.size(), m_hash); } else # endif diff --git a/src/workers/MultiWorker.h b/src/workers/MultiWorker.h index d695e0304..0502ad840 100644 --- a/src/workers/MultiWorker.h +++ b/src/workers/MultiWorker.h @@ -27,11 +27,6 @@ #define XMRIG_MULTIWORKER_H -#ifdef XMRIG_ALGO_RANDOMX -# include -#endif - - #include "base/net/stratum/Job.h" #include "Mem.h" #include "net/JobResult.h" @@ -41,6 +36,9 @@ namespace xmrig { +class RxVm; + + template class MultiWorker : public Worker { @@ -81,7 +79,7 @@ private: uint8_t m_hash[N * 32]; # ifdef XMRIG_ALGO_RANDOMX - randomx_vm *m_rx_vm = nullptr; + RxVm *m_vm = nullptr; # endif };