1
0
mirror of https://github.com/xmrig/xmrig.git synced 2026-04-18 21:32:42 -04:00

RISC-V: added vectorized dataset init (activated by setting init-avx2 to 1 in config.json)

This commit is contained in:
SChernykh
2025-11-30 19:15:15 +01:00
parent db5c6d9190
commit 7ef5142a52
9 changed files with 653 additions and 3 deletions

View File

@@ -32,6 +32,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <cassert>
#include "crypto/randomx/jit_compiler_rv64.hpp"
#include "crypto/randomx/jit_compiler_rv64_static.hpp"
#include "crypto/randomx/jit_compiler_rv64_vector.h"
#include "crypto/randomx/jit_compiler_rv64_vector_static.h"
#include "crypto/randomx/superscalar.hpp"
#include "crypto/randomx/program.hpp"
#include "crypto/randomx/reciprocal.h"
@@ -618,20 +620,32 @@ namespace randomx {
entryProgram = state.code + LiteralPoolSize + sizeDataInit;
//jal x1, SuperscalarHash
emitJump(state, ReturnReg, LiteralPoolSize + offsetFixDataCall, SuperScalarHashOffset);
vectorCodeSize = ((uint8_t*)randomx_riscv64_vector_sshash_end) - ((uint8_t*)randomx_riscv64_vector_sshash_begin);
vectorCode = static_cast<uint8_t*>(allocExecutableMemory(vectorCodeSize, hugePagesJIT && hugePagesEnable));
}
JitCompilerRV64::~JitCompilerRV64() {
freePagedMemory(state.code, CodeSize);
freePagedMemory(vectorCode, vectorCodeSize);
}
void JitCompilerRV64::enableWriting() const
{
xmrig::VirtualMemory::protectRW(entryDataInit, ExecutableSize);
if (vectorCode) {
xmrig::VirtualMemory::protectRW(vectorCode, vectorCodeSize);
}
}
void JitCompilerRV64::enableExecution() const
{
xmrig::VirtualMemory::protectRX(entryDataInit, ExecutableSize);
if (vectorCode) {
xmrig::VirtualMemory::protectRX(vectorCode, vectorCodeSize);
}
}
void JitCompilerRV64::generateProgram(Program& prog, ProgramConfiguration& pcfg, uint32_t) {
@@ -666,6 +680,11 @@ namespace randomx {
template<size_t N>
void JitCompilerRV64::generateSuperscalarHash(SuperscalarProgram(&programs)[N]) {
if (optimizedDatasetInit > 0) {
entryDataInitOptimized = generateDatasetInitVectorRV64(vectorCode, vectorCodeSize, programs, RandomX_ConfigurationBase::CacheAccesses);
return;
}
state.codePos = SuperScalarHashOffset;
state.rcpCount = 0;
state.emit(codeSshInit, sizeSshInit);
@@ -703,6 +722,10 @@ namespace randomx {
template void JitCompilerRV64::generateSuperscalarHash(SuperscalarProgram(&)[RANDOMX_CACHE_MAX_ACCESSES]);
DatasetInitFunc* JitCompilerRV64::getDatasetInitFunc() {
return (DatasetInitFunc*)((optimizedDatasetInit > 0) ? entryDataInitOptimized : entryDataInit);
}
void JitCompilerRV64::v1_IADD_RS(HANDLER_ARGS) {
state.registerUsage[isn.dst] = i;
int shift = isn.getModShift();