This commit is contained in:
MoneroOcean 2019-06-18 11:17:08 -07:00
commit 58de9772f3
7 changed files with 66 additions and 40 deletions

View file

@ -156,7 +156,7 @@ add_definitions(/DUNICODE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
find_package(UV REQUIRED) find_package(UV REQUIRED)
find_package(RandomWOW REQUIRED) find_package(RandomX REQUIRED)
include(cmake/flags.cmake) include(cmake/flags.cmake)
@ -222,7 +222,7 @@ endif()
include_directories(src) include_directories(src)
include_directories(src/3rdparty) include_directories(src/3rdparty)
include_directories(${UV_INCLUDE_DIR}) include_directories(${UV_INCLUDE_DIR})
include_directories(${RANDOMWOW_INCLUDE_DIR}) include_directories(${RANDOMX_INCLUDE_DIR})
if (BUILD_STATIC) if (BUILD_STATIC)
set(CMAKE_EXE_LINKER_FLAGS " -static") set(CMAKE_EXE_LINKER_FLAGS " -static")
@ -233,4 +233,4 @@ if (WITH_DEBUG_LOG)
endif() endif()
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${HTTP_SOURCES} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES}) add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES} ${SOURCES_OS} ${SOURCES_CPUID} ${HEADERS_CRYPTO} ${SOURCES_CRYPTO} ${SOURCES_SYSLOG} ${HTTP_SOURCES} ${TLS_SOURCES} ${XMRIG_ASM_SOURCES} ${CN_GPU_SOURCES})
target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${RANDOMWOW_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB}) target_link_libraries(${CMAKE_PROJECT_NAME} ${XMRIG_ASM_LIBRARY} ${OPENSSL_LIBRARIES} ${UV_LIBRARIES} ${RANDOMX_LIBRARIES} ${EXTRA_LIBS} ${CPUID_LIB})

View file

