Skip to content

Commit

Permalink
Integrated CN-UPX2/extremelite (#247)
Browse files Browse the repository at this point in the history
* WIP

* Added win/asm for upx2

* Added donation servers and fixed windows ASM variant

* #1.9.2 preparation
  • Loading branch information
Bendr0id authored Apr 24, 2019
1 parent 1b0557d commit ff4058a
Show file tree
Hide file tree
Showing 22 changed files with 349 additions and 173 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# 1.9.2
- Integrated cn-extremelite a.k.a upx2 (algo: "cryptonight-extremelite", variant: "upx2")
- Integrated merged templates and replace of @WORKER-ID@ in template assignment
# 1.9.1
- Fix coloring of outdated miners on Dashboard
- Autodetect for fork of CN/R(variant: "auto"), Graft(variant: "rwz"), Zelerius(variant: "zls")
Expand Down
23 changes: 23 additions & 0 deletions cmake/asm.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,29 @@ configure_file("src/crypto/asm/win/cnv2_main_loop_ryzen.inc.in" "src/crypto/asm/
configure_file("src/crypto/asm/win/cnv2_double_main_loop_sandybridge.inc.in" "src/crypto/asm/win/cnv2_double_main_loop_ultralite_sandybridge.inc")
configure_file("src/crypto/asm/win/cnv2_main_loop_soft_aes_sandybridge.inc.in" "src/crypto/asm/win/cnv2_main_loop_ultralite_soft_aes_sandybridge.inc")

# CN V2 RWZ
set(ALGO "original")
set(ITERATIONS "393216") #0x60000
set(MASK "2097136") #0x1FFFF0

configure_file("src/crypto/asm/cnv2_main_loop_rwz_all.inc.in" "src/crypto/asm/cnv2_main_loop_rwz_original_all.inc")
configure_file("src/crypto/asm/cnv2_double_main_loop_rwz_all.inc.in" "src/crypto/asm/cnv2_double_main_loop_rwz_original_all.inc")

configure_file("src/crypto/asm/win/cnv2_main_loop_rwz_all.inc.in" "src/crypto/asm/win/cnv2_main_loop_rwz_original_all.inc")
configure_file("src/crypto/asm/win/cnv2_double_main_loop_rwz_all.inc.in" "src/crypto/asm/win/cnv2_double_main_loop_rwz_original_all.inc")


# CN V2 UPX2
set(ALGO "upx2")
set(ITERATIONS "16384") #0x4000
set(MASK "131056") #0x1FFF0

configure_file("src/crypto/asm/cnv2_main_loop_rwz_all.inc.in" "src/crypto/asm/cnv2_main_loop_rwz_upx2_all.inc")
configure_file("src/crypto/asm/cnv2_double_main_loop_rwz_all.inc.in" "src/crypto/asm/cnv2_double_main_loop_rwz_upx2_all.inc")

configure_file("src/crypto/asm/win/cnv2_main_loop_rwz_all.inc.in" "src/crypto/asm/win/cnv2_main_loop_rwz_upx2_all.inc")
configure_file("src/crypto/asm/win/cnv2_double_main_loop_rwz_all.inc.in" "src/crypto/asm/win/cnv2_double_main_loop_rwz_upx2_all.inc")

if (CMAKE_C_COMPILER_ID MATCHES MSVC)
enable_language(ASM_MASM)
set(XMRIG_ASM_FILE "src/crypto/asm/win/cn_main_loop.asm"
Expand Down
3 changes: 3 additions & 0 deletions src/Cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ void CpuImpl::optimizeParameters(size_t& threadsCount, size_t& hashFactor,
size_t cache = availableCache();
size_t algoBlockSize;
switch (algo) {
case Options::ALGO_CRYPTONIGHT_EXTREMELITE:
algoBlockSize = 128;
break;
case Options::ALGO_CRYPTONIGHT_ULTRALITE:
algoBlockSize = 256;
break;
Expand Down
3 changes: 3 additions & 0 deletions src/Mem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ ScratchPadMem Mem::create(ScratchPad** scratchPads, int threadId)
case Options::ALGO_CRYPTONIGHT_ULTRALITE:
scratchPadSize = MEMORY_ULTRA_LITE;
break;
case Options::ALGO_CRYPTONIGHT_EXTREMELITE:
scratchPadSize = MEMORY_EXTREME_LITE;
break;
case Options::ALGO_CRYPTONIGHT_SUPERLITE:
scratchPadSize = MEMORY_SUPER_LITE;
break;
Expand Down
16 changes: 14 additions & 2 deletions src/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ static const char *algo_names[] = {
"cryptonight-lite",
"cryptonight-superlite",
"cryptonight-ultralite",
"cryptonight-extremelite",
"cryptonight-heavy"
};

Expand All @@ -316,6 +317,7 @@ static const char *algo_short_names[] = {
"cn-lite",
"cn-superlite",
"cn-ultralite",
"cn-extremelite",
"cn-heavy"
};

Expand All @@ -337,7 +339,8 @@ constexpr static const char *pow_variant_names[] = {
"hosp",
"wow",
"r",
"xcash"
"xcash",
"upx2"
};

constexpr static const char *asm_optimization_names[] = {
Expand Down Expand Up @@ -1112,12 +1115,16 @@ bool Options::setAlgo(const char *algo)
break;
}


if (i == ARRAY_SIZE(algo_names) - 1 && (!strcmp(algo, "cn-ultra-lite") || !strcmp(algo, "cryptonight-ultra-lite") || !strcmp(algo, "cryptonight-ultralight") || !strcmp(algo, "cryptonight-turtle") || !strcmp(algo, "cn-turtle") || !strcmp(algo, "cryptonight-pico") || !strcmp(algo, "cn-pico"))) {
m_algo = ALGO_CRYPTONIGHT_ULTRALITE;
break;
}

if (i == ARRAY_SIZE(algo_names) - 1 && (!strcmp(algo, "cn-extreme-lite") || !strcmp(algo, "cryptonight-extreme-lite") || !strcmp(algo, "cryptonight-extremelight") || !strcmp(algo, "cryptonight-upx2") || !strcmp(algo, "cn-upx2") || !strcmp(algo, "cryptonight-femto") || !strcmp(algo, "cn-femto"))) {
m_algo = ALGO_CRYPTONIGHT_EXTREMELITE;
break;
}

if (i == ARRAY_SIZE(algo_names) - 1 && (!strcmp(algo, "cryptonight-lite-ipbc") || !strcmp(algo, "cryptonight-light-ipbc") || !strcmp(algo, "cn-lite-ipbc"))) {
showDeprecateWarning("cryptonight-light-ipbc", "cryptonight-light (with variant \"ipbc\")");
m_algo = ALGO_CRYPTONIGHT_LITE;
Expand Down Expand Up @@ -1215,6 +1222,11 @@ bool Options::parsePowVariant(const char *powVariant)
break;
}

if (i == ARRAY_SIZE(pow_variant_names) - 1 && (!strcmp(powVariant, "upx2") || !strcmp(powVariant, "upxv2") || !strcmp(powVariant, "femto"))) {
m_powVariant = POW_UPX2;
break;
}

if (i == ARRAY_SIZE(pow_variant_names) - 1 && (!strcmp(powVariant, "hosp") || !strcmp(powVariant, "hospital"))) {
m_powVariant = POW_HOSP;
break;
Expand Down
1 change: 1 addition & 0 deletions src/Options.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Options
ALGO_CRYPTONIGHT_LITE, /* CryptoNight-Lite (1MB ScratchPad) */
ALGO_CRYPTONIGHT_SUPERLITE, /* CryptoNight-Superlite (512KB ScratchPad) */
ALGO_CRYPTONIGHT_ULTRALITE, /* CryptoNight-Ultralite (256KB ScratchPad) */
ALGO_CRYPTONIGHT_EXTREMELITE, /* CryptoNight-Verylite (128KB ScratchPad) */
ALGO_CRYPTONIGHT_HEAVY, /* CryptoNight-Heavy (4MB ScratchPad) */
};

Expand Down
5 changes: 5 additions & 0 deletions src/PowVariant.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ enum PowVariant
POW_DOUBLE,
POW_ZELERIUS,
POW_RWZ,
POW_UPX2,
LAST_ITEM
};

Expand Down Expand Up @@ -89,6 +90,8 @@ inline std::string getPowVariantName(PowVariant powVariant)
return "zls";
case POW_RWZ:
return "rwz";
case POW_UPX2:
return "upx2";
case POW_AUTODETECT:
default:
return "-1";
Expand Down Expand Up @@ -174,6 +177,8 @@ inline PowVariant parseVariant(const std::string variant)
powVariant = PowVariant::POW_ZELERIUS;
} else if (variant == "rwz" || variant == "graft") {
powVariant = PowVariant::POW_RWZ;
} else if (variant == "upx2") {
powVariant = PowVariant::POW_UPX2;
}

return powVariant;
Expand Down
43 changes: 40 additions & 3 deletions src/crypto/CryptoNight.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,26 @@ static void cryptonight_ultra_lite_softaes(AsmOptimization asmOptimization, uint
#endif
}

template <size_t NUM_HASH_BLOCKS>
static void cryptonight_extreme_lite_aesni(AsmOptimization asmOptimization, uint64_t height, PowVariant variant, const uint8_t* input, size_t size, uint8_t* output, ScratchPad** scratchPad) {
# if !defined(XMRIG_ARMv7)
#if defined(XMRIG_ARM)
CryptoNightMultiHash<0x4000, POW_DEFAULT_INDEX_SHIFT, MEMORY_EXTREME_LITE, 0x1FFF0, false, POW_UPX2, NUM_HASH_BLOCKS>::hashPowV3(input, size, output, scratchPad);
#else
if ((asmOptimization != AsmOptimization::ASM_OFF && NUM_HASH_BLOCKS <= 2)) {
CryptoNightMultiHash<0x4000, POW_DEFAULT_INDEX_SHIFT, MEMORY_EXTREME_LITE, 0x1FFF0, false, POW_UPX2, NUM_HASH_BLOCKS>::hashPowV3_asm(input, size, output, scratchPad, asmOptimization);
} else {
CryptoNightMultiHash<0x4000, POW_DEFAULT_INDEX_SHIFT, MEMORY_EXTREME_LITE, 0x1FFF0, false, POW_UPX2, NUM_HASH_BLOCKS>::hashPowV3(input, size, output, scratchPad);
}
#endif
# endif
}

template <size_t NUM_HASH_BLOCKS>
static void cryptonight_extreme_lite_softaes(AsmOptimization asmOptimization, uint64_t height, PowVariant variant, const uint8_t* input, size_t size, uint8_t* output, ScratchPad** scratchPad) {
CryptoNightMultiHash<0x4000, POW_DEFAULT_INDEX_SHIFT, MEMORY_EXTREME_LITE, 0x1FFF0, true, POW_UPX2, NUM_HASH_BLOCKS>::hashPowV3(input, size, output, scratchPad);
}

template <size_t NUM_HASH_BLOCKS>
static void cryptonight_heavy_aesni(AsmOptimization asmOptimization, uint64_t height, PowVariant variant, const uint8_t* input, size_t size, uint8_t* output, ScratchPad** scratchPad) {
# if !defined(XMRIG_ARMv7)
Expand Down Expand Up @@ -464,6 +484,14 @@ void setCryptoNightHashMethods(Options::Algo algo, bool aesni)
}
break;

case Options::ALGO_CRYPTONIGHT_EXTREMELITE:
if (aesni) {
cryptonight_hash_ctx[HASH_FACTOR - 1] = cryptonight_extreme_lite_aesni<HASH_FACTOR>;
} else {
cryptonight_hash_ctx[HASH_FACTOR - 1] = cryptonight_extreme_lite_softaes<HASH_FACTOR>;
}
break;

case Options::ALGO_CRYPTONIGHT_HEAVY:
if (aesni) {
cryptonight_hash_ctx[HASH_FACTOR - 1] = cryptonight_heavy_aesni<HASH_FACTOR>;
Expand Down Expand Up @@ -546,6 +574,7 @@ bool CryptoNight::selfCheck(int algo)
bool resultLite = true;
bool resultSuperLite = true;
bool resultUltraLite = true;
bool resultExtremeLite = true;
bool resultHeavy = true;

AsmOptimization asmOptimization = Options::i()->asmOptimization();
Expand Down Expand Up @@ -678,9 +707,7 @@ bool CryptoNight::selfCheck(int algo)
resultLite = resultLite && memcmp(output, test_output_upx, 32) == 0;

} else if (algo == Options::ALGO_CRYPTONIGHT_SUPERLITE) {

return false;

} else if (algo == Options::ALGO_CRYPTONIGHT_ULTRALITE) {
// cn ultralite (cnv8 + turtle)

Expand All @@ -691,6 +718,16 @@ bool CryptoNight::selfCheck(int algo)
cryptonight_hash_ctx[1](asmOptimization, 0, PowVariant::POW_TURTLE, test_input, 76, output, scratchPads);
resultUltraLite = resultUltraLite && memcmp(output, test_output_turtle, 64) == 0;
#endif
} else if (algo == Options::ALGO_CRYPTONIGHT_EXTREMELITE) {
// cn extremelite (cnv8 + upx2)

cryptonight_hash_ctx[0](asmOptimization, 0, PowVariant::POW_UPX2, test_input, 76, output, scratchPads);
resultExtremeLite = resultExtremeLite && memcmp(output, test_output_upx2, 32) == 0;

#if MAX_NUM_HASH_BLOCKS > 1
cryptonight_hash_ctx[1](asmOptimization, 0, PowVariant::POW_UPX2, test_input, 76, output, scratchPads);
resultExtremeLite = resultExtremeLite && memcmp(output, test_output_upx2, 64) == 0;
#endif
} else {
// cn v0 aka orignal
cryptonight_hash_ctx[0](asmOptimization, 0, PowVariant::POW_V0,test_input, 76, output, scratchPads);
Expand Down Expand Up @@ -858,5 +895,5 @@ bool CryptoNight::selfCheck(int algo)
_mm_free(scratchPads[i]);
}

return result && resultLite && resultSuperLite && resultUltraLite && resultHeavy;
return result && resultLite && resultSuperLite && resultUltraLite && resultExtremeLite && resultHeavy;
}
1 change: 1 addition & 0 deletions src/crypto/CryptoNight.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#define MEMORY_LITE 1048576 /* 1 MiB */
#define MEMORY_SUPER_LITE 524288 /* 512 KiB */
#define MEMORY_ULTRA_LITE 262144 /* 256 KiB */
#define MEMORY_EXTREME_LITE 131072 /* 128 KiB */
#define MEMORY_HEAVY 4194304 /* 4 MiB */

#define POW_DEFAULT_INDEX_SHIFT 3
Expand Down
Loading

0 comments on commit ff4058a

Please sign in to comment.