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