Rewrite memory allocation.

This commit is contained in:
XMRig 2018-04-15 11:08:47 +07:00
parent 4b71b7aa29
commit 9125b6c251
19 changed files with 212 additions and 224 deletions

View file

@ -38,15 +38,6 @@ namespace xmrig {
class CpuThread : public IThread
{
public:
enum Multiway {
SingleWay = 1,
DoubleWay,
TripleWay,
QuadWay,
PentaWay
};
struct Data
{
inline Data() : valid(false), affinity(-1L), multiway(SingleWay) {}
@ -68,7 +59,7 @@ public:
CpuThread(size_t index, Algo algorithm, AlgoVariant av, Multiway multiway, int64_t affinity, int priority, bool softAES, bool prefetch);
~CpuThread();
typedef void (*cn_hash_fun)(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx);
typedef void (*cn_hash_fun)(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx **ctx);
static cn_hash_fun fn(Algo algorithm, AlgoVariant av, Variant variant);
static CpuThread *createFromAV(size_t index, Algo algorithm, AlgoVariant av, int64_t affinity, int priority);
@ -80,9 +71,9 @@ public:
inline cn_hash_fun fn(Variant variant) const { return fn(m_algorithm, m_av, variant); }
inline Algo algorithm() const override { return m_algorithm; }
inline int multiway() const override { return m_multiway; }
inline int priority() const override { return m_priority; }
inline int64_t affinity() const override { return m_affinity; }
inline Multiway multiway() const override { return m_multiway; }
inline size_t index() const override { return m_index; }
inline Type type() const override { return CPU; }

View file

@ -36,6 +36,14 @@ template<size_t N>
MultiWorker<N>::MultiWorker(Handle *handle)
: Worker(handle)
{
m_memory = Mem::create(m_ctx, m_thread->algorithm(), N);
}
template<size_t N>
MultiWorker<N>::~MultiWorker()
{
Mem::release(m_ctx, N, m_memory);
}
@ -46,24 +54,24 @@ bool MultiWorker<N>::selfTest()
return false;
}
m_thread->fn(xmrig::VARIANT_NONE)(test_input, 76, m_result.result, m_ctxLegacy);
m_thread->fn(xmrig::VARIANT_NONE)(test_input, 76, m_hash, m_ctx);
if (m_thread->algorithm() == xmrig::CRYPTONIGHT && memcmp(m_result.result, test_output_v0, 32) == 0) {
m_thread->fn(xmrig::VARIANT_V1)(test_input, 76, m_result.result, m_ctxLegacy);
if (m_thread->algorithm() == xmrig::CRYPTONIGHT && memcmp(m_hash, test_output_v0, sizeof m_hash) == 0) {
m_thread->fn(xmrig::VARIANT_V1)(test_input, 76, m_hash, m_ctx);
return memcmp(m_result.result, test_output_v1, 32) == 0;
return memcmp(m_hash, test_output_v1, sizeof m_hash) == 0;
}
# ifndef XMRIG_NO_AEON
if (m_thread->algorithm() == xmrig::CRYPTONIGHT_LITE && memcmp(m_result.result, test_output_v0_lite, 32) == 0) {
m_thread->fn(xmrig::VARIANT_V1)(test_input, 76, m_result.result, m_ctxLegacy);
if (m_thread->algorithm() == xmrig::CRYPTONIGHT_LITE && memcmp(m_hash, test_output_v0_lite, sizeof m_hash) == 0) {
m_thread->fn(xmrig::VARIANT_V1)(test_input, 76, m_hash, m_ctx);
return memcmp(m_result.result, test_output_v1_lite, 32) == 0;
return memcmp(m_hash, test_output_v1_lite, sizeof m_hash) == 0;
}
# endif
# ifndef XMRIG_NO_SUMO
return m_thread->algorithm() == xmrig::CRYPTONIGHT_HEAVY && memcmp(m_result.result, test_output_heavy, 32) == 0;
return m_thread->algorithm() == xmrig::CRYPTONIGHT_HEAVY && memcmp(m_hash, test_output_heavy, sizeof m_hash) == 0;
# else
return false;
# endif
@ -92,7 +100,7 @@ void MultiWorker<N>::start()
storeStats();
}
m_thread->fn(m_state.job.variant())(m_state.blob, m_state.job.size(), m_hash, m_ctxLegacy);
m_thread->fn(m_state.job.variant())(m_state.blob, m_state.job.size(), m_hash, m_ctx);
for (size_t i = 0; i < N; ++i) {
if (*reinterpret_cast<uint64_t*>(m_hash + (i * 32) + 24) < m_state.job.target()) {

View file

@ -26,6 +26,7 @@
#define __MULTIWORKER_H__
#include "Mem.h"
#include "net/Job.h"
#include "net/JobResult.h"
#include "workers/Worker.h"
@ -39,6 +40,7 @@ class MultiWorker : public Worker
{
public:
MultiWorker(Handle *handle);
~MultiWorker();
protected:
bool selfTest() override;
@ -61,15 +63,11 @@ private:
};
// cryptonight_ctx *m_ctx[N];
uint8_t m_hash[N * 32];
State m_state;
cryptonight_ctx *m_ctx[N];
MemInfo m_memory;
State m_pausedState;
Job m_job;
Job m_paused;
JobResult m_result;
State m_state;
uint8_t m_hash[N * 32];
};

View file

@ -26,7 +26,6 @@
#include "common/Platform.h"
#include "Cpu.h"
#include "Mem.h"
#include "workers/CpuThread.h"
#include "workers/Handle.h"
#include "workers/Worker.h"
@ -47,12 +46,6 @@ Worker::Worker(Handle *handle) :
}
Platform::setThreadPriority(m_thread->priority());
m_ctxLegacy = Mem::create(m_id);
}
Worker::~Worker()
{
}

View file

@ -45,7 +45,6 @@ class Worker : public IWorker
{
public:
Worker(Handle *handle);
~Worker();
inline size_t id() const override { return m_id; }
inline uint64_t hashCount() const override { return m_hashCount.load(std::memory_order_relaxed); }
@ -57,7 +56,6 @@ protected:
const size_t m_id;
const size_t m_totalWays;
const uint32_t m_offset;
cryptonight_ctx *m_ctxLegacy;
std::atomic<uint64_t> m_hashCount;
std::atomic<uint64_t> m_timestamp;
uint64_t m_count;