From 4fbc570fa41029655fa8322cdfb66fbad75f2b11 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 11 Oct 2012 20:30:47 +1100 Subject: [PATCH] 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. --- driver-opencl.c | 9 +++++++-- miner.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/driver-opencl.c b/driver-opencl.c index 82cbc6bb..063c5c10 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 19e1e535..479be8d9 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