Merge pull request #1823 from SChernykh/dev

RandomX: added parameter for scratchpad prefetch mode
This commit is contained in:
xmrig 2020-09-04 21:31:18 +07:00 committed by GitHub
commit 0f09883429
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 71 additions and 2 deletions

View file

@ -21,7 +21,8 @@
"rdmsr": true, "rdmsr": true,
"wrmsr": true, "wrmsr": true,
"cache_qos": false, "cache_qos": false,
"numa": true "numa": true,
"scratchpad_prefetch_mode": 1
}, },
"cpu": { "cpu": {
"enabled": true, "enabled": true,

View file

@ -51,7 +51,12 @@ R"===(
"randomx": { "randomx": {
"init": -1, "init": -1,
"mode": "auto", "mode": "auto",
"numa": true "1gb-pages": false,
"rdmsr": true,
"wrmsr": true,
"cache_qos": false,
"numa": true,
"scratchpad_prefetch_mode": 1
}, },
"cpu": { "cpu": {
"enabled": true, "enabled": true,

View file

@ -211,6 +211,13 @@ RandomX_ConfigurationBase::RandomX_ConfigurationBase()
static uint32_t Log2(size_t value) { return (value > 1) ? (Log2(value / 2) + 1) : 0; } static uint32_t Log2(size_t value) { return (value > 1) ? (Log2(value / 2) + 1) : 0; }
#endif #endif
static int scratchpadPrefetchMode = 1;
void randomx_set_scratchpad_prefetch_mode(int mode)
{
scratchpadPrefetchMode = mode;
}
void RandomX_ConfigurationBase::Apply() void RandomX_ConfigurationBase::Apply()
{ {
const uint32_t ScratchpadL1Mask_Calculated = (ScratchpadL1_Size / sizeof(uint64_t) - 1) * 8; const uint32_t ScratchpadL1Mask_Calculated = (ScratchpadL1_Size / sizeof(uint64_t) - 1) * 8;
@ -240,6 +247,36 @@ void RandomX_ConfigurationBase::Apply()
*(uint32_t*)(codePrefetchScratchpadTweaked + 4) = ScratchpadL3Mask64_Calculated; *(uint32_t*)(codePrefetchScratchpadTweaked + 4) = ScratchpadL3Mask64_Calculated;
*(uint32_t*)(codePrefetchScratchpadTweaked + 18) = ScratchpadL3Mask64_Calculated; *(uint32_t*)(codePrefetchScratchpadTweaked + 18) = ScratchpadL3Mask64_Calculated;
// Apply scratchpad prefetch mode
{
uint32_t* a = (uint32_t*)(codePrefetchScratchpadTweaked + 8);
uint32_t* b = (uint32_t*)(codePrefetchScratchpadTweaked + 22);
switch (scratchpadPrefetchMode)
{
case 0:
*a = 0x00401F0FUL; // 4-byte nop
*b = 0x00401F0FUL; // 4-byte nop
break;
case 1:
default:
*a = 0x060C180FUL; // prefetcht0 [rsi+rax]
*b = 0x160C180FUL; // prefetcht0 [rsi+rdx]
break;
case 2:
*a = 0x0604180FUL; // prefetchnta [rsi+rax]
*b = 0x1604180FUL; // prefetchnta [rsi+rdx]
break;
case 3:
*a = 0x060C8B48UL; // mov rcx, [rsi+rax]
*b = 0x160C8B48UL; // mov rcx, [rsi+rdx]
break;
}
}
#define JIT_HANDLE(x, prev) randomx::JitCompilerX86::engine[k] = &randomx::JitCompilerX86::h_##x #define JIT_HANDLE(x, prev) randomx::JitCompilerX86::engine[k] = &randomx::JitCompilerX86::h_##x
#elif defined(XMRIG_ARMv8) #elif defined(XMRIG_ARMv8)

View file

@ -200,6 +200,8 @@ void randomx_apply_config(const T& config)
RandomX_CurrentConfig.Apply(); RandomX_CurrentConfig.Apply();
} }
void randomx_set_scratchpad_prefetch_mode(int mode);
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif

View file

@ -32,6 +32,7 @@
#include "base/io/log/Log.h" #include "base/io/log/Log.h"
#include "crypto/rx/RxConfig.h" #include "crypto/rx/RxConfig.h"
#include "crypto/rx/RxQueue.h" #include "crypto/rx/RxQueue.h"
#include "crypto/randomx/randomx.h"
namespace xmrig { namespace xmrig {
@ -99,6 +100,8 @@ bool xmrig::Rx::init(const T &seed, const RxConfig &config, const CpuConfig &cpu
return true; return true;
} }
randomx_set_scratchpad_prefetch_mode(config.scratchpadPrefetchMode());
if (isReady(seed)) { if (isReady(seed)) {
return true; return true;
} }

View file

@ -57,6 +57,8 @@ static const char *kCacheQoS = "cache_qos";
static const char *kNUMA = "numa"; static const char *kNUMA = "numa";
#endif #endif
static const char *kScratchpadPrefetchMode = "scratchpad_prefetch_mode";
static const std::array<const char *, RxConfig::ModeMax> modeNames = { "auto", "fast", "light" }; static const std::array<const char *, RxConfig::ModeMax> modeNames = { "auto", "fast", "light" };
@ -118,6 +120,11 @@ bool xmrig::RxConfig::read(const rapidjson::Value &value)
} }
# endif # endif
const int mode = Json::getInt(value, kScratchpadPrefetchMode, static_cast<int>(m_scratchpadPrefetchMode));
if ((mode >= ScratchpadPrefetchOff) && (mode < ScratchpadPrefetchMax)) {
m_scratchpadPrefetchMode = static_cast<ScratchpadPrefetchMode>(mode);
}
return true; return true;
} }
@ -171,6 +178,8 @@ rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const
} }
# endif # endif
obj.AddMember(StringRef(kScratchpadPrefetchMode), static_cast<int>(m_scratchpadPrefetchMode), allocator);
return obj; return obj;
} }

