From 26741d686c4ef73351e3d9cf05921e9d6d9d4628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ben=20Gr=C3=A4f?= Date: Thu, 4 Jul 2019 21:35:32 +0200 Subject: [PATCH] WIP --- CMakeLists.txt | 5 ++++- cmake/flags.cmake | 9 +++++++++ src/Mem.cpp | 41 ++++++++++++++++++++++++---------------- src/Options.h | 2 ++ src/PowVariant.h | 5 +++++ src/crypto/CryptoNight.h | 1 + 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 757b26b8..4a8005c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,6 +225,9 @@ else() add_definitions(/DXMRIG_NO_ASM) endif(WITH_ASM AND NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8) +add_subdirectory(src/3rdparty/argon2) +set(ARGON2_LIBRARY argon2) + if (BUILD_STATIC) set(CMAKE_EXE_LINKER_FLAGS " -static") endif(BUILD_STATIC) @@ -250,7 +253,7 @@ add_executable(xmrigMiner ${SOURCES} ${SOURCES_CRYPTO} ${HTTPD_SOURCES} ${SOURCE set_target_properties(xmrigMiner PROPERTIES OUTPUT_NAME ${MINER_EXECUTABLE_NAME}) target_link_libraries(xmrigMiner xmrig_common xmrig_os_dependencies xmrig_cpuid ${Boost_LIBRARIES} - ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB}) + ${UV_LIBRARIES} ${MHD_LIBRARY} ${EXTRA_LIBS} ${CPUID_LIB} argon2) if (WITH_CC_CLIENT) target_link_libraries(xmrigMiner xmrig_cc_common) diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 07dd1b98..ceabcdc6 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -6,6 +6,8 @@ if ("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Release) endif() +include(CheckSymbolExists) + if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-aliasing") @@ -23,6 +25,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES GNU) else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes") + add_definitions(/DHAVE_ROTR) endif() if (WIN32) @@ -46,6 +49,7 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC) add_definitions(/D_CRT_SECURE_NO_WARNINGS) add_definitions(/D_CRT_NONSTDC_NO_WARNINGS) add_definitions(/DNOMINMAX) + add_definitions(/DHAVE_ROTR) elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang) @@ -64,6 +68,11 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang) else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes") + + check_symbol_exists("_rotr" "x86intrin.h" HAVE_ROTR) + if (HAVE_ROTR) + add_definitions(/DHAVE_ROTR) + endif() endif() endif() diff --git a/src/Mem.cpp b/src/Mem.cpp index 09720241..a71ac11c 100644 --- a/src/Mem.cpp +++ b/src/Mem.cpp @@ -56,6 +56,9 @@ ScratchPadMem Mem::create(ScratchPad** scratchPads, int threadId) case Options::ALGO_CRYPTONIGHT_HEAVY: scratchPadSize = MEMORY_HEAVY; break; + case Options::ALGO_ARGON2_512: + scratchPadSize = MEMORY_ARGON2_512; + break; case Options::ALGO_CRYPTONIGHT: default: scratchPadSize = MEMORY; @@ -63,25 +66,29 @@ ScratchPadMem Mem::create(ScratchPad** scratchPads, int threadId) } ScratchPadMem scratchPadMem; - scratchPadMem.realSize = scratchPadSize * getThreadHashFactor(threadId); - scratchPadMem.size = scratchPadSize * getThreadHashFactor(threadId); + scratchPadMem.realSize = Options::isCNAlgo(m_algo) ? scratchPadSize * getThreadHashFactor(threadId) : scratchPadSize; + scratchPadMem.size = Options::isCNAlgo(m_algo) ? scratchPadSize * getThreadHashFactor(threadId) : scratchPadSize; scratchPadMem.pages = std::max(scratchPadMem.size / MEMORY, static_cast(1)); - allocate(scratchPadMem, m_useHugePages); + if (Options::isCNAlgo(m_algo)) { + allocate(scratchPadMem, m_useHugePages); - for (size_t i = 0; i < getThreadHashFactor(threadId); ++i) { - auto* scratchPad = static_cast(_mm_malloc(sizeof(ScratchPad), 4096)); - scratchPad->memory = scratchPadMem.memory + (i * scratchPadSize); + for (size_t i = 0; i < getThreadHashFactor(threadId); ++i) { + auto *scratchPad = static_cast(_mm_malloc(sizeof(ScratchPad), 4096)); + scratchPad->memory = scratchPadMem.memory + (i * scratchPadSize); - auto* p = reinterpret_cast(allocateExecutableMemory(0x4000)); - scratchPad->generated_code = reinterpret_cast(p); - scratchPad->generated_code_double = reinterpret_cast(p + 0x2000); + auto *p = reinterpret_cast(allocateExecutableMemory(0x4000)); + scratchPad->generated_code = reinterpret_cast(p); + scratchPad->generated_code_double = reinterpret_cast(p + 0x2000); - scratchPad->generated_code_data.variant = PowVariant::LAST_ITEM; - scratchPad->generated_code_data.height = (uint64_t)(-1); - scratchPad->generated_code_double_data = scratchPad->generated_code_data; + scratchPad->generated_code_data.variant = PowVariant::LAST_ITEM; + scratchPad->generated_code_data.height = (uint64_t) (-1); + scratchPad->generated_code_double_data = scratchPad->generated_code_data; - scratchPads[i] = scratchPad; + scratchPads[i] = scratchPad; + } + } else { + scratchPadMem.hugePages = scratchPadMem.pages; } m_totalPages += scratchPadMem.pages; @@ -95,9 +102,11 @@ void Mem::release(ScratchPad** scratchPads, ScratchPadMem& scratchPadMem, int th m_totalPages -= scratchPadMem.pages; m_totalHugepages -= scratchPadMem.hugePages; - release(scratchPadMem); + if (Options::isCNAlgo(m_algo)) { + release(scratchPadMem); - for (size_t i = 0; i < getThreadHashFactor(threadId); ++i) { - _mm_free(scratchPads[i]); + for (size_t i = 0; i < getThreadHashFactor(threadId); ++i) { + _mm_free(scratchPads[i]); + } } } diff --git a/src/Options.h b/src/Options.h index 5af161ca..2c37c519 100644 --- a/src/Options.h +++ b/src/Options.h @@ -52,6 +52,7 @@ public: ALGO_CRYPTONIGHT_ULTRALITE, /* CryptoNight-Ultralite (256KB ScratchPad) */ ALGO_CRYPTONIGHT_EXTREMELITE, /* CryptoNight-Verylite (128KB ScratchPad) */ ALGO_CRYPTONIGHT_HEAVY, /* CryptoNight-Heavy (4MB ScratchPad) */ + ALGO_ARGON2_512, /* Argon2-Chuckwa (No pre allocated ScratchPad) */ }; enum AlgoVariant { @@ -126,6 +127,7 @@ public: inline int64_t multiHashThreadMask() const { return m_multiHashThreadMask; } inline void setColors(bool colors) { m_colors = colors; } + inline static bool isCNAlgo(Algo algo) { return algo != Options::ALGO_ARGON2_512; } inline static void release() { delete m_self; } const char *algoName() const; diff --git a/src/PowVariant.h b/src/PowVariant.h index a0c2f30e..f0a920b9 100644 --- a/src/PowVariant.h +++ b/src/PowVariant.h @@ -45,6 +45,7 @@ enum PowVariant POW_ZELERIUS, POW_RWZ, POW_UPX2, + POW_ARGON2_CHUKWA, LAST_ITEM }; @@ -92,6 +93,8 @@ inline std::string getPowVariantName(PowVariant powVariant) return "rwz"; case POW_UPX2: return "upx2"; + case POW_ARGON2_CHUKWA: + return "chuckwa"; case POW_AUTODETECT: default: return "-1"; @@ -179,6 +182,8 @@ inline PowVariant parseVariant(const std::string variant) powVariant = PowVariant::POW_RWZ; } else if (variant == "upx2") { powVariant = PowVariant::POW_UPX2; + } else if (variant == "chukwa" || variant == "trtl-chukwa" || variant == "argon2-chukwa") { + powVariant = PowVariant::POW_ARGON2_CHUKWA; } return powVariant; diff --git a/src/crypto/CryptoNight.h b/src/crypto/CryptoNight.h index e9e4c5e2..c51747c2 100644 --- a/src/crypto/CryptoNight.h +++ b/src/crypto/CryptoNight.h @@ -39,6 +39,7 @@ #define MEMORY_ULTRA_LITE 262144 /* 256 KiB */ #define MEMORY_EXTREME_LITE 131072 /* 128 KiB */ #define MEMORY_HEAVY 4194304 /* 4 MiB */ +#define MEMORY_ARGON2_512 524288 /* 512 KiB */ #define POW_DEFAULT_INDEX_SHIFT 3 #define POW_XLT_V4_INDEX_SHIFT 4