@ -1,25 +0,0 @@
find_path(
RANDOMWOW_INCLUDE_DIR
NAMES randomwow.h
PATHS "${XMRIG_DEPS}" ENV "XMRIG_DEPS"
PATH_SUFFIXES "include"
NO_DEFAULT_PATH
)
find_path(RANDOMWOW_INCLUDE_DIR NAMES randomwow.h)
find_library(
RANDOMWOW_LIBRARY
NAMES librandomwow.a randomwow librandomwow
PATHS "${XMRIG_DEPS}" ENV "XMRIG_DEPS"
PATH_SUFFIXES "lib"
NO_DEFAULT_PATH
)
find_library(RANDOMWOW_LIBRARY NAMES librandomwow.a randomwow librandomwow)
set(RANDOMWOW_LIBRARIES ${RANDOMWOW_LIBRARY})
set(RANDOMWOW_INCLUDE_DIRS ${RANDOMWOW_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RANDOMWOW DEFAULT_MSG RANDOMWOW_LIBRARY RANDOMWOW_INCLUDE_DIR)

25
cmake/FindRandomX.cmake Normal file
View file

@ -0,0 +1,25 @@
find_path(
RANDOMX_INCLUDE_DIR
NAMES randomx.h
PATHS "${XMRIG_DEPS}" ENV "XMRIG_DEPS"
PATH_SUFFIXES "include"
NO_DEFAULT_PATH
)
find_path(RANDOMX_INCLUDE_DIR NAMES randomx.h)
find_library(
RANDOMX_LIBRARY
NAMES librandomx.a randomx librandomx
PATHS "${XMRIG_DEPS}" ENV "XMRIG_DEPS"
PATH_SUFFIXES "lib"
NO_DEFAULT_PATH
)
find_library(RANDOMX_LIBRARY NAMES librandomx.a randomx librandomx)
set(RANDOMX_LIBRARIES ${RANDOMX_LIBRARY})
set(RANDOMX_INCLUDE_DIRS ${RANDOMX_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RANDOMX DEFAULT_MSG RANDOMX_LIBRARY RANDOMX_INCLUDE_DIR)

View file

@ -36,14 +36,9 @@
template<size_t N> template<size_t N>
MultiWorker<N>::MultiWorker(ThreadHandle *handle) MultiWorker<N>::MultiWorker(ThreadHandle *handle)
: Worker(handle) : Worker(handle)
, m_rx_vm(nullptr)
{ {
m_memory = Mem::create(m_ctx, m_thread->algorithm(), N); m_memory = Mem::create(m_ctx, m_thread->algorithm(), N);
const int flags = RANDOMX_FLAG_LARGE_PAGES | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT;
m_rx_vm = randomx_create_vm(static_cast<randomx_flags>(flags), nullptr, Workers::getDataset());
if (!m_rx_vm) {
m_rx_vm = randomx_create_vm(static_cast<randomx_flags>(flags - RANDOMX_FLAG_LARGE_PAGES), nullptr, Workers::getDataset());
}
} }
@ -51,8 +46,23 @@ template<size_t N>
MultiWorker<N>::~MultiWorker() MultiWorker<N>::~MultiWorker()
{ {
Mem::release(m_ctx, N, m_memory); Mem::release(m_ctx, N, m_memory);
if (m_rx_vm) {
randomx_destroy_vm(m_rx_vm); randomx_destroy_vm(m_rx_vm);
} }
}
template<size_t N>
void MultiWorker<N>::allocateRandomX_VM()
{
if (!m_rx_vm) {
const int flags = RANDOMX_FLAG_LARGE_PAGES | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT;
m_rx_vm = randomx_create_vm(static_cast<randomx_flags>(flags), nullptr, Workers::getDataset());
if (!m_rx_vm) {
m_rx_vm = randomx_create_vm(static_cast<randomx_flags>(flags - RANDOMX_FLAG_LARGE_PAGES), nullptr, Workers::getDataset());
}
}
}
template<size_t N> template<size_t N>
@ -135,6 +145,7 @@ void MultiWorker<N>::start()
const xmrig::Variant v = m_state.job.algorithm().variant(); const xmrig::Variant v = m_state.job.algorithm().variant();
if (v == xmrig::VARIANT_RX_WOW) { if (v == xmrig::VARIANT_RX_WOW) {
allocateRandomX_VM();
Workers::updateDataset(m_state.job.seed_hash(), m_totalWays); Workers::updateDataset(m_state.job.seed_hash(), m_totalWays);
randomx_calculate_hash(m_rx_vm, m_state.blob, m_state.job.size(), m_hash); randomx_calculate_hash(m_rx_vm, m_state.blob, m_state.job.size(), m_hash);
} }

View file

@ -27,11 +27,13 @@
#define XMRIG_MULTIWORKER_H #define XMRIG_MULTIWORKER_H
#include <randomx.h>
#include "base/net/stratum/Job.h" #include "base/net/stratum/Job.h"
#include "Mem.h" #include "Mem.h"
#include "net/JobResult.h" #include "net/JobResult.h"
#include "workers/Worker.h" #include "workers/Worker.h"
#include "randomwow.h"
class Handle; class Handle;
@ -49,6 +51,8 @@ protected:
void start() override; void start() override;
private: private:
void allocateRandomX_VM();
bool resume(const xmrig::Job &job); bool resume(const xmrig::Job &job);
bool verify(xmrig::Variant variant, const uint8_t *referenceValue); bool verify(xmrig::Variant variant, const uint8_t *referenceValue);
bool verify2(xmrig::Variant variant, const uint8_t *referenceValue); bool verify2(xmrig::Variant variant, const uint8_t *referenceValue);

View file

@ -184,6 +184,7 @@ void Workers::start(xmrig::Controller *controller)
const std::vector<xmrig::IThread *> &threads = controller->config()->threads(); const std::vector<xmrig::IThread *> &threads = controller->config()->threads();
m_status.algo = controller->config()->algorithm().algo(); m_status.algo = controller->config()->algorithm().algo();
m_status.variant = controller->config()->algorithm().variant();
m_status.threads = threads.size(); m_status.threads = threads.size();
for (const xmrig::IThread *thread : threads) { for (const xmrig::IThread *thread : threads) {
@ -307,7 +308,7 @@ void Workers::threadsSummary(rapidjson::Document &doc)
{ {
uv_mutex_lock(&m_mutex); uv_mutex_lock(&m_mutex);
const uint64_t pages[2] = { m_status.hugePages, m_status.pages }; const uint64_t pages[2] = { m_status.hugePages, m_status.pages };
const uint64_t memory = m_status.ways * xmrig::cn_select_memory(m_status.algo); const uint64_t memory = m_status.ways * xmrig::cn_select_memory(m_status.algo, m_status.variant);
uv_mutex_unlock(&m_mutex); uv_mutex_unlock(&m_mutex);
auto &allocator = doc.GetAllocator(); auto &allocator = doc.GetAllocator();
@ -411,7 +412,7 @@ void Workers::start(IWorker *worker)
if (m_status.started == m_status.threads) { if (m_status.started == m_status.threads) {
const double percent = (double) m_status.hugePages / m_status.pages * 100.0; const double percent = (double) m_status.hugePages / m_status.pages * 100.0;
const size_t memory = m_status.ways * xmrig::cn_select_memory(m_status.algo) / 1024; const size_t memory = m_status.ways * xmrig::cn_select_memory(m_status.algo, m_status.variant) / 1024;
LOG_INFO(GREEN_BOLD("READY (CPU)") " threads " CYAN_BOLD("%zu(%zu)") " huge pages %s%zu/%zu %1.0f%%\x1B[0m memory " CYAN_BOLD("%zu KB") "", LOG_INFO(GREEN_BOLD("READY (CPU)") " threads " CYAN_BOLD("%zu(%zu)") " huge pages %s%zu/%zu %1.0f%%\x1B[0m memory " CYAN_BOLD("%zu KB") "",
m_status.threads, m_status.ways, m_status.threads, m_status.ways,
@ -435,6 +436,10 @@ void Workers::updateDataset(const uint8_t* seed_hash, const uint32_t num_threads
// Wait for all threads to get here // Wait for all threads to get here
do { do {
if (m_sequence.load(std::memory_order_relaxed) == 0) {
// Exit immediately if workers were stopped
return;
}
std::this_thread::yield(); std::this_thread::yield();
} while (m_rx_dataset_init_thread_counter.load() != num_threads); } while (m_rx_dataset_init_thread_counter.load() != num_threads);
@ -456,6 +461,10 @@ void Workers::updateDataset(const uint8_t* seed_hash, const uint32_t num_threads
// Wait for all threads to complete // Wait for all threads to complete
--m_rx_dataset_init_thread_counter; --m_rx_dataset_init_thread_counter;
do { do {
if (m_sequence.load(std::memory_order_relaxed) == 0) {
// Exit immediately if workers were stopped
return;
}
std::this_thread::yield(); std::this_thread::yield();
} while (m_rx_dataset_init_thread_counter.load() != 0); } while (m_rx_dataset_init_thread_counter.load() != 0);
} }

View file

@ -31,11 +31,11 @@
#include <list> #include <list>
#include <uv.h> #include <uv.h>
#include <vector> #include <vector>
#include <randomx.h>
#include "base/net/stratum/Job.h" #include "base/net/stratum/Job.h"
#include "net/JobResult.h" #include "net/JobResult.h"
#include "rapidjson/fwd.h" #include "rapidjson/fwd.h"
#include "randomwow.h"
class Hashrate; class Hashrate;
@ -95,7 +95,8 @@ private:
started(0), started(0),
threads(0), threads(0),
ways(0), ways(0),
algo(xmrig::CRYPTONIGHT) algo(xmrig::CRYPTONIGHT),
variant(xmrig::VARIANT_AUTO)
{} {}
size_t hugePages; size_t hugePages;
@ -104,6 +105,7 @@ private:
size_t threads; size_t threads;
size_t ways; size_t ways;
xmrig::Algo algo; xmrig::Algo algo;
xmrig::Variant variant;
}; };
static bool m_active; static bool m_active;