Further smooth out avalon hashrate by limiting the maximum number of nonces counted each cycle to 1 per miner, saving them for later cycles.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
diff --git a/driver-avalon.c b/driver-avalon.c
index 6abdaeb..2a5ec3c 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -1433,9 +1433,9 @@ static int64_t avalon_scanhash(struct thr_info *thr)
{
struct cgpu_info *avalon = thr->cgpu;
struct avalon_info *info = avalon->device_data;
+ int64_t hash_count, us_timeout, nonce_count;
const int miner_count = info->miner_count;
struct timeval now, then, tdiff;
- int64_t hash_count, us_timeout;
struct timespec abstime;
/* Half nonce range */
@@ -1452,13 +1452,20 @@ static int64_t avalon_scanhash(struct thr_info *thr)
mutex_unlock(&info->qlock);
mutex_lock(&info->lock);
- hash_count = 0xffffffffull * (uint64_t)info->nonces;
+ /* Smooths out hashrate shown by limiting number of nonces counted in
+ * one lucky cycle, saving some for later less lucky cycles. */
+ if (info->nonces > miner_count)
+ nonce_count = miner_count;
+ else
+ nonce_count = info->nonces;
+ hash_count = 0xffffffffll * nonce_count;
avalon->results += info->nonces + info->idle;
if (avalon->results > miner_count)
avalon->results = miner_count;
if (!info->reset)
avalon->results--;
- info->nonces = info->idle = 0;
+ info->nonces -= nonce_count;
+ info->idle = 0;
mutex_unlock(&info->lock);
/* Check for nothing but consecutive bad results or consistently less