Added support for "cn/msr" also known as "cn-fast".

This commit is contained in:
XMRig 2018-06-10 19:48:34 +07:00
parent 974cb4162a
commit 8908c2c027
10 changed files with 136 additions and 75 deletions

View file

@ -62,9 +62,15 @@ bool xmrig::CpuThread::isSoftAES(AlgoVariant av)
xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant av, Variant variant)
{
assert(variant == VARIANT_0 || variant == VARIANT_1 || variant == VARIANT_IPBC || variant == VARIANT_XTL);
assert(variant == VARIANT_0 ||
variant == VARIANT_1 ||
variant == VARIANT_IPBC ||
variant == VARIANT_XTL ||
variant == VARIANT_MSR ||
variant == VARIANT_XHV
);
static const cn_hash_fun func_table[90] = {
static const cn_hash_fun func_table[180] = {
cryptonight_single_hash<CRYPTONIGHT, false, VARIANT_0>,
cryptonight_double_hash<CRYPTONIGHT, false, VARIANT_0>,
cryptonight_single_hash<CRYPTONIGHT, true, VARIANT_0>,
@ -87,7 +93,7 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a
cryptonight_quad_hash<CRYPTONIGHT, true, VARIANT_1>,
cryptonight_penta_hash<CRYPTONIGHT, true, VARIANT_1>,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_IPBC
cryptonight_single_hash<CRYPTONIGHT, false, VARIANT_XTL>,
cryptonight_double_hash<CRYPTONIGHT, false, VARIANT_XTL>,
@ -100,6 +106,19 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a
cryptonight_quad_hash<CRYPTONIGHT, true, VARIANT_XTL>,
cryptonight_penta_hash<CRYPTONIGHT, true, VARIANT_XTL>,
cryptonight_single_hash<CRYPTONIGHT, false, VARIANT_MSR>,
cryptonight_double_hash<CRYPTONIGHT, false, VARIANT_MSR>,
cryptonight_single_hash<CRYPTONIGHT, true, VARIANT_MSR>,
cryptonight_double_hash<CRYPTONIGHT, true, VARIANT_MSR>,
cryptonight_triple_hash<CRYPTONIGHT, false, VARIANT_MSR>,
cryptonight_quad_hash<CRYPTONIGHT, false, VARIANT_MSR>,
cryptonight_penta_hash<CRYPTONIGHT, false, VARIANT_MSR>,
cryptonight_triple_hash<CRYPTONIGHT, true, VARIANT_MSR>,
cryptonight_quad_hash<CRYPTONIGHT, true, VARIANT_MSR>,
cryptonight_penta_hash<CRYPTONIGHT, true, VARIANT_MSR>,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XHV
# ifndef XMRIG_NO_AEON
cryptonight_single_hash<CRYPTONIGHT_LITE, false, VARIANT_0>,
cryptonight_double_hash<CRYPTONIGHT_LITE, false, VARIANT_0>,
@ -134,12 +153,16 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a
cryptonight_quad_hash<CRYPTONIGHT_LITE, true, VARIANT_IPBC>,
cryptonight_penta_hash<CRYPTONIGHT_LITE, true, VARIANT_IPBC>,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XTL
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_MSR
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XHV
# else
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
# endif
# ifndef XMRIG_NO_SUMO
@ -153,18 +176,33 @@ xmrig::CpuThread::cn_hash_fun xmrig::CpuThread::fn(Algo algorithm, AlgoVariant a
cryptonight_triple_hash<CRYPTONIGHT_HEAVY, true, VARIANT_0>,
cryptonight_quad_hash<CRYPTONIGHT_HEAVY, true, VARIANT_0>,
cryptonight_penta_hash<CRYPTONIGHT_HEAVY, true, VARIANT_0>,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_1
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_IPBC
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_XTL
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // VARIANT_MSR
cryptonight_single_hash<CRYPTONIGHT_HEAVY, false, VARIANT_XHV>,
cryptonight_double_hash<CRYPTONIGHT_HEAVY, false, VARIANT_XHV>,
cryptonight_single_hash<CRYPTONIGHT_HEAVY, true, VARIANT_XHV>,
cryptonight_double_hash<CRYPTONIGHT_HEAVY, true, VARIANT_XHV>,
cryptonight_triple_hash<CRYPTONIGHT_HEAVY, false, VARIANT_XHV>,
cryptonight_quad_hash<CRYPTONIGHT_HEAVY, false, VARIANT_XHV>,
cryptonight_penta_hash<CRYPTONIGHT_HEAVY, false, VARIANT_XHV>,
cryptonight_triple_hash<CRYPTONIGHT_HEAVY, true, VARIANT_XHV>,
cryptonight_quad_hash<CRYPTONIGHT_HEAVY, true, VARIANT_XHV>,
cryptonight_penta_hash<CRYPTONIGHT_HEAVY, true, VARIANT_XHV>,
# else
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
# endif
};
# ifndef XMRIG_NO_SUMO
if (algorithm == CRYPTONIGHT_HEAVY) {
variant = VARIANT_0;
}
# endif
const size_t index = 40 * algorithm + 10 * variant + av - 1;
const size_t index = VARIANT_MAX * 10 * algorithm + 10 * variant + av - 1;
# ifndef NDEBUG
cn_hash_fun func = func_table[index];

View file

@ -50,36 +50,23 @@ MultiWorker<N>::~MultiWorker()
template<size_t N>
bool MultiWorker<N>::selfTest()
{
if (m_thread->fn(xmrig::VARIANT_0) == nullptr) {
return false;
}
m_thread->fn(xmrig::VARIANT_0)(test_input, 76, m_hash, m_ctx);
if (m_thread->algorithm() == xmrig::CRYPTONIGHT && memcmp(m_hash, test_output_v0, sizeof m_hash) == 0) {
m_thread->fn(xmrig::VARIANT_1)(test_input, 76, m_hash, m_ctx);
if (memcmp(m_hash, test_output_v1, sizeof m_hash) != 0) {
return false;
}
m_thread->fn(xmrig::VARIANT_XTL)(test_input, 76, m_hash, m_ctx);
return memcmp(m_hash, test_output_xtl, sizeof m_hash) == 0;
if (m_thread->algorithm() == xmrig::CRYPTONIGHT) {
return verify(xmrig::VARIANT_0, test_output_v0) &&
verify(xmrig::VARIANT_1, test_output_v1) &&
verify(xmrig::VARIANT_XTL, test_output_xtl) &&
verify(xmrig::VARIANT_MSR, test_output_msr);
}
# ifndef XMRIG_NO_AEON
if (m_thread->algorithm() == xmrig::CRYPTONIGHT_LITE && memcmp(m_hash, test_output_v0_lite, sizeof m_hash) == 0) {
m_thread->fn(xmrig::VARIANT_1)(test_input, 76, m_hash, m_ctx);
if (memcmp(m_hash, test_output_v1_lite, sizeof m_hash) != 0) {
return false;
}
m_thread->fn(xmrig::VARIANT_IPBC)(test_input, 76, m_hash, m_ctx);
return memcmp(m_hash, test_output_ipbc_lite, sizeof m_hash) == 0;
if (m_thread->algorithm() == xmrig::CRYPTONIGHT_LITE) {
return verify(xmrig::VARIANT_0, test_output_v0_lite) &&
verify(xmrig::VARIANT_1, test_output_v1_lite) &&
verify(xmrig::VARIANT_IPBC, test_output_ipbc_lite);
}
# endif
# ifndef XMRIG_NO_SUMO
return m_thread->algorithm() == xmrig::CRYPTONIGHT_HEAVY && memcmp(m_hash, test_output_heavy, sizeof m_hash) == 0;
return m_thread->algorithm() == xmrig::CRYPTONIGHT_HEAVY && verify(xmrig::VARIANT_0, test_output_heavy);
# else
return false;
# endif
@ -140,6 +127,20 @@ bool MultiWorker<N>::resume(const Job &job)
}
template<size_t N>
bool MultiWorker<N>::verify(xmrig::Variant variant, const uint8_t *referenceValue)
{
xmrig::CpuThread::cn_hash_fun func = m_thread->fn(variant);
if (!func) {
return false;
}
func(test_input, 76, m_hash, m_ctx);
return memcmp(m_hash, referenceValue, sizeof m_hash) == 0;
}
template<size_t N>
void MultiWorker<N>::consumeJob()
{

View file

@ -48,6 +48,7 @@ protected:
private:
bool resume(const Job &job);
bool verify(xmrig::Variant variant, const uint8_t *referenceValue);
void consumeJob();
void save(const Job &job);