From 10d4f4a96aeafb1b5ec7c9d9a72c37a95823f8ef Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sun, 8 Mar 2015 14:09:26 +0100 Subject: [PATCH] whirlpoolx: try to fix linux hashrates bug reported by PVMining with a lot of cards (not seen here) --- ccminer.cpp | 13 ++++++++----- x15/whirlpoolx.cu | 27 ++++++++++++++------------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ccminer.cpp b/ccminer.cpp index d83bdc6..784b85c 100644 --- a/ccminer.cpp +++ b/ccminer.cpp @@ -1253,6 +1253,7 @@ static void *miner_thread(void *userdata) switch (opt_algo) { case ALGO_BLAKECOIN: case ALGO_BLAKE: + case ALGO_WHIRLPOOLX: minmax = 0x80000000U; break; case ALGO_KECCAK: @@ -2235,14 +2236,10 @@ int main(int argc, char *argv[]) #else printf(" Built with the nVidia CUDA SDK 6.5\n\n"); #endif - printf(" Originally based on pooler cpuminer,\n"); - printf(" CUDA support by Christian Buchner and Christian H.\n"); + printf(" Originally based on cudaminer by Christian Buchner and Christian H.,\n"); printf(" Include some of djm34 additions and sp optimisations\n"); printf("BTC donation address: 1AJdfCpLWPNoAMDfHF1wD5y8VgKSSTHxPo\n\n"); - printf(" Whirlpoolx support by Provos Alexis.\n"); - printf("VNL donation address: VrjvyQJ9d1Bfte5kVSA8qfZoYdN2C6weCG\n\n"); - rpc_user = strdup(""); rpc_pass = strdup(""); rpc_url = strdup(""); @@ -2290,6 +2287,12 @@ int main(int argc, char *argv[]) } } + // extra credits.. + if (opt_algo == ALGO_WHIRLPOOLX) { + printf(" Whirlpoolx support by Alexis Provos.\n"); + printf("VNL donation address: VrjvyQJ9d1Bfte5kVSA8qfZoYdN2C6weCG\n\n"); + } + if (!opt_benchmark && !strlen(rpc_url)) { fprintf(stderr, "%s: no URL supplied\n", argv[0]); show_usage_and_exit(1); diff --git a/x15/whirlpoolx.cu b/x15/whirlpoolx.cu index 9c559bb..5de1082 100644 --- a/x15/whirlpoolx.cu +++ b/x15/whirlpoolx.cu @@ -39,11 +39,11 @@ extern "C" void whirlxHash(void *state, const void *input) static bool init[MAX_GPUS] = { 0 }; + extern "C" int scanhash_whirlpoolx(int thr_id, uint32_t *pdata, const uint32_t *ptarget, uint32_t max_nonce, unsigned long *hashes_done) { const uint32_t first_nonce = pdata[19]; - uint64_t n = first_nonce; uint32_t endiandata[20]; uint32_t throughput = device_intensity(thr_id, __func__, 1U << 22); throughput = min(throughput, max_nonce - first_nonce); @@ -67,12 +67,7 @@ extern "C" int scanhash_whirlpoolx(int thr_id, uint32_t *pdata, const uint32_t * whirlpoolx_setBlock_80((void*)endiandata, ptarget); whirlpoolx_precompute(); do { - uint32_t foundNonce = UINT32_MAX; - if((n+throughput) >= max_nonce) { - // Preventing glitch - throughput = (uint32_t) (max_nonce-n); - } - foundNonce = whirlpoolx_cpu_hash(thr_id, throughput, (uint32_t) n); + uint32_t foundNonce = whirlpoolx_cpu_hash(thr_id, throughput, pdata[19]); if (foundNonce != UINT32_MAX) { const uint32_t Htarg = ptarget[7]; @@ -81,10 +76,9 @@ extern "C" int scanhash_whirlpoolx(int thr_id, uint32_t *pdata, const uint32_t * whirlxHash(vhash64, endiandata); if (vhash64[7] <= Htarg && fulltest(vhash64, ptarget)) { - int res = 1; - *hashes_done = (unsigned long)(n - first_nonce + throughput); + *hashes_done = pdata[19] - first_nonce + throughput; pdata[19] = foundNonce; - return res; + return 1; } else if (vhash64[7] > Htarg) { applog(LOG_INFO, "GPU #%d: result for %08x is not in range: %x > %x", thr_id, foundNonce, vhash64[7], Htarg); @@ -93,9 +87,16 @@ extern "C" int scanhash_whirlpoolx(int thr_id, uint32_t *pdata, const uint32_t * applog(LOG_INFO, "GPU #%d: result for %08x does not validate on CPU!", thr_id, foundNonce); } } - n += throughput; - } while (n < max_nonce && !work_restart[thr_id].restart); - *hashes_done = (unsigned long)(n - first_nonce); + pdata[19] += throughput; + + if (((uint64_t)pdata[19]+throughput) >= max_nonce) { + break; + } + + } while (!work_restart[thr_id].restart); + + *(hashes_done) = pdata[19] - first_nonce + 1; + return 0; }