diff --git a/.gitignore b/.gitignore index 3db117d49..178251c45 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ scripts/deps /CMakeLists.txt.user /.idea /src/backend/opencl/cl/cn/cryptonight_gen.cl +/.vscode \ No newline at end of file diff --git a/src/crypto/randomx/dataset.cpp b/src/crypto/randomx/dataset.cpp index e6e896728..f03cd3c07 100644 --- a/src/crypto/randomx/dataset.cpp +++ b/src/crypto/randomx/dataset.cpp @@ -32,7 +32,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * https://github.com/P-H-C/phc-winner-argon2 * Copyright 2015 * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves - */ +*/ #include <new> #include <algorithm> @@ -40,8 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <cstring> #include <limits> #include <cstring> -#include <thread> -#include <chrono> #include "crypto/randomx/common.hpp" #include "crypto/randomx/dataset.hpp" @@ -56,35 +54,31 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "3rdparty/argon2/include/argon2.h" #include "3rdparty/argon2/lib/core.h" -// static_assert(RANDOMX_ARGON_MEMORY % (RANDOMX_ARGON_LANES * ARGON2_SYNC_POINTS) == 0, "RANDOMX_ARGON_MEMORY - invalid value"); +//static_assert(RANDOMX_ARGON_MEMORY % (RANDOMX_ARGON_LANES * ARGON2_SYNC_POINTS) == 0, "RANDOMX_ARGON_MEMORY - invalid value"); static_assert(ARGON2_BLOCK_SIZE == randomx::ArgonBlockSize, "Unexpected value of ARGON2_BLOCK_SIZE"); -namespace randomx -{ +namespace randomx { - template <class Allocator> - void deallocCache(randomx_cache *cache) - { - if (cache->memory != nullptr) - { + template<class Allocator> + void deallocCache(randomx_cache* cache) { + if (cache->memory != nullptr) { Allocator::freeMemory(cache->memory, RANDOMX_CACHE_MAX_SIZE); } delete cache->jit; } - template void deallocCache<DefaultAllocator>(randomx_cache *cache); - template void deallocCache<LargePageAllocator>(randomx_cache *cache); + template void deallocCache<DefaultAllocator>(randomx_cache* cache); + template void deallocCache<LargePageAllocator>(randomx_cache* cache); - void initCache(randomx_cache *cache, const void *key, size_t keySize) - { + void initCache(randomx_cache* cache, const void* key, size_t keySize) { argon2_context context; context.out = nullptr; context.outlen = 0; - context.pwd = CONST_CAST(uint8_t *) key; + context.pwd = CONST_CAST(uint8_t *)key; context.pwdlen = (uint32_t)keySize; - context.salt = CONST_CAST(uint8_t *) RandomX_CurrentConfig.ArgonSalt; + context.salt = CONST_CAST(uint8_t *)RandomX_CurrentConfig.ArgonSalt; context.saltlen = (uint32_t)strlen(RandomX_CurrentConfig.ArgonSalt); context.secret = nullptr; context.secretlen = 0; @@ -102,28 +96,25 @@ namespace randomx argon2_ctx_mem(&context, Argon2_d, cache->memory, RandomX_CurrentConfig.ArgonMemory * 1024); randomx::Blake2Generator gen(key, keySize); - for (uint32_t i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + for (uint32_t i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) { randomx::generateSuperscalar(cache->programs[i], gen); } } - void initCacheCompile(randomx_cache *cache, const void *key, size_t keySize) - { + void initCacheCompile(randomx_cache* cache, const void* key, size_t keySize) { initCache(cache, key, keySize); -#ifdef XMRIG_SECURE_JIT +# ifdef XMRIG_SECURE_JIT cache->jit->enableWriting(); -#endif +# endif cache->jit->generateSuperscalarHash(cache->programs); cache->jit->generateDatasetInitCode(); - cache->datasetInit = cache->jit->getDatasetInitFunc(); + cache->datasetInit = cache->jit->getDatasetInitFunc(); -#ifdef XMRIG_SECURE_JIT +# ifdef XMRIG_SECURE_JIT cache->jit->enableExecution(); -#endif +# endif } constexpr uint64_t superscalarMul0 = 6364136223846793005ULL; @@ -135,16 +126,14 @@ namespace randomx constexpr uint64_t superscalarAdd6 = 3398623926847679864ULL; constexpr uint64_t superscalarAdd7 = 9549104520008361294ULL; - static inline uint8_t *getMixBlock(uint64_t registerValue, uint8_t *memory) - { + static inline uint8_t* getMixBlock(uint64_t registerValue, uint8_t *memory) { const uint32_t mask = (RandomX_CurrentConfig.ArgonMemory * randomx::ArgonBlockSize) / CacheLineSize - 1; return memory + (registerValue & mask) * CacheLineSize; } - void initDatasetItem(randomx_cache *cache, uint8_t *out, uint64_t itemNumber) - { + void initDatasetItem(randomx_cache* cache, uint8_t* out, uint64_t itemNumber) { int_reg_t rl[8]; - uint8_t *mixBlock; + uint8_t* mixBlock; uint64_t registerValue = itemNumber; rl[0] = (itemNumber + 1) * superscalarMul0; rl[1] = rl[0] ^ superscalarAdd1; @@ -154,22 +143,15 @@ namespace randomx rl[5] = rl[0] ^ superscalarAdd5; rl[6] = rl[0] ^ superscalarAdd6; rl[7] = rl[0] ^ superscalarAdd7; - for (unsigned i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) - { - // std::this_thread::sleep_for(std::chrono::milliseconds(1)); - + for (unsigned i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) { mixBlock = getMixBlock(registerValue, cache->memory); rx_prefetch_nta(mixBlock); - SuperscalarProgram &prog = cache->programs[i]; + SuperscalarProgram& prog = cache->programs[i]; executeSuperscalar(rl, prog); for (unsigned q = 0; q < 8; ++q) - { - // std::this_thread::sleep_for(std::chrono::milliseconds(1)); - rl[q] ^= load64_native(mixBlock + 8 * q); - } registerValue = rl[prog.getAddressRegister()]; } @@ -177,12 +159,8 @@ namespace randomx memcpy(out, &rl, CacheLineSize); } - void initDataset(randomx_cache *cache, uint8_t *dataset, uint32_t startItem, uint32_t endItem) - { + void initDataset(randomx_cache* cache, uint8_t* dataset, uint32_t startItem, uint32_t endItem) { for (uint32_t itemNumber = startItem; itemNumber < endItem; ++itemNumber, dataset += CacheLineSize) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); initDatasetItem(cache, dataset, itemNumber); - } } } diff --git a/src/crypto/randomx/jit_compiler_x86_static.S b/src/crypto/randomx/jit_compiler_x86_static.S index 61acaed21..9659f870b 100644 --- a/src/crypto/randomx/jit_compiler_x86_static.S +++ b/src/crypto/randomx/jit_compiler_x86_static.S @@ -24,12 +24,6 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;# .section .data -;# nanosecs: -;# .quad 0, 10000 - -;# .extern usleep - .intel_syntax noprefix #if defined(__APPLE__) .text @@ -179,17 +173,6 @@ DECL(randomx_dataset_init): push rcx ;# max. block index #endif init_block_loop: - - ;# mov rax, 35 - ;# mov rdi, nanosecs - ;# xor rsi, rsi - ;# syscall - - ;# push 100000 - ;# call usleep - ;# add esp,4 - - prefetchw byte ptr [rsi] mov rbx, rbp .byte 232 ;# 0xE8 = call @@ -245,16 +228,6 @@ DECL(randomx_dataset_init_avx2_prologue): randomx_dataset_init_avx2_prologue_loop_begin: #include "asm/program_sshash_avx2_loop_begin.inc" - ;# mov rax, 35 - ;# mov rdi, nanosecs - ;# xor rsi, rsi - ;# syscall - - ;# push 100000 - ;# call usleep - ;# add esp,4 - - ;# init integer registers (lane 0) lea r8, [rbp+1] imul r8, qword ptr [r0_avx2_mul+rip] @@ -377,4 +350,4 @@ DECL(randomx_reciprocal_fast): #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits -#endif +#endif \ No newline at end of file diff --git a/src/crypto/randomx/jit_compiler_x86_static.asm b/src/crypto/randomx/jit_compiler_x86_static.asm index 7cc922dc1..a5edc149e 100644 --- a/src/crypto/randomx/jit_compiler_x86_static.asm +++ b/src/crypto/randomx/jit_compiler_x86_static.asm @@ -24,9 +24,6 @@ ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; section .data -; secs dq 5,0 - IFDEF RAX _RANDOMX_JITX86_STATIC SEGMENT PAGE READ EXECUTE @@ -169,13 +166,6 @@ randomx_dataset_init PROC mov rbp, r8 ;# block index push r9 ;# max. block index init_block_loop: - - ;# call usleep function - ; mov rax, 35 ;# load the number of microseconds to sleep into eax - ; mov rdi, secs ;# push the argument onto the stack - ; xor rsi, rsi - ; syscall ;# call the usleep function - prefetchw byte ptr [rsi] mov rbx, rbp db 232 ;# 0xE8 = call @@ -222,12 +212,6 @@ ALIGN 64 loop_begin: include asm/program_sshash_avx2_loop_begin.inc - ;# call usleep function - ; mov rax, 35 ;# load the number of microseconds to sleep into eax - ; mov rdi, secs ;# push the argument onto the stack - ; xor rsi, rsi - ; syscall ;# call the usleep function - ;# init integer registers (lane 0) lea r8, [rbp+1] imul r8, qword ptr [r0_avx2_mul] diff --git a/src/crypto/randomx/randomx.cpp b/src/crypto/randomx/randomx.cpp index 265fb7d84..60fddfcf4 100644 --- a/src/crypto/randomx/randomx.cpp +++ b/src/crypto/randomx/randomx.cpp @@ -365,6 +365,10 @@ alignas(64) RandomX_ConfigurationBase RandomX_CurrentConfig; static std::mutex vm_pool_mutex; +const char* envRandomXNanoSeconds = std::getenv("XMRIG_RANDOMX_SLEEP_NANOSECONDS"); + +int randomx_sleep_nanoseconds = (envRandomXNanoSeconds != nullptr) ? std::atoi(envRandomXNanoSeconds) : 0; + extern "C" { randomx_cache *randomx_create_cache(randomx_flags flags, uint8_t *memory) { @@ -389,12 +393,6 @@ extern "C" { cache->initialize = &randomx::initCacheCompile; cache->datasetInit = nullptr; cache->memory = memory; - - - // cache->jit = nullptr; - // cache->initialize = &randomx::initCache; - // cache->datasetInit = &randomx::initDataset; - // cache->memory = memory; break; default: @@ -581,7 +579,7 @@ extern "C" { machine->initScratchpad(&tempHash); machine->resetRoundingMode(); for (uint32_t chain = 0; chain < RandomX_CurrentConfig.ProgramCount - 1; ++chain) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::nanoseconds(randomx_sleep_nanoseconds)); machine->run(&tempHash); rx_blake2b_wrapper::run(tempHash, sizeof(tempHash), machine->getRegisterFile(), sizeof(randomx::RegisterFile)); } @@ -599,7 +597,7 @@ extern "C" { machine->resetRoundingMode(); for (uint32_t chain = 0; chain < RandomX_CurrentConfig.ProgramCount - 1; ++chain) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::nanoseconds(randomx_sleep_nanoseconds)); machine->run(&tempHash); rx_blake2b_wrapper::run(tempHash, sizeof(tempHash), machine->getRegisterFile(), sizeof(randomx::RegisterFile)); } diff --git a/src/crypto/randomx/superscalar.cpp b/src/crypto/randomx/superscalar.cpp index 7b7dc0188..07a3f4346 100644 --- a/src/crypto/randomx/superscalar.cpp +++ b/src/crypto/randomx/superscalar.cpp @@ -26,9 +26,6 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <thread> -#include <chrono> - #include "crypto/randomx/configuration.h" #include "crypto/randomx/program.hpp" #include "crypto/randomx/blake2/endian.h" @@ -852,8 +849,6 @@ namespace randomx { void executeSuperscalar(int_reg_t(&r)[8], SuperscalarProgram& prog) { for (unsigned j = 0; j < prog.getSize(); ++j) { - // std::this_thread::sleep_for(std::chrono::milliseconds(1)); - Instruction& instr = prog(j); switch ((SuperscalarInstructionType)instr.opcode) { diff --git a/src/crypto/rx/RxDataset.cpp b/src/crypto/rx/RxDataset.cpp index a21614aa8..ce0202792 100644 --- a/src/crypto/rx/RxDataset.cpp +++ b/src/crypto/rx/RxDataset.cpp @@ -35,6 +35,10 @@ namespace xmrig { +const char* envRXDatasetSingleThreadInit = std::getenv("XMRIG_RX_DATASET_SINGLE_THREAD_INIT"); + +bool rx_dataset_single_thread_init = (envRXDatasetSingleThreadInit != nullptr); + static void init_dataset_wrapper(randomx_dataset *dataset, randomx_cache *cache, uint32_t startItem, uint32_t itemCount, int priority) { Platform::setThreadPriority(priority); @@ -108,12 +112,16 @@ bool xmrig::RxDataset::init(const Buffer &seed, uint32_t numThreads, int priorit const uint32_t a = (datasetItemCount * i) / numThreads; const uint32_t b = (datasetItemCount * (i + 1)) / numThreads; threads.emplace_back(init_dataset_wrapper, m_dataset, m_cache->get(), a, b - a, priority); - threads[i].join(); // force it to be sequential + if (rx_dataset_single_thread_init) + {threads[i].join();} // force it to be sequential + } + + if (!rx_dataset_single_thread_init){ + for (uint32_t i = 0; i < numThreads; ++i) { + threads[i].join(); + } } - // for (uint32_t i = 0; i < numThreads; ++i) { - // threads[i].join(); - // } } else { init_dataset_wrapper(m_dataset, m_cache->get(), 0, datasetItemCount, priority); diff --git a/src/donate.h b/src/donate.h index 14cdf9eae..49ab69079 100644 --- a/src/donate.h +++ b/src/donate.h @@ -37,8 +37,13 @@ * If you plan on changing donations to 0%, please consider making a one-off donation to my wallet: * XMR: 48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD */ + +#ifdef XMRIG_NO_DONATE constexpr const int kDefaultDonateLevel = 0; constexpr const int kMinimumDonateLevel = 0; - +#else +constexpr const int kDefaultDonateLevel = 1; +constexpr const int kMinimumDonateLevel = 1; +#endif #endif // XMRIG_DONATE_H