This commit is contained in:
commit
df7a8d1a52
42 changed files with 1040 additions and 893 deletions
|
@ -45,7 +45,7 @@ static const uint64_t blake2b_IV[8] = {
|
|||
UINT64_C(0x510e527fade682d1), UINT64_C(0x9b05688c2b3e6c1f),
|
||||
UINT64_C(0x1f83d9abfb41bd6b), UINT64_C(0x5be0cd19137e2179) };
|
||||
|
||||
static const unsigned int blake2b_sigma[12][16] = {
|
||||
static const uint8_t blake2b_sigma[12][16] = {
|
||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
|
||||
{14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3},
|
||||
{11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4},
|
||||
|
|
|
@ -41,7 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define RANDOMX_DATASET_MAX_SIZE 2181038080
|
||||
|
||||
// Increase it if some configs use larger programs
|
||||
#define RANDOMX_PROGRAM_MAX_SIZE 512
|
||||
#define RANDOMX_PROGRAM_MAX_SIZE 320
|
||||
|
||||
// Increase it if some configs use larger scratchpad
|
||||
#define RANDOMX_SCRATCHPAD_L3_MAX_SIZE 2097152
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -67,52 +67,55 @@ namespace randomx {
|
|||
size_t getCodeSize();
|
||||
|
||||
alignas(64) static InstructionGeneratorX86 engine[256];
|
||||
|
||||
int registerUsage[RegistersCount];
|
||||
uint8_t* allocatedCode;
|
||||
uint8_t* code;
|
||||
uint32_t codePos;
|
||||
uint32_t codePosFirst;
|
||||
uint32_t vm_flags;
|
||||
|
||||
# ifdef XMRIG_FIX_RYZEN
|
||||
std::pair<const void*, const void*> mainLoopBounds;
|
||||
# endif
|
||||
int32_t codePos;
|
||||
int32_t codePosFirst;
|
||||
uint32_t vm_flags;
|
||||
|
||||
static bool BranchesWithin32B;
|
||||
bool BranchesWithin32B = false;
|
||||
bool hasAVX;
|
||||
bool hasXOP;
|
||||
|
||||
static void applyTweaks();
|
||||
uint8_t* allocatedCode;
|
||||
|
||||
void applyTweaks();
|
||||
void generateProgramPrologue(Program&, ProgramConfiguration&);
|
||||
void generateProgramEpilogue(Program&, ProgramConfiguration&);
|
||||
template<bool rax>
|
||||
static void genAddressReg(const Instruction&, uint8_t* code, int& codePos);
|
||||
static void genAddressRegDst(const Instruction&, uint8_t* code, int& codePos);
|
||||
static void genAddressImm(const Instruction&, uint8_t* code, int& codePos);
|
||||
static void genSIB(int scale, int index, int base, uint8_t* code, int& codePos);
|
||||
static void genAddressReg(const Instruction&, const uint32_t src, uint8_t* code, uint32_t& codePos);
|
||||
static void genAddressRegDst(const Instruction&, uint8_t* code, uint32_t& codePos);
|
||||
static void genAddressImm(const Instruction&, uint8_t* code, uint32_t& codePos);
|
||||
static void genSIB(int scale, int index, int base, uint8_t* code, uint32_t& codePos);
|
||||
|
||||
void generateSuperscalarCode(Instruction &, std::vector<uint64_t> &);
|
||||
|
||||
static void emitByte(uint8_t val, uint8_t* code, int& codePos) {
|
||||
static void emitByte(uint8_t val, uint8_t* code, uint32_t& codePos) {
|
||||
code[codePos] = val;
|
||||
++codePos;
|
||||
}
|
||||
|
||||
static void emit32(uint32_t val, uint8_t* code, int& codePos) {
|
||||
static void emit32(uint32_t val, uint8_t* code, uint32_t& codePos) {
|
||||
memcpy(code + codePos, &val, sizeof val);
|
||||
codePos += sizeof val;
|
||||
}
|
||||
|
||||
static void emit64(uint64_t val, uint8_t* code, int& codePos) {
|
||||
static void emit64(uint64_t val, uint8_t* code, uint32_t& codePos) {
|
||||
memcpy(code + codePos, &val, sizeof val);
|
||||
codePos += sizeof val;
|
||||
}
|
||||
|
||||
template<size_t N>
|
||||
static void emit(const uint8_t (&src)[N], uint8_t* code, int& codePos) {
|
||||
static void emit(const uint8_t (&src)[N], uint8_t* code, uint32_t& codePos) {
|
||||
emit(src, N, code, codePos);
|
||||
}
|
||||
|
||||
static void emit(const uint8_t* src, size_t count, uint8_t* code, int& codePos) {
|
||||
static void emit(const uint8_t* src, size_t count, uint8_t* code, uint32_t& codePos) {
|
||||
memcpy(code + codePos, src, count);
|
||||
codePos += count;
|
||||
}
|
||||
|
|
|
@ -42,6 +42,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#endif
|
||||
|
||||
#include "backend/cpu/Cpu.h"
|
||||
#include "crypto/common/VirtualMemory.h"
|
||||
#include <mutex>
|
||||
|
||||
#include <cassert>
|
||||
|
||||
|
@ -312,6 +314,8 @@ RandomX_ConfigurationKeva RandomX_KevaConfig;
|
|||
|
||||
alignas(64) RandomX_ConfigurationBase RandomX_CurrentConfig;
|
||||
|
||||
static std::mutex vm_pool_mutex;
|
||||
|
||||
extern "C" {
|
||||
|
||||
randomx_cache *randomx_create_cache(randomx_flags flags, uint8_t *memory) {
|
||||
|
@ -396,45 +400,75 @@ extern "C" {
|
|||
delete dataset;
|
||||
}
|
||||
|
||||
randomx_vm *randomx_create_vm(randomx_flags flags, randomx_cache *cache, randomx_dataset *dataset, uint8_t *scratchpad) {
|
||||
randomx_vm* randomx_create_vm(randomx_flags flags, randomx_cache* cache, randomx_dataset* dataset, uint8_t* scratchpad, uint32_t node) {
|
||||
assert(cache != nullptr || (flags & RANDOMX_FLAG_FULL_MEM));
|
||||
assert(cache == nullptr || cache->isInitialized());
|
||||
assert(dataset != nullptr || !(flags & RANDOMX_FLAG_FULL_MEM));
|
||||
|
||||
randomx_vm *vm = nullptr;
|
||||
randomx_vm* vm = nullptr;
|
||||
|
||||
std::lock_guard<std::mutex> lock(vm_pool_mutex);
|
||||
|
||||
static uint8_t* vm_pool[64] = {};
|
||||
static size_t vm_pool_offset[64] = {};
|
||||
|
||||
constexpr size_t VM_POOL_SIZE = 2 * 1024 * 1024;
|
||||
|
||||
if (node >= 64) {
|
||||
node = 0;
|
||||
}
|
||||
|
||||
if (!vm_pool[node]) {
|
||||
vm_pool[node] = (uint8_t*) xmrig::VirtualMemory::allocateLargePagesMemory(VM_POOL_SIZE);
|
||||
if (!vm_pool[node]) {
|
||||
vm_pool[node] = (uint8_t*) rx_aligned_alloc(VM_POOL_SIZE, 4096);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void* p = vm_pool[node] + vm_pool_offset[node];
|
||||
size_t vm_size = 0;
|
||||
|
||||
try {
|
||||
switch (flags & (RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES)) {
|
||||
case RANDOMX_FLAG_DEFAULT:
|
||||
vm = new randomx::InterpretedLightVmDefault();
|
||||
vm = new(p) randomx::InterpretedLightVmDefault();
|
||||
vm_size = sizeof(randomx::InterpretedLightVmDefault);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_FULL_MEM:
|
||||
vm = new randomx::InterpretedVmDefault();
|
||||
vm = new(p) randomx::InterpretedVmDefault();
|
||||
vm_size = sizeof(randomx::InterpretedVmDefault);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_JIT:
|
||||
vm = new randomx::CompiledLightVmDefault();
|
||||
vm = new(p) randomx::CompiledLightVmDefault();
|
||||
vm_size = sizeof(randomx::CompiledLightVmDefault);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT:
|
||||
vm = new randomx::CompiledVmDefault();
|
||||
vm = new(p) randomx::CompiledVmDefault();
|
||||
vm_size = sizeof(randomx::CompiledVmDefault);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_HARD_AES:
|
||||
vm = new randomx::InterpretedLightVmHardAes();
|
||||
vm = new(p) randomx::InterpretedLightVmHardAes();
|
||||
vm_size = sizeof(randomx::InterpretedLightVmHardAes);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_HARD_AES:
|
||||
vm = new randomx::InterpretedVmHardAes();
|
||||
vm = new(p) randomx::InterpretedVmHardAes();
|
||||
vm_size = sizeof(randomx::InterpretedVmHardAes);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
||||
vm = new randomx::CompiledLightVmHardAes();
|
||||
vm = new(p) randomx::CompiledLightVmHardAes();
|
||||
vm_size = sizeof(randomx::CompiledLightVmHardAes);
|
||||
break;
|
||||
|
||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
||||
vm = new randomx::CompiledVmHardAes();
|
||||
vm = new(p) randomx::CompiledVmHardAes();
|
||||
vm_size = sizeof(randomx::CompiledVmHardAes);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -453,10 +487,16 @@ extern "C" {
|
|||
vm->setFlags(flags);
|
||||
}
|
||||
catch (std::exception &ex) {
|
||||
delete vm;
|
||||
vm = nullptr;
|
||||
}
|
||||
|
||||
if (vm) {
|
||||
vm_pool_offset[node] += vm_size;
|
||||
if (vm_pool_offset[node] + 4096 > VM_POOL_SIZE) {
|
||||
vm_pool_offset[node] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return vm;
|
||||
}
|
||||
|
||||
|
@ -472,9 +512,8 @@ extern "C" {
|
|||
machine->setDataset(dataset);
|
||||
}
|
||||
|
||||
void randomx_destroy_vm(randomx_vm *machine) {
|
||||
assert(machine != nullptr);
|
||||
delete machine;
|
||||
void randomx_destroy_vm(randomx_vm* vm) {
|
||||
vm->~randomx_vm();
|
||||
}
|
||||
|
||||
void randomx_calculate_hash(randomx_vm *machine, const void *input, size_t inputSize, void *output) {
|
||||
|
|
|
@ -119,9 +119,9 @@ struct RandomX_ConfigurationBase
|
|||
rx_vec_i128 fillAes4Rx4_Key[8];
|
||||
|
||||
uint8_t codeShhPrefetchTweaked[20];
|
||||
uint8_t codeReadDatasetTweaked[256];
|
||||
uint8_t codeReadDatasetTweaked[64];
|
||||
uint32_t codeReadDatasetTweakedSize;
|
||||
uint8_t codeReadDatasetRyzenTweaked[256];
|
||||
uint8_t codeReadDatasetRyzenTweaked[76];
|
||||
uint32_t codeReadDatasetRyzenTweakedSize;
|
||||
uint8_t codeReadDatasetLightSshInitTweaked[68];
|
||||
uint8_t codePrefetchScratchpadTweaked[32];
|
||||
|
@ -308,7 +308,7 @@ RANDOMX_EXPORT void randomx_release_dataset(randomx_dataset *dataset);
|
|||
* (3) cache parameter is NULL and RANDOMX_FLAG_FULL_MEM is not set
|
||||
* (4) dataset parameter is NULL and RANDOMX_FLAG_FULL_MEM is set
|
||||
*/
|
||||
RANDOMX_EXPORT randomx_vm *randomx_create_vm(randomx_flags flags, randomx_cache *cache, randomx_dataset *dataset, uint8_t *scratchpad);
|
||||
RANDOMX_EXPORT randomx_vm *randomx_create_vm(randomx_flags flags, randomx_cache *cache, randomx_dataset *dataset, uint8_t *scratchpad, uint32_t node);
|
||||
|
||||
/**
|
||||
* Reinitializes a virtual machine with a new Cache. This function should be called anytime
|
||||
|
|
|
@ -41,16 +41,8 @@ namespace randomx {
|
|||
class CompiledVm : public VmBase<softAes>
|
||||
{
|
||||
public:
|
||||
void* operator new(size_t size) {
|
||||
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
||||
if (ptr == nullptr)
|
||||
throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void operator delete(void* ptr) {
|
||||
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(CompiledVm));
|
||||
}
|
||||
void* operator new(size_t, void* ptr) { return ptr; }
|
||||
void operator delete(void*) {}
|
||||
|
||||
void setDataset(randomx_dataset* dataset) override;
|
||||
void run(void* seed) override;
|
||||
|
|
|
@ -37,16 +37,8 @@ namespace randomx {
|
|||
class CompiledLightVm : public CompiledVm<softAes>
|
||||
{
|
||||
public:
|
||||
void* operator new(size_t size) {
|
||||
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
||||
if (ptr == nullptr)
|
||||
throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void operator delete(void* ptr) {
|
||||
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(CompiledLightVm));
|
||||
}
|
||||
void* operator new(size_t, void* ptr) { return ptr; }
|
||||
void operator delete(void*) {}
|
||||
|
||||
void setCache(randomx_cache* cache) override;
|
||||
void setDataset(randomx_dataset* dataset) override { }
|
||||
|
|
|
@ -49,16 +49,8 @@ namespace randomx {
|
|||
using VmBase<softAes>::datasetPtr;
|
||||
using VmBase<softAes>::datasetOffset;
|
||||
|
||||
void* operator new(size_t size) {
|
||||
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
||||
if (ptr == nullptr)
|
||||
throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void operator delete(void* ptr) {
|
||||
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(InterpretedVm));
|
||||
}
|
||||
void* operator new(size_t, void* ptr) { return ptr; }
|
||||
void operator delete(void*) {}
|
||||
|
||||
void run(void* seed) override;
|
||||
void setDataset(randomx_dataset* dataset) override;
|
||||
|
|
|
@ -39,16 +39,8 @@ namespace randomx {
|
|||
using VmBase<softAes>::mem;
|
||||
using VmBase<softAes>::cachePtr;
|
||||
|
||||
void* operator new(size_t size) {
|
||||
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
||||
if (ptr == nullptr)
|
||||
throw std::bad_alloc();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void operator delete(void* ptr) {
|
||||
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(InterpretedLightVm));
|
||||
}
|
||||
void* operator new(size_t, void* ptr) { return ptr; }
|
||||
void operator delete(void*) {}
|
||||
|
||||
void setDataset(randomx_dataset* dataset) override { }
|
||||
void setCache(randomx_cache* cache) override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue