The amount of work scanned can fluctuate when intensity changes and since we do this one cycle behind, we increment the work more than enough to prevent repeating work.
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 39 40 41 42 43 44 45
diff --git a/device-gpu.c b/device-gpu.c
index c42b602..5f933d5 100644
--- a/device-gpu.c
+++ b/device-gpu.c
@@ -1217,8 +1217,12 @@ static uint64_t opencl_scanhash(struct thr_info *thr, struct work *work,
++gpu->intensity;
}
}
+ if (!work->blk.nonce)
+ gpu->max_hashes = 0;
set_threads_hashes(clState->preferred_vwidth, &threads, &hashes, globalThreads,
localThreads[0], gpu->intensity);
+ if (hashes > gpu->max_hashes)
+ gpu->max_hashes = hashes;
status = thrdata->queue_kernel_parameters(clState, &work->blk);
if (unlikely(status != CL_SUCCESS)) {
applog(LOG_ERR, "Error: clSetKernelArg of all params failed.");
@@ -1259,7 +1263,10 @@ static uint64_t opencl_scanhash(struct thr_info *thr, struct work *work,
return 0;
}
- work->blk.nonce += hashes;
+ /* The amount of work scanned can fluctuate when intensity changes
+ * and since we do this one cycle behind, we increment the work more
+ * than enough to prevent repeating work */
+ work->blk.nonce += gpu->max_hashes;
return hashes;
}
diff --git a/miner.h b/miner.h
index b19a357..6e6dad5 100644
--- a/miner.h
+++ b/miner.h
@@ -228,9 +228,10 @@ struct cgpu_info {
int threads;
struct thr_info *thread;
+ unsigned int max_hashes;
int virtual_gpu;
- bool dynamic;
int intensity;
+ bool dynamic;
float temp;
int cutofftemp;