Merge xmrig v6.4.0 into master

This commit is contained in:
MoneroOcean 2020-10-18 22:04:56 +00:00
commit 2cf2fcaf8c
109 changed files with 7365 additions and 6359 deletions

View file

@ -136,7 +136,6 @@ double Benchmark::get_algo_perf(Algorithm::Id algo) const {
case Algorithm::AR2_WRKZ: return m_bench_algo_perf[BenchAlgo::AR2_WRKZ];
case Algorithm::ASTROBWT_DERO: return m_bench_algo_perf[BenchAlgo::ASTROBWT_DERO];
case Algorithm::RX_0: return m_bench_algo_perf[BenchAlgo::RX_0];
case Algorithm::RX_LOKI: return m_bench_algo_perf[BenchAlgo::RX_0];
case Algorithm::RX_SFX: return m_bench_algo_perf[BenchAlgo::RX_0];
case Algorithm::RX_WOW: return m_bench_algo_perf[BenchAlgo::RX_WOW];
case Algorithm::RX_ARQ: return m_bench_algo_perf[BenchAlgo::RX_ARQ];

View file

@ -134,8 +134,6 @@ public:
Nonce::pause(true);
}
active = true;
if (reset) {
Nonce::reset(job.index());
}
@ -146,7 +144,7 @@ public:
Nonce::touch();
if (enabled) {
if (active && enabled) {
Nonce::pause(false);
}
@ -205,7 +203,7 @@ public:
continue;
}
for (size_t i = 0; i < hr->threads(); i++) {
for (size_t i = 1; i < hr->threads(); i++) {
Value thread(kArrayType);
thread.PushBack(Hashrate::normalize(hr->calc(i, Hashrate::ShortInterval)), allocator);
thread.PushBack(Hashrate::normalize(hr->calc(i, Hashrate::MediumInterval)), allocator);
@ -244,30 +242,8 @@ public:
# endif
void printHashrate(bool details)
static inline void printProfile()
{
char num[16 * 4] = { 0 };
double speed[3] = { 0.0 };
for (auto backend : backends) {
const auto hashrate = backend->hashrate();
if (hashrate) {
speed[0] += hashrate->calc(Hashrate::ShortInterval);
speed[1] += hashrate->calc(Hashrate::MediumInterval);
speed[2] += hashrate->calc(Hashrate::LargeInterval);
}
backend->printHashrate(details);
}
double scale = 1.0;
const char* h = "H/s";
if ((speed[0] >= 1e6) || (speed[1] >= 1e6) || (speed[2] >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
scale = 1e-6;
h = "MH/s";
}
# ifdef XMRIG_FEATURE_PROFILING
ProfileScopeData* data[ProfileScopeData::MAX_DATA_COUNT];
@ -305,6 +281,41 @@ public:
i = n1;
}
# endif
}
void printHashrate(bool details)
{
char num[16 * 4] = { 0 };
double speed[3] = { 0.0 };
uint32_t count = 0;
for (auto backend : backends) {
const auto hashrate = backend->hashrate();
if (hashrate) {
++count;
speed[0] += hashrate->calc(Hashrate::ShortInterval);
speed[1] += hashrate->calc(Hashrate::MediumInterval);
speed[2] += hashrate->calc(Hashrate::LargeInterval);
}
backend->printHashrate(details);
}
if (!count) {
return;
}
printProfile();
double scale = 1.0;
const char* h = "H/s";
if ((speed[0] >= 1e6) || (speed[1] >= 1e6) || (speed[2] >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
scale = 1e-6;
h = "MH/s";
}
LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s"),
Tags::miner(),
@ -313,6 +324,12 @@ public:
Hashrate::format(speed[2] * scale, num + 16 * 2, sizeof(num) / 4), h,
Hashrate::format(maxHashrate[algorithm] * scale, num + 16 * 3, sizeof(num) / 4), h
);
# ifdef XMRIG_FEATURE_BENCHMARK
for (auto backend : backends) {
backend->printBenchProgress();
}
# endif
}
@ -536,6 +553,8 @@ void xmrig::Miner::setJob(const Job &job, bool donate)
mutex.unlock();
d_ptr->active = true;
if (ready) {
d_ptr->handleJobChange();
}
@ -573,8 +592,12 @@ void xmrig::Miner::onTimer(const Timer *)
double maxHashrate = 0.0;
const auto healthPrintTime = d_ptr->controller->config()->healthPrintTime();
bool stopMiner = false;
for (IBackend *backend : d_ptr->backends) {
backend->tick(d_ptr->ticks);
if (!backend->tick(d_ptr->ticks)) {
stopMiner = true;
}
if (healthPrintTime && d_ptr->ticks && (d_ptr->ticks % (healthPrintTime * 2)) == 0 && backend->isEnabled()) {
backend->printHealth();
@ -607,6 +630,10 @@ void xmrig::Miner::onTimer(const Timer *)
setEnabled(true);
}
}
if (stopMiner) {
stop();
}
}

View file

@ -53,11 +53,6 @@
namespace xmrig {
static const char *kCPU = "cpu";
#ifdef XMRIG_ALGO_RANDOMX
static const char *kRandomX = "randomx";
#endif
#ifdef XMRIG_FEATURE_OPENCL
static const char *kOcl = "opencl";
@ -182,10 +177,10 @@ bool xmrig::Config::read(const IJsonReader &reader, const char *fileName)
return false;
}
d_ptr->cpu.read(reader.getValue(kCPU));
d_ptr->cpu.read(reader.getValue(CpuConfig::kField));
# ifdef XMRIG_ALGO_RANDOMX
if (!d_ptr->rx.read(reader.getValue(kRandomX))) {
if (!d_ptr->rx.read(reader.getValue(RxConfig::kField))) {
m_upgrade = true;
}
# endif
@ -230,10 +225,10 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const
doc.AddMember(StringRef(kTitle), title().toJSON(), allocator);
# ifdef XMRIG_ALGO_RANDOMX
doc.AddMember(StringRef(kRandomX), rx().toJSON(doc), allocator);
doc.AddMember(StringRef(RxConfig::kField), rx().toJSON(doc), allocator);
# endif
doc.AddMember(StringRef(kCPU), cpu().toJSON(doc), allocator);
doc.AddMember(StringRef(CpuConfig::kField), cpu().toJSON(doc), allocator);
# ifdef XMRIG_FEATURE_OPENCL
doc.AddMember(StringRef(kOcl), cl().toJSON(doc), allocator);

View file

@ -24,25 +24,28 @@
#include "base/kernel/interfaces/IConfig.h"
#include "backend/cpu/CpuConfig.h"
#include "base/net/stratum/Pool.h"
#include "base/net/stratum/Pools.h"
#include "core/config/ConfigTransform.h"
#include "crypto/cn/CnHash.h"
#ifdef XMRIG_ALGO_RANDOMX
# include "crypto/rx/RxConfig.h"
#endif
namespace xmrig
{
static const char *kAffinity = "affinity";
static const char *kAsterisk = "*";
static const char *kCpu = "cpu";
static const char *kEnabled = "enabled";
static const char *kIntensity = "intensity";
static const char *kThreads = "threads";
#ifdef XMRIG_ALGO_RANDOMX
static const char *kRandomX = "randomx";
#endif
#ifdef XMRIG_FEATURE_OPENCL
static const char *kOcl = "opencl";
#endif
@ -102,8 +105,8 @@ void xmrig::ConfigTransform::finalize(rapidjson::Document &doc)
if (m_threads) {
doc.AddMember("version", 1, allocator);
if (!doc.HasMember(kCpu)) {
doc.AddMember(StringRef(kCpu), Value(kObjectType), allocator);
if (!doc.HasMember(CpuConfig::kField)) {
doc.AddMember(StringRef(CpuConfig::kField), Value(kObjectType), allocator);
}
Value profile(kObjectType);
@ -111,7 +114,7 @@ void xmrig::ConfigTransform::finalize(rapidjson::Document &doc)
profile.AddMember(StringRef(kThreads), m_threads, allocator);
profile.AddMember(StringRef(kAffinity), m_affinity, allocator);
doc[kCpu].AddMember(StringRef(kAsterisk), profile, doc.GetAllocator());
doc[CpuConfig::kField].AddMember(StringRef(kAsterisk), profile, doc.GetAllocator());
}
# ifdef XMRIG_FEATURE_OPENCL
@ -143,55 +146,57 @@ void xmrig::ConfigTransform::transform(rapidjson::Document &doc, int key, const
}
case IConfig::CPUMaxThreadsKey: /* --cpu-max-threads-hint */
return set(doc, kCpu, "max-threads-hint", static_cast<uint64_t>(strtol(arg, nullptr, 10)));
return set(doc, CpuConfig::kField, CpuConfig::kMaxThreadsHint, static_cast<uint64_t>(strtol(arg, nullptr, 10)));
case IConfig::MemoryPoolKey: /* --cpu-memory-pool */
return set(doc, kCpu, "memory-pool", static_cast<int64_t>(strtol(arg, nullptr, 10)));
return set(doc, CpuConfig::kField, CpuConfig::kMemoryPool, static_cast<int64_t>(strtol(arg, nullptr, 10)));
case IConfig::YieldKey: /* --cpu-no-yield */
return set(doc, kCpu, "yield", false);
return set(doc, CpuConfig::kField, CpuConfig::kYield, false);
case IConfig::Argon2ImplKey: /* --argon2-impl */
return set(doc, kCpu, "argon2-impl", arg);
return set(doc, CpuConfig::kField, CpuConfig::kArgon2Impl, arg);
# ifdef XMRIG_FEATURE_ASM
case IConfig::AssemblyKey: /* --asm */
return set(doc, kCpu, "asm", arg);
return set(doc, CpuConfig::kField, CpuConfig::kAsm, arg);
# endif
# ifdef XMRIG_ALGO_ASTROBWT
case IConfig::AstroBWTMaxSizeKey: /* --astrobwt-max-size */
return set(doc, kCpu, "astrobwt-max-size", static_cast<uint64_t>(strtol(arg, nullptr, 10)));
return set(doc, CpuConfig::kField, CpuConfig::kAstroBWTMaxSize, static_cast<uint64_t>(strtol(arg, nullptr, 10)));
case IConfig::AstroBWTAVX2Key: /* --astrobwt-avx2 */
return set(doc, kCpu, "astrobwt-avx2", true);
return set(doc, CpuConfig::kField, CpuConfig::kAstroBWTAVX2, true);
# endif
# ifdef XMRIG_ALGO_RANDOMX
case IConfig::RandomXInitKey: /* --randomx-init */
return set(doc, kRandomX, "init", static_cast<int64_t>(strtol(arg, nullptr, 10)));
return set(doc, RxConfig::kField, RxConfig::kInit, static_cast<int64_t>(strtol(arg, nullptr, 10)));
# ifdef XMRIG_FEATURE_HWLOC
case IConfig::RandomXNumaKey: /* --randomx-no-numa */
return set(doc, kRandomX, "numa", false);
return set(doc, RxConfig::kField, RxConfig::kNUMA, false);
# endif
case IConfig::RandomXModeKey: /* --randomx-mode */
return set(doc, kRandomX, "mode", arg);
return set(doc, RxConfig::kField, RxConfig::kMode, arg);
case IConfig::RandomX1GbPagesKey: /* --randomx-1gb-pages */
return set(doc, kRandomX, "1gb-pages", true);
return set(doc, RxConfig::kField, RxConfig::kOneGbPages, true);
case IConfig::RandomXWrmsrKey: /* --randomx-wrmsr */
if (arg == nullptr) {
return set(doc, kRandomX, "wrmsr", true);
return set(doc, RxConfig::kField, RxConfig::kWrmsr, true);
}
return set(doc, kRandomX, "wrmsr", static_cast<int64_t>(strtol(arg, nullptr, 10)));
return set(doc, RxConfig::kField, RxConfig::kWrmsr, static_cast<int64_t>(strtol(arg, nullptr, 10)));
case IConfig::RandomXRdmsrKey: /* --randomx-no-rdmsr */
return set(doc, kRandomX, "rdmsr", false);
return set(doc, RxConfig::kField, RxConfig::kRdmsr, false);
case IConfig::RandomXCacheQoSKey: /* --cache-qos */
return set(doc, kRandomX, "cache_qos", true);
return set(doc, RxConfig::kField, RxConfig::kCacheQoS, true);
# endif
# ifdef XMRIG_FEATURE_OPENCL
@ -243,6 +248,21 @@ void xmrig::ConfigTransform::transform(rapidjson::Document &doc, int key, const
return set(doc, "health-print-time", static_cast<uint64_t>(strtol(arg, nullptr, 10)));
# endif
# ifdef XMRIG_FEATURE_BENCHMARK
case IConfig::StressKey: /* --stress */
case IConfig::BenchKey: /* --bench */
set(doc, CpuConfig::kField, CpuConfig::kHugePagesJit, true);
set(doc, CpuConfig::kField, CpuConfig::kPriority, 2);
set(doc, CpuConfig::kField, CpuConfig::kYield, false);
add(doc, Pools::kPools, Pool::kUser, Pool::kBenchmark);
if (key == IConfig::BenchKey) {
add(doc, Pools::kPools, Pool::kBenchmark, arg);
}
break;
# endif
default:
break;
}
@ -253,10 +273,10 @@ void xmrig::ConfigTransform::transformBoolean(rapidjson::Document &doc, int key,
{
switch (key) {
case IConfig::HugePagesKey: /* --no-huge-pages */
return set(doc, kCpu, "huge-pages", enable);
return set(doc, CpuConfig::kField, CpuConfig::kHugePages, enable);
case IConfig::CPUKey: /* --no-cpu */
return set(doc, kCpu, kEnabled, enable);
return set(doc, CpuConfig::kField, kEnabled, enable);
default:
break;
@ -279,11 +299,11 @@ void xmrig::ConfigTransform::transformUint64(rapidjson::Document &doc, int key,
case IConfig::AVKey: /* --av */
m_intensity = intensity(arg);
set(doc, kCpu, "hw-aes", isHwAes(arg));
set(doc, CpuConfig::kField, CpuConfig::kHwAes, isHwAes(arg));
break;
case IConfig::CPUPriorityKey: /* --cpu-priority */
return set(doc, kCpu, "priority", arg);
return set(doc, CpuConfig::kField, CpuConfig::kPriority, arg);
default:
break;

View file

@ -61,6 +61,7 @@ R"===(
"cpu": {
"enabled": true,
"huge-pages": true,
"huge-pages-jit": false,
"hw-aes": null,
"priority": null,
"memory-pool": false,

View file

@ -98,6 +98,11 @@ static const option options[] = {
{ "title", 1, nullptr, IConfig::TitleKey },
{ "no-title", 0, nullptr, IConfig::NoTitleKey },
{ "pause-on-battery", 0, nullptr, IConfig::PauseOnBatteryKey },
# ifdef XMRIG_FEATURE_BENCHMARK
{ "stress", 0, nullptr, IConfig::StressKey },
{ "bench", 1, nullptr, IConfig::BenchKey },
{ "benchmark", 1, nullptr, IConfig::BenchKey },
# endif
# ifdef XMRIG_FEATURE_TLS
{ "tls", 0, nullptr, IConfig::TlsKey },
{ "tls-fingerprint", 1, nullptr, IConfig::FingerprintKey },

View file

@ -179,6 +179,11 @@ static inline const std::string &usage()
# endif
u += " --pause-on-battery pause mine on battery power\n";
# ifdef XMRIG_FEATURE_BENCHMARK
u += " --stress run continuous stress test to check system stability\n";
u += " --bench=N run benchmark in offline mode, N can be between 1M and 10M\n";
# endif
return u;
}