diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fee50e8..d3ce86f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -156,7 +156,7 @@ add_definitions(/DUNICODE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") find_package(UV REQUIRED) -find_package(RandomWOW REQUIRED) +find_package(RandomX REQUIRED) include(cmake/flags.cmake) @@ -222,7 +222,7 @@ endif() include_directories(src) include_directories(src/3rdparty) include_directories(${UV_INCLUDE_DIR}) -include_directories(${RANDOMWOW_INCLUDE_DIR}) +include_directories(${RANDOMX_INCLUDE_DIR}) if (BUILD_STATIC) set(CMAKE_EXE_LINKER_FLAGS " -static") @@ -233,4 +233,4 @@ if (WITH_DEBUG_LOG) 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}) -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}) diff --git a/cmake/FindRandomWOW.cmake b/cmake/FindRandomWOW.cmake deleted file mode 100644 index c1db649f..00000000 --- a/cmake/FindRandomWOW.cmake +++ /dev/null @@ -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) diff --git a/cmake/FindRandomX.cmake b/cmake/FindRandomX.cmake new file mode 100644 index 00000000..5696d563 --- /dev/null +++ b/cmake/FindRandomX.cmake @@ -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) diff --git a/src/workers/MultiWorker.cpp b/src/workers/MultiWorker.cpp index 40caf380..aed38d63 100644 --- a/src/workers/MultiWorker.cpp +++ b/src/workers/MultiWorker.cpp @@ -36,14 +36,9 @@ template MultiWorker::MultiWorker(ThreadHandle *handle) : Worker(handle) + , m_rx_vm(nullptr) { 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(flags), nullptr, Workers::getDataset()); - if (!m_rx_vm) { - m_rx_vm = randomx_create_vm(static_cast(flags - RANDOMX_FLAG_LARGE_PAGES), nullptr, Workers::getDataset()); - } } @@ -51,7 +46,22 @@ template MultiWorker::~MultiWorker() { Mem::release(m_ctx, N, m_memory); - randomx_destroy_vm(m_rx_vm); + if (m_rx_vm) { + randomx_destroy_vm(m_rx_vm); + } +} + + +template +void MultiWorker::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(flags), nullptr, Workers::getDataset()); + if (!m_rx_vm) { + m_rx_vm = randomx_create_vm(static_cast(flags - RANDOMX_FLAG_LARGE_PAGES), nullptr, Workers::getDataset()); + } + } } @@ -135,6 +145,7 @@ void MultiWorker::start() const xmrig::Variant v = m_state.job.algorithm().variant(); if (v == xmrig::VARIANT_RX_WOW) { + allocateRandomX_VM(); Workers::updateDataset(m_state.job.seed_hash(), m_totalWays); randomx_calculate_hash(m_rx_vm, m_state.blob, m_state.job.size(), m_hash); } diff --git a/src/workers/MultiWorker.h b/src/workers/MultiWorker.h index 98acded9..912fd099 100644 --- a/src/workers/MultiWorker.h +++ b/src/workers/MultiWorker.h @@ -27,11 +27,13 @@ #define XMRIG_MULTIWORKER_H +#include + + #include "base/net/stratum/Job.h" #include "Mem.h" #include "net/JobResult.h" #include "workers/Worker.h" -#include "randomwow.h" class Handle; @@ -49,6 +51,8 @@ protected: void start() override; private: + void allocateRandomX_VM(); + bool resume(const xmrig::Job &job); bool verify(xmrig::Variant variant, const uint8_t *referenceValue); bool verify2(xmrig::Variant variant, const uint8_t *referenceValue); diff --git a/src/workers/Workers.cpp b/src/workers/Workers.cpp index b7ad8fb7..f69280c0 100644 --- a/src/workers/Workers.cpp +++ b/src/workers/Workers.cpp @@ -184,6 +184,7 @@ void Workers::start(xmrig::Controller *controller) const std::vector &threads = controller->config()->threads(); m_status.algo = controller->config()->algorithm().algo(); + m_status.variant = controller->config()->algorithm().variant(); m_status.threads = threads.size(); for (const xmrig::IThread *thread : threads) { @@ -307,7 +308,7 @@ void Workers::threadsSummary(rapidjson::Document &doc) { uv_mutex_lock(&m_mutex); 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); auto &allocator = doc.GetAllocator(); @@ -411,7 +412,7 @@ void Workers::start(IWorker *worker) if (m_status.started == m_status.threads) { 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") "", 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 do { + if (m_sequence.load(std::memory_order_relaxed) == 0) { + // Exit immediately if workers were stopped + return; + } std::this_thread::yield(); } 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 --m_rx_dataset_init_thread_counter; do { + if (m_sequence.load(std::memory_order_relaxed) == 0) { + // Exit immediately if workers were stopped + return; + } std::this_thread::yield(); } while (m_rx_dataset_init_thread_counter.load() != 0); } diff --git a/src/workers/Workers.h b/src/workers/Workers.h index 9bd65790..4cb08bde 100644 --- a/src/workers/Workers.h +++ b/src/workers/Workers.h @@ -31,11 +31,11 @@ #include #include #include +#include #include "base/net/stratum/Job.h" #include "net/JobResult.h" #include "rapidjson/fwd.h" -#include "randomwow.h" class Hashrate; @@ -95,7 +95,8 @@ private: started(0), threads(0), ways(0), - algo(xmrig::CRYPTONIGHT) + algo(xmrig::CRYPTONIGHT), + variant(xmrig::VARIANT_AUTO) {} size_t hugePages; @@ -104,6 +105,7 @@ private: size_t threads; size_t ways; xmrig::Algo algo; + xmrig::Variant variant; }; static bool m_active;