From e051564d73b09aca2f80a1ce5cac783d5ce6e720 Mon Sep 17 00:00:00 2001 From: James Brown Date: Fri, 3 May 2024 21:14:48 +0800 Subject: [PATCH 1/8] Update Miner.cpp Add library --- src/core/Miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 9cc9092b..1f8ef504 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -19,7 +19,7 @@ #include #include #include - +#include #include "core/Miner.h" #include "core/Taskbar.h" From 7ad834de927eab715622adc76dc01a44c7b91bbf Mon Sep 17 00:00:00 2001 From: James Brown Date: Fri, 3 May 2024 21:21:33 +0800 Subject: [PATCH 2/8] Update Miner.h Add attribute sleepNanoSeconds --- src/core/Miner.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/Miner.h b/src/core/Miner.h index bb4293d0..26883cb3 100644 --- a/src/core/Miner.h +++ b/src/core/Miner.h @@ -48,6 +48,8 @@ public: Miner(Controller *controller); ~Miner() override; + int sleepNanoSeconds; + bool isEnabled() const; bool isEnabled(const Algorithm &algorithm) const; const Algorithms &algorithms() const; From d170db1ed3c3d85c46c22705588aec41c3929607 Mon Sep 17 00:00:00 2001 From: James Brown Date: Fri, 3 May 2024 21:25:47 +0800 Subject: [PATCH 3/8] Update Miner.cpp Parse value from the environment variable named as XMRIG_SLEEP_NANOSECONDS --- src/core/Miner.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 1f8ef504..4aa86fba 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -380,6 +380,14 @@ public: xmrig::Miner::Miner(Controller *controller) : d_ptr(new MinerPrivate(controller)) { + + + // Read the environment variable + const char* envNanoSeconds = std::getenv("XMRIG_SLEEP_NANOSECONDS"); + + // Default value if not configured + sleepNanoSeconds = (envNanoSeconds != nullptr) ? std::atoi(envNanoSeconds) : 0; + const int priority = controller->config()->cpu().priority(); if (priority >= 0) { Platform::setProcessPriority(priority); From 531657cb4584caf64e04da315f566553be6302d8 Mon Sep 17 00:00:00 2001 From: James Brown Date: Fri, 3 May 2024 21:29:19 +0800 Subject: [PATCH 4/8] Update Miner.cpp Add the effective line which enables slowing down the mining process by sleeping for given nanoseconds --- src/core/Miner.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 4aa86fba..95389b2e 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -457,6 +457,8 @@ const std::vector &xmrig::Miner::backends() const xmrig::Job xmrig::Miner::job() const { + std::this_thread::sleep_for(std::chrono::nanoseconds(sleepNanoSeconds)); + std::lock_guard lock(mutex); return d_ptr->job; From ce09c5b0893d0ccb68c2f370cb63b287782d94a6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 4 May 2024 11:06:10 +0800 Subject: [PATCH 5/8] Final adjustments to make RandomX truely throttled --- sccache.log | 0 src/crypto/randomx/dataset.cpp | 70 ++++++++++++------- src/crypto/randomx/jit_compiler_x86_static.S | 27 +++++++ .../randomx/jit_compiler_x86_static.asm | 16 +++++ src/crypto/randomx/randomx.cpp | 10 +++ src/crypto/randomx/superscalar.cpp | 5 ++ src/crypto/rx/RxDataset.cpp | 7 +- src/donate.h | 4 +- 8 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 sccache.log diff --git a/sccache.log b/sccache.log new file mode 100644 index 00000000..e69de29b diff --git a/src/crypto/randomx/dataset.cpp b/src/crypto/randomx/dataset.cpp index f03cd3c0..e6e89672 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 #include @@ -40,6 +40,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include #include "crypto/randomx/common.hpp" #include "crypto/randomx/dataset.hpp" @@ -54,31 +56,35 @@ 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 - void deallocCache(randomx_cache* cache) { - if (cache->memory != nullptr) { + template + void deallocCache(randomx_cache *cache) + { + if (cache->memory != nullptr) + { Allocator::freeMemory(cache->memory, RANDOMX_CACHE_MAX_SIZE); } delete cache->jit; } - template void deallocCache(randomx_cache* cache); - template void deallocCache(randomx_cache* cache); + template void deallocCache(randomx_cache *cache); + template void deallocCache(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; @@ -96,25 +102,28 @@ 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) { + for (uint32_t i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) + { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); 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; @@ -126,14 +135,16 @@ 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; @@ -143,15 +154,22 @@ 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) { + for (unsigned i = 0; i < RandomX_CurrentConfig.CacheAccesses; ++i) + { + // std::this_thread::sleep_for(std::chrono::milliseconds(1)); + 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()]; } @@ -159,8 +177,12 @@ 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 ba0cc69d..61acaed2 100644 --- a/src/crypto/randomx/jit_compiler_x86_static.S +++ b/src/crypto/randomx/jit_compiler_x86_static.S @@ -24,6 +24,12 @@ # 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 @@ -173,6 +179,17 @@ 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 @@ -228,6 +245,16 @@ 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] diff --git a/src/crypto/randomx/jit_compiler_x86_static.asm b/src/crypto/randomx/jit_compiler_x86_static.asm index a5edc149..7cc922dc 100644 --- a/src/crypto/randomx/jit_compiler_x86_static.asm +++ b/src/crypto/randomx/jit_compiler_x86_static.asm @@ -24,6 +24,9 @@ ; 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 @@ -166,6 +169,13 @@ 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 @@ -212,6 +222,12 @@ 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 9047293b..265fb7d8 100644 --- a/src/crypto/randomx/randomx.cpp +++ b/src/crypto/randomx/randomx.cpp @@ -45,6 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "crypto/common/VirtualMemory.h" #include +#include +#include #include #include "crypto/rx/Profiler.h" @@ -387,6 +389,12 @@ 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: @@ -573,6 +581,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)); machine->run(&tempHash); rx_blake2b_wrapper::run(tempHash, sizeof(tempHash), machine->getRegisterFile(), sizeof(randomx::RegisterFile)); } @@ -590,6 +599,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)); 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 07a3f434..7b7dc018 100644 --- a/src/crypto/randomx/superscalar.cpp +++ b/src/crypto/randomx/superscalar.cpp @@ -26,6 +26,9 @@ 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 +#include + #include "crypto/randomx/configuration.h" #include "crypto/randomx/program.hpp" #include "crypto/randomx/blake2/endian.h" @@ -849,6 +852,8 @@ 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 86b3a3f6..a21614aa 100644 --- a/src/crypto/rx/RxDataset.cpp +++ b/src/crypto/rx/RxDataset.cpp @@ -108,11 +108,12 @@ 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 } - 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 206b1b8f..14cdf9ea 100644 --- a/src/donate.h +++ b/src/donate.h @@ -37,8 +37,8 @@ * If you plan on changing donations to 0%, please consider making a one-off donation to my wallet: * XMR: 48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD */ -constexpr const int kDefaultDonateLevel = 1; -constexpr const int kMinimumDonateLevel = 1; +constexpr const int kDefaultDonateLevel = 0; +constexpr const int kMinimumDonateLevel = 0; #endif // XMRIG_DONATE_H From b9af8762d0fc33047d8f2414fc1ba5162f4fc7b4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 5 May 2024 17:31:22 +0800 Subject: [PATCH 6/8] Update code --- .gitignore | 1 + src/crypto/randomx/dataset.cpp | 70 +++++++------------ src/crypto/randomx/jit_compiler_x86_static.S | 29 +------- .../randomx/jit_compiler_x86_static.asm | 16 ----- src/crypto/randomx/randomx.cpp | 14 ++-- src/crypto/randomx/superscalar.cpp | 5 -- src/crypto/rx/RxDataset.cpp | 16 +++-- src/donate.h | 7 +- 8 files changed, 50 insertions(+), 108 deletions(-) diff --git a/.gitignore b/.gitignore index 3db117d4..178251c4 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 e6e89672..f03cd3c0 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 #include @@ -40,8 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include -#include #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 - void deallocCache(randomx_cache *cache) - { - if (cache->memory != nullptr) - { + template + void deallocCache(randomx_cache* cache) { + if (cache->memory != nullptr) { Allocator::freeMemory(cache->memory, RANDOMX_CACHE_MAX_SIZE); } delete cache->jit; } - template void deallocCache(randomx_cache *cache); - template void deallocCache(randomx_cache *cache); + template void deallocCache(randomx_cache* cache); + template void deallocCache(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 61acaed2..9659f870 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 7cc922dc..a5edc149 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 265fb7d8..60fddfcf 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 7b7dc018..07a3f434 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 -#include - #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 a21614aa..ce020279 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 14cdf9ea..49ab6907 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 From e702b3e095978a6d9294fa63f29c137047f6db76 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 5 May 2024 17:34:18 +0800 Subject: [PATCH 7/8] Remove unwanted files From 05f8b796d1c7ca9d87cbdf695d479e9610eeb01a Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 5 May 2024 17:53:09 +0800 Subject: [PATCH 8/8] Update donation flags --- .gitignore | 3 ++- CMakeLists.txt | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 178251c4..ade56427 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ scripts/deps /CMakeLists.txt.user /.idea /src/backend/opencl/cl/cn/cryptonight_gen.cl -/.vscode \ No newline at end of file +/.vscode +/..bfg-report \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 70d57d10..ad45d6fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.5) project(xmrig) +option(WITH_DONATION "Enable donation" ON) option(WITH_HWLOC "Enable hwloc support" ON) option(WITH_CN_LITE "Enable CryptoNight-Lite algorithms family" ON) option(WITH_CN_HEAVY "Enable CryptoNight-Heavy algorithms family" ON) @@ -135,6 +136,13 @@ if (CMAKE_C_COMPILER_ID MATCHES GNU) set_source_files_properties(src/crypto/cn/CnHash.cpp PROPERTIES COMPILE_FLAGS "-Ofast -fno-tree-vectorize") endif() +if(WITH_DONATION) + message("-- Donation state: enabled") +else() + message("-- Donation state: disabled") + add_definitions(-DXMRIG_NO_DONATE) +endif() + if (WITH_VAES) add_definitions(-DXMRIG_VAES) set(HEADERS_CRYPTO "${HEADERS_CRYPTO}" src/crypto/cn/CryptoNight_x86_vaes.h)