View file

@ -50,6 +50,14 @@ public:
ModeMax ModeMax
}; };
enum ScratchpadPrefetchMode : uint32_t {
ScratchpadPrefetchOff,
ScratchpadPrefetchT0,
ScratchpadPrefetchNTA,
ScratchpadPrefetchMov,
ScratchpadPrefetchMax,
};
bool read(const rapidjson::Value &value); bool read(const rapidjson::Value &value);
rapidjson::Value toJSON(rapidjson::Document &doc) const; rapidjson::Value toJSON(rapidjson::Document &doc) const;
@ -68,6 +76,8 @@ public:
inline bool cacheQoS() const { return m_cacheQoS; } inline bool cacheQoS() const { return m_cacheQoS; }
inline Mode mode() const { return m_mode; } inline Mode mode() const { return m_mode; }
inline ScratchpadPrefetchMode scratchpadPrefetchMode() const { return m_scratchpadPrefetchMode; }
# ifdef XMRIG_FEATURE_MSR # ifdef XMRIG_FEATURE_MSR
const char *msrPresetName() const; const char *msrPresetName() const;
const MsrItems &msrPreset() const; const MsrItems &msrPreset() const;
@ -94,6 +104,8 @@ private:
int m_threads = -1; int m_threads = -1;
Mode m_mode = AutoMode; Mode m_mode = AutoMode;
ScratchpadPrefetchMode m_scratchpadPrefetchMode = ScratchpadPrefetchT0;
# ifdef XMRIG_FEATURE_HWLOC # ifdef XMRIG_FEATURE_HWLOC
std::vector<uint32_t> m_nodeset; std::vector<uint32_t> m_nodeset;
# endif # endif