restore the whirlpool algo
This commit is contained in:
parent
87edf84bf3
commit
3f589cc4db
@ -55,7 +55,7 @@ ccminer_SOURCES = elist.h miner.h compat.h \
|
|||||||
x11/cuda_x11_luffa512_Cubehash.cu \
|
x11/cuda_x11_luffa512_Cubehash.cu \
|
||||||
x13/x13.cu x13/cuda_x13_hamsi512.cu x13/cuda_x13_fugue512.cu \
|
x13/x13.cu x13/cuda_x13_hamsi512.cu x13/cuda_x13_fugue512.cu \
|
||||||
x15/x14.cu x15/x15.cu x15/cuda_x14_shabal512.cu x15/cuda_x15_whirlpool.cu \
|
x15/x14.cu x15/x15.cu x15/cuda_x14_shabal512.cu x15/cuda_x15_whirlpool.cu \
|
||||||
x15/whirlpoolx.cu x15/cuda_whirlpoolx.cu \
|
x15/whirlpool.cu x15/whirlpoolx.cu x15/cuda_whirlpoolx.cu \
|
||||||
x17/x17.cu x17/cuda_x17_haval512.cu x17/cuda_x17_sha512.cu \
|
x17/x17.cu x17/cuda_x17_haval512.cu x17/cuda_x17_sha512.cu \
|
||||||
x11/c11.cu x11/s3.cu
|
x11/c11.cu x11/s3.cu
|
||||||
|
|
||||||
|
10
ccminer.cpp
10
ccminer.cpp
@ -116,6 +116,7 @@ enum sha_algos {
|
|||||||
ALGO_X14,
|
ALGO_X14,
|
||||||
ALGO_X15,
|
ALGO_X15,
|
||||||
ALGO_X17,
|
ALGO_X17,
|
||||||
|
ALGO_WHIRLCOIN,
|
||||||
ALGO_WHIRLPOOLX,
|
ALGO_WHIRLPOOLX,
|
||||||
ALGO_ZR5,
|
ALGO_ZR5,
|
||||||
ALGO_COUNT
|
ALGO_COUNT
|
||||||
@ -154,6 +155,7 @@ static const char *algo_names[] = {
|
|||||||
"x14",
|
"x14",
|
||||||
"x15",
|
"x15",
|
||||||
"x17",
|
"x17",
|
||||||
|
"whirlpool",
|
||||||
"whirlpoolx",
|
"whirlpoolx",
|
||||||
"zr5",
|
"zr5",
|
||||||
""
|
""
|
||||||
@ -315,6 +317,7 @@ Options:\n\
|
|||||||
x14 X14\n\
|
x14 X14\n\
|
||||||
x15 X15\n\
|
x15 X15\n\
|
||||||
x17 X17\n\
|
x17 X17\n\
|
||||||
|
whirlpool Old Whirlcoin algo\n\
|
||||||
whirlpoolx WhirlpoolX (VNL)\n\
|
whirlpoolx WhirlpoolX (VNL)\n\
|
||||||
zr5 ZR5 (ZiftrCoin)\n\
|
zr5 ZR5 (ZiftrCoin)\n\
|
||||||
-d, --devices Comma separated list of CUDA devices to use.\n\
|
-d, --devices Comma separated list of CUDA devices to use.\n\
|
||||||
@ -1372,6 +1375,7 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work)
|
|||||||
case ALGO_GROESTL:
|
case ALGO_GROESTL:
|
||||||
case ALGO_KECCAK:
|
case ALGO_KECCAK:
|
||||||
case ALGO_BLAKECOIN:
|
case ALGO_BLAKECOIN:
|
||||||
|
case ALGO_WHIRLCOIN:
|
||||||
SHA256((uchar*)sctx->job.coinbase, sctx->job.coinbase_size, (uchar*)merkle_root);
|
SHA256((uchar*)sctx->job.coinbase, sctx->job.coinbase_size, (uchar*)merkle_root);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1807,6 +1811,7 @@ static void *miner_thread(void *userdata)
|
|||||||
case ALGO_S3:
|
case ALGO_S3:
|
||||||
case ALGO_X11:
|
case ALGO_X11:
|
||||||
case ALGO_X13:
|
case ALGO_X13:
|
||||||
|
case ALGO_WHIRLCOIN:
|
||||||
minmax = 0x400000;
|
minmax = 0x400000;
|
||||||
break;
|
break;
|
||||||
case ALGO_LYRA2:
|
case ALGO_LYRA2:
|
||||||
@ -1938,6 +1943,9 @@ static void *miner_thread(void *userdata)
|
|||||||
case ALGO_S3:
|
case ALGO_S3:
|
||||||
rc = scanhash_s3(thr_id, &work, max_nonce, &hashes_done);
|
rc = scanhash_s3(thr_id, &work, max_nonce, &hashes_done);
|
||||||
break;
|
break;
|
||||||
|
case ALGO_WHIRLCOIN:
|
||||||
|
rc = scanhash_whirl(thr_id, &work, max_nonce, &hashes_done);
|
||||||
|
break;
|
||||||
case ALGO_WHIRLPOOLX:
|
case ALGO_WHIRLPOOLX:
|
||||||
rc = scanhash_whirlx(thr_id, &work, max_nonce, &hashes_done);
|
rc = scanhash_whirlx(thr_id, &work, max_nonce, &hashes_done);
|
||||||
break;
|
break;
|
||||||
@ -2444,6 +2452,8 @@ void parse_arg(int key, char *arg)
|
|||||||
i = opt_algo = ALGO_LYRA2;
|
i = opt_algo = ALGO_LYRA2;
|
||||||
else if (!strcasecmp("lyra2rev2", arg))
|
else if (!strcasecmp("lyra2rev2", arg))
|
||||||
i = opt_algo = ALGO_LYRA2v2;
|
i = opt_algo = ALGO_LYRA2v2;
|
||||||
|
else if (!strcasecmp("whirl", arg))
|
||||||
|
i = opt_algo = ALGO_WHIRLCOIN;
|
||||||
else if (!strcasecmp("ziftr", arg))
|
else if (!strcasecmp("ziftr", arg))
|
||||||
i = opt_algo = ALGO_ZR5;
|
i = opt_algo = ALGO_ZR5;
|
||||||
else
|
else
|
||||||
|
3
miner.h
3
miner.h
@ -286,6 +286,7 @@ extern int scanhash_qubit(int thr_id, struct work* work, uint32_t max_nonce, uns
|
|||||||
extern int scanhash_skeincoin(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_skeincoin(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
extern int scanhash_skein2(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_skein2(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
extern int scanhash_s3(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_s3(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
|
extern int scanhash_whirl(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
extern int scanhash_whirlx(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_whirlx(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
extern int scanhash_x11(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_x11(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
extern int scanhash_x13(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
extern int scanhash_x13(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done);
|
||||||
@ -325,6 +326,7 @@ extern void free_qubit(int thr_id);
|
|||||||
extern void free_skeincoin(int thr_id);
|
extern void free_skeincoin(int thr_id);
|
||||||
extern void free_skein2(int thr_id);
|
extern void free_skein2(int thr_id);
|
||||||
extern void free_s3(int thr_id);
|
extern void free_s3(int thr_id);
|
||||||
|
extern void free_whirl(int thr_id);
|
||||||
extern void free_whirlx(int thr_id);
|
extern void free_whirlx(int thr_id);
|
||||||
extern void free_x11(int thr_id);
|
extern void free_x11(int thr_id);
|
||||||
extern void free_x13(int thr_id);
|
extern void free_x13(int thr_id);
|
||||||
@ -757,6 +759,7 @@ void scryptjane_hash(void* output, const void* input);
|
|||||||
void skeincoinhash(void *output, const void *input);
|
void skeincoinhash(void *output, const void *input);
|
||||||
void skein2hash(void *output, const void *input);
|
void skein2hash(void *output, const void *input);
|
||||||
void s3hash(void *output, const void *input);
|
void s3hash(void *output, const void *input);
|
||||||
|
void wcoinhash(void *state, const void *input);
|
||||||
void whirlxHash(void *state, const void *input);
|
void whirlxHash(void *state, const void *input);
|
||||||
void x11hash(void *output, const void *input);
|
void x11hash(void *output, const void *input);
|
||||||
void x13hash(void *output, const void *input);
|
void x13hash(void *output, const void *input);
|
||||||
|
3
util.cpp
3
util.cpp
@ -1948,6 +1948,9 @@ void print_hash_tests(void)
|
|||||||
s3hash(&hash[0], &buf[0]);
|
s3hash(&hash[0], &buf[0]);
|
||||||
printpfx("S3", hash);
|
printpfx("S3", hash);
|
||||||
|
|
||||||
|
wcoinhash(&hash[0], &buf[0]);
|
||||||
|
printpfx("whirlpool", hash);
|
||||||
|
|
||||||
whirlxHash(&hash[0], &buf[0]);
|
whirlxHash(&hash[0], &buf[0]);
|
||||||
printpfx("whirlpoolx", hash);
|
printpfx("whirlpoolx", hash);
|
||||||
|
|
||||||
|
120
x15/whirlpool.cu
Normal file
120
x15/whirlpool.cu
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* whirlpool routine (djm)
|
||||||
|
*/
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "sph/sph_whirlpool.h"
|
||||||
|
#include "miner.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "cuda_helper.h"
|
||||||
|
|
||||||
|
static uint32_t *d_hash[MAX_GPUS];
|
||||||
|
|
||||||
|
extern void x15_whirlpool_cpu_init(int thr_id, uint32_t threads, int mode);
|
||||||
|
extern void x15_whirlpool_cpu_hash_64(int thr_id, uint32_t threads, uint32_t startNounce, uint32_t *d_nonceVector, uint32_t *d_hash, int order);
|
||||||
|
|
||||||
|
extern void whirlpool512_setBlock_80(void *pdata, const void *ptarget);
|
||||||
|
extern void whirlpool512_cpu_hash_80(int thr_id, uint32_t threads, uint32_t startNounce, uint32_t *d_hash, int order);
|
||||||
|
extern uint32_t whirlpool512_cpu_finalhash_64(int thr_id, uint32_t threads, uint32_t startNounce, uint32_t *d_nonceVector, uint32_t *d_hash, int order);
|
||||||
|
|
||||||
|
|
||||||
|
// CPU Hash function
|
||||||
|
extern "C" void wcoinhash(void *state, const void *input)
|
||||||
|
{
|
||||||
|
sph_whirlpool_context ctx_whirlpool;
|
||||||
|
|
||||||
|
unsigned char hash[128]; // uint32_t hashA[16], hashB[16];
|
||||||
|
#define hashB hash+64
|
||||||
|
|
||||||
|
memset(hash, 0, sizeof hash);
|
||||||
|
|
||||||
|
sph_whirlpool1_init(&ctx_whirlpool);
|
||||||
|
sph_whirlpool1(&ctx_whirlpool, input, 80);
|
||||||
|
sph_whirlpool1_close(&ctx_whirlpool, hash);
|
||||||
|
|
||||||
|
sph_whirlpool1_init(&ctx_whirlpool);
|
||||||
|
sph_whirlpool1(&ctx_whirlpool, hash, 64);
|
||||||
|
sph_whirlpool1_close(&ctx_whirlpool, hashB);
|
||||||
|
|
||||||
|
sph_whirlpool1_init(&ctx_whirlpool);
|
||||||
|
sph_whirlpool1(&ctx_whirlpool, hashB, 64);
|
||||||
|
sph_whirlpool1_close(&ctx_whirlpool, hash);
|
||||||
|
|
||||||
|
sph_whirlpool1_init(&ctx_whirlpool);
|
||||||
|
sph_whirlpool1(&ctx_whirlpool, hash, 64);
|
||||||
|
sph_whirlpool1_close(&ctx_whirlpool, hash);
|
||||||
|
|
||||||
|
memcpy(state, hash, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool init[MAX_GPUS] = { 0 };
|
||||||
|
|
||||||
|
extern "C" int scanhash_whirl(int thr_id, struct work* work, uint32_t max_nonce, unsigned long *hashes_done)
|
||||||
|
{
|
||||||
|
uint32_t _ALIGN(128) endiandata[20];
|
||||||
|
uint32_t* pdata = work->data;
|
||||||
|
uint32_t* ptarget = work->target;
|
||||||
|
const uint32_t first_nonce = pdata[19];
|
||||||
|
|
||||||
|
uint32_t throughput = device_intensity(thr_id, __func__, 1U << 19); // 19=256*256*8;
|
||||||
|
throughput = min(throughput, max_nonce - first_nonce);
|
||||||
|
|
||||||
|
if (opt_benchmark)
|
||||||
|
((uint32_t*)ptarget)[7] = 0x0000ff;
|
||||||
|
|
||||||
|
if (!init[thr_id]) {
|
||||||
|
cudaSetDevice(device_map[thr_id]);
|
||||||
|
|
||||||
|
cudaMalloc(&d_hash[thr_id], 16 * sizeof(uint32_t) * throughput);
|
||||||
|
x15_whirlpool_cpu_init(thr_id, throughput, 1 /* old whirlpool */);
|
||||||
|
|
||||||
|
init[thr_id] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int k=0; k < 20; k++) {
|
||||||
|
be32enc(&endiandata[k], pdata[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
whirlpool512_setBlock_80((void*)endiandata, ptarget);
|
||||||
|
|
||||||
|
do {
|
||||||
|
uint32_t foundNonce;
|
||||||
|
int order = 0;
|
||||||
|
|
||||||
|
whirlpool512_cpu_hash_80(thr_id, throughput, pdata[19], d_hash[thr_id], order++);
|
||||||
|
x15_whirlpool_cpu_hash_64(thr_id, throughput, pdata[19], NULL, d_hash[thr_id], order++);
|
||||||
|
x15_whirlpool_cpu_hash_64(thr_id, throughput, pdata[19], NULL, d_hash[thr_id], order++);
|
||||||
|
|
||||||
|
foundNonce = whirlpool512_cpu_finalhash_64(thr_id, throughput, pdata[19], NULL, d_hash[thr_id], order++);
|
||||||
|
if (foundNonce != UINT32_MAX)
|
||||||
|
{
|
||||||
|
const uint32_t Htarg = ptarget[7];
|
||||||
|
uint32_t vhash[8];
|
||||||
|
be32enc(&endiandata[19], foundNonce);
|
||||||
|
wcoinhash(vhash, endiandata);
|
||||||
|
|
||||||
|
if (vhash[7] <= Htarg && fulltest(vhash, ptarget)) {
|
||||||
|
int res = 1;
|
||||||
|
*hashes_done = pdata[19] - first_nonce + throughput;
|
||||||
|
bn_store_hash_target_ratio(vhash, ptarget, work);
|
||||||
|
#if 0
|
||||||
|
uint32_t secNonce = cuda_check_hash_suppl(thr_id, throughput, pdata[19], d_hash[thr_id], 1);
|
||||||
|
if (secNonce != 0) {
|
||||||
|
pdata[21] = secNonce;
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
pdata[19] = foundNonce;
|
||||||
|
return res;
|
||||||
|
} else {
|
||||||
|
applog(LOG_WARNING, "GPU #%d: result for %08x does not validate on CPU!", device_map[thr_id], foundNonce);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pdata[19] += throughput;
|
||||||
|
|
||||||
|
} while (pdata[19] < max_nonce && !work_restart[thr_id].restart);
|
||||||
|
|
||||||
|
*hashes_done = pdata[19] - first_nonce;
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user