Merge branch 'pr1713' into evo

This commit is contained in:
XMRig 2020-06-05 19:17:48 +07:00
commit 33bfecd49b
No known key found for this signature in database
GPG key ID: 446A53638BE94409
6 changed files with 47 additions and 37 deletions

View file

@ -238,7 +238,7 @@ public:
# ifdef XMRIG_ALGO_KAWPOW # ifdef XMRIG_ALGO_KAWPOW
if (algo.family() == Algorithm::KAWPOW) { if (algo.family() == Algorithm::KAWPOW) {
const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH; const uint32_t epoch = job.height() / KPHash::EPOCH_LENGTH;
mem_used = (KPCache::cache_size(epoch) + KPCache::dag_size(epoch)) / oneMiB; mem_used = (KPCache::dag_size(epoch) + oneMiB - 1) / oneMiB;
} }
# endif # endif

View file

@ -66,15 +66,16 @@ bool xmrig::CudaKawPowRunner::set(const Job &job, uint8_t *blob)
const uint64_t start_ms = Chrono::steadyMSecs(); const uint64_t start_ms = Chrono::steadyMSecs();
const bool result = CudaLib::kawPowPrepare(m_ctx, cache.data(), cache.size(), cache.dag_size(epoch), height, dag_sizes); const bool result = CudaLib::kawPowPrepare(m_ctx, cache.data(), cache.size(), cache.l1_cache(), cache.dag_size(epoch), height, dag_sizes);
if (!result) { if (!result) {
LOG_ERR("%s " YELLOW("KawPow") RED(" failed to initialize DAG: ") RED_BOLD("%s"), Tags::nvidia(), CudaLib::lastError(m_ctx)); LOG_ERR("%s " YELLOW("KawPow") RED(" failed to initialize DAG: ") RED_BOLD("%s"), Tags::nvidia(), CudaLib::lastError(m_ctx));
} }
else {
const int64_t dt = Chrono::steadyMSecs() - start_ms; const int64_t dt = Chrono::steadyMSecs() - start_ms;
if (dt > 1000) { if (dt > 1000) {
LOG_INFO("%s " YELLOW("KawPow") " DAG for epoch " WHITE_BOLD("%u") " calculated " BLACK_BOLD("(%" PRIu64 "ms)"), Tags::nvidia(), epoch, dt); LOG_INFO("%s " YELLOW("KawPow") " DAG for epoch " WHITE_BOLD("%u") " calculated " BLACK_BOLD("(%" PRIu64 "ms)"), Tags::nvidia(), epoch, dt);
} }
}
return result; return result;
} }

View file

@ -66,7 +66,7 @@ static const char *kRelease = "release";
static const char *kRxHash = "rxHash"; static const char *kRxHash = "rxHash";
static const char *kRxPrepare = "rxPrepare"; static const char *kRxPrepare = "rxPrepare";
static const char *kKawPowHash = "kawPowHash"; static const char *kKawPowHash = "kawPowHash";
static const char *kKawPowPrepare = "kawPowPrepare"; static const char *kKawPowPrepare_v2 = "kawPowPrepare_v2";
static const char *kKawPowStopHash = "kawPowStopHash"; static const char *kKawPowStopHash = "kawPowStopHash";
static const char *kSetJob = "setJob"; static const char *kSetJob = "setJob";
static const char *kSetJob_v2 = "setJob_v2"; static const char *kSetJob_v2 = "setJob_v2";
@ -92,7 +92,7 @@ using release_t = void (*)(nvid_ctx *);
using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *); using rxHash_t = bool (*)(nvid_ctx *, uint32_t, uint64_t, uint32_t *, uint32_t *);
using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t); using rxPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, bool, uint32_t);
using kawPowHash_t = bool (*)(nvid_ctx *, uint8_t*, uint64_t, uint32_t *, uint32_t *, uint32_t *); using kawPowHash_t = bool (*)(nvid_ctx *, uint8_t*, uint64_t, uint32_t *, uint32_t *, uint32_t *);
using kawPowPrepare_t = bool (*)(nvid_ctx *, const void *, size_t, size_t, uint32_t, const uint64_t*); using kawPowPrepare_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const void *, size_t, uint32_t, const uint64_t*);
using kawPowStopHash_t = bool (*)(nvid_ctx *); using kawPowStopHash_t = bool (*)(nvid_ctx *);
using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, int32_t); using setJob_t = bool (*)(nvid_ctx *, const void *, size_t, int32_t);
using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *); using setJob_v2_t = bool (*)(nvid_ctx *, const void *, size_t, const char *);
@ -118,7 +118,7 @@ static release_t pRelease = nullptr;
static rxHash_t pRxHash = nullptr; static rxHash_t pRxHash = nullptr;
static rxPrepare_t pRxPrepare = nullptr; static rxPrepare_t pRxPrepare = nullptr;
static kawPowHash_t pKawPowHash = nullptr; static kawPowHash_t pKawPowHash = nullptr;
static kawPowPrepare_t pKawPowPrepare = nullptr; static kawPowPrepare_v2_t pKawPowPrepare_v2 = nullptr;
static kawPowStopHash_t pKawPowStopHash = nullptr; static kawPowStopHash_t pKawPowStopHash = nullptr;
static setJob_t pSetJob = nullptr; static setJob_t pSetJob = nullptr;
static setJob_v2_t pSetJob_v2 = nullptr; static setJob_v2_t pSetJob_v2 = nullptr;
@ -214,9 +214,9 @@ bool xmrig::CudaLib::kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t targe
} }
bool xmrig::CudaLib::kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept bool xmrig::CudaLib::kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept
{ {
return pKawPowPrepare(ctx, cache, cache_size, dag_size, height, dag_sizes); return pKawPowPrepare_v2(ctx, cache, cache_size, dag_precalc, dag_size, height, dag_sizes);
} }
@ -375,7 +375,7 @@ bool xmrig::CudaLib::load()
DLSYM(AstroBWTHash); DLSYM(AstroBWTHash);
DLSYM(AstroBWTPrepare); DLSYM(AstroBWTPrepare);
DLSYM(KawPowHash); DLSYM(KawPowHash);
DLSYM(KawPowPrepare); DLSYM(KawPowPrepare_v2);
DLSYM(KawPowStopHash); DLSYM(KawPowStopHash);
DLSYM(Version); DLSYM(Version);

View file

@ -81,7 +81,7 @@ public:
static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept; static bool rxHash(nvid_ctx *ctx, uint32_t startNonce, uint64_t target, uint32_t *rescount, uint32_t *resnonce) noexcept;
static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept; static bool rxPrepare(nvid_ctx *ctx, const void *dataset, size_t datasetSize, bool dataset_host, uint32_t batchSize) noexcept;
static bool kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept; static bool kawPowHash(nvid_ctx *ctx, uint8_t* job_blob, uint64_t target, uint32_t *rescount, uint32_t *resnonce, uint32_t *skipped_hashes) noexcept;
static bool kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept; static bool kawPowPrepare(nvid_ctx *ctx, const void* cache, size_t cache_size, const void* dag_precalc, size_t dag_size, uint32_t height, const uint64_t* dag_sizes) noexcept;
static bool kawPowStopHash(nvid_ctx *ctx) noexcept; static bool kawPowStopHash(nvid_ctx *ctx) noexcept;
static bool setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept; static bool setJob(nvid_ctx *ctx, const void *data, size_t size, const Algorithm &algorithm) noexcept;
static const char *deviceName(nvid_ctx *ctx) noexcept; static const char *deviceName(nvid_ctx *ctx) noexcept;

View file

@ -1,14 +1,6 @@
/* XMRig /* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com> * Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org> * Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2018-2019 tevador <tevador@gmail.com>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -26,6 +18,8 @@
#include <cinttypes> #include <cinttypes>
#include <algorithm>
#include <thread>
#include "crypto/kawpow/KPCache.h" #include "crypto/kawpow/KPCache.h"
#include "3rdparty/libethash/data_sizes.h" #include "3rdparty/libethash/data_sizes.h"
@ -83,8 +77,30 @@ bool KPCache::init(uint32_t epoch)
cache.num_parent_nodes = cache.cache_size / sizeof(node); cache.num_parent_nodes = cache.cache_size / sizeof(node);
calculate_fast_mod_data(cache.num_parent_nodes, cache.reciprocal, cache.increment, cache.shift); calculate_fast_mod_data(cache.num_parent_nodes, cache.reciprocal, cache.increment, cache.shift);
for (uint32_t i = 0; i < sizeof(m_l1Cache) / sizeof(node); ++i) { const uint64_t cache_nodes = (size + sizeof(node) * 4 - 1) / sizeof(node);
ethash_calculate_dag_item_opt(((node*)m_l1Cache) + i, i, num_dataset_parents, &cache); m_DAGCache.resize(cache_nodes * (sizeof(node) / sizeof(uint32_t)));
// Init DAG cache
{
const uint64_t n = std::max(std::thread::hardware_concurrency(), 1U);
std::vector<std::thread> threads;
threads.reserve(n);
for (uint64_t i = 0; i < n; ++i) {
const uint32_t a = (cache_nodes * i) / n;
const uint32_t b = (cache_nodes * (i + 1)) / n;
threads.emplace_back([this, a, b, cache_nodes, &cache]() {
for (uint32_t j = a; j < b; ++j) {
ethash_calculate_dag_item_opt(((node*)m_DAGCache.data()) + j, j, num_dataset_parents, &cache);
}
});
}
for (auto& t : threads) {
t.join();
}
} }
m_size = size; m_size = size;

View file

@ -1,14 +1,6 @@
/* XMRig /* XMRig
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2019 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018 Lee Clagett <https://github.com/vtnerd>
* Copyright 2018-2019 tevador <tevador@gmail.com>
* Copyright 2018-2020 SChernykh <https://github.com/SChernykh> * Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -30,6 +22,7 @@
#include "base/tools/Object.h" #include "base/tools/Object.h"
#include <mutex> #include <mutex>
#include <vector>
namespace xmrig namespace xmrig
@ -57,7 +50,7 @@ public:
size_t size() const { return m_size; } size_t size() const { return m_size; }
uint32_t epoch() const { return m_epoch; } uint32_t epoch() const { return m_epoch; }
const uint32_t* l1_cache() const { return m_l1Cache; } const uint32_t* l1_cache() const { return m_DAGCache.data(); }
static uint64_t cache_size(uint32_t epoch); static uint64_t cache_size(uint32_t epoch);
static uint64_t dag_size(uint32_t epoch); static uint64_t dag_size(uint32_t epoch);
@ -71,7 +64,7 @@ private:
VirtualMemory* m_memory = nullptr; VirtualMemory* m_memory = nullptr;
size_t m_size = 0; size_t m_size = 0;
uint32_t m_epoch = 0xFFFFFFFFUL; uint32_t m_epoch = 0xFFFFFFFFUL;
uint32_t m_l1Cache[l1_cache_num_items] = {}; std::vector<uint32_t> m_DAGCache;
}; };