Reinstate the history on dynamic intensity mode to damp fluctuations in intensity but use an upper limit on how much the value can increase at any time to cope with rare overflows.
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-opencl.c b/driver-opencl.c
index 82cbc6b..063c5c1 100644
--- a/driver-opencl.c
+++ b/driver-opencl.c
@@ -1585,14 +1585,19 @@ static int64_t opencl_scanhash(struct thr_info *thr, struct work *work,
gpu_us = us_tdiff(&tv_gpuend, &gpu->tv_gpumid);
if (gpu_us > 0 && ++gpu->hit > 4) {
gpu_us = us_tdiff(&tv_gpuend, &gpu->tv_gpustart) / gpu->intervals;
+ /* Very rarely we may get an overflow so put an upper
+ * limit on the detected time */
+ if (gpu_us > gpu->gpu_us_average * 4)
+ gpu_us = gpu->gpu_us_average * 4;
+ gpu->gpu_us_average = (gpu->gpu_us_average + gpu_us * 0.63) / 1.63;
/* Try to not let the GPU be out for longer than
* opt_dynamic_interval in ms, but increase
* intensity when the system is idle in dynamic mode */
- if (gpu_us > dynamic_us) {
+ if (gpu->gpu_us_average > dynamic_us) {
if (gpu->intensity > MIN_INTENSITY)
--gpu->intensity;
- } else if (gpu_us < dynamic_us / 2) {
+ } else if (gpu->gpu_us_average < dynamic_us / 2) {
if (gpu->intensity < MAX_INTENSITY)
++gpu->intensity;
}
diff --git a/miner.h b/miner.h
index 19e1e53..479be8d 100644
--- a/miner.h
+++ b/miner.h
@@ -397,6 +397,7 @@ struct cgpu_info {
#endif
struct timeval tv_gpustart;
struct timeval tv_gpumid;
+ double gpu_us_average;
int intervals, hit;
#endif