Browse Source

Detect large swings in temperature when below the target temperature range and change fan by amounts dependant on the value of tdiff.

nfactor-troky
Con Kolivas 13 years ago
parent
commit
29c0f7bd37
  1. 17
      adl.c

17
adl.c

@ -1025,6 +1025,7 @@ static int set_powertune(int gpu, int iPercentage)
static bool fan_autotune(int gpu, int temp, int fanpercent, int lasttemp, bool *fan_window) static bool fan_autotune(int gpu, int temp, int fanpercent, int lasttemp, bool *fan_window)
{ {
struct cgpu_info *cgpu = &gpus[gpu]; struct cgpu_info *cgpu = &gpus[gpu];
int tdiff = round(temp - lasttemp);
struct gpu_adl *ga = &cgpu->adl; struct gpu_adl *ga = &cgpu->adl;
int top = gpus[gpu].gpu_fan; int top = gpus[gpu].gpu_fan;
int bot = gpus[gpu].min_fan; int bot = gpus[gpu].min_fan;
@ -1039,7 +1040,7 @@ static bool fan_autotune(int gpu, int temp, int fanpercent, int lasttemp, bool *
cgpu->device_last_not_well = time(NULL); cgpu->device_last_not_well = time(NULL);
cgpu->device_not_well_reason = REASON_DEV_OVER_HEAT; cgpu->device_not_well_reason = REASON_DEV_OVER_HEAT;
cgpu->dev_over_heat_count++; cgpu->dev_over_heat_count++;
} else if (temp > ga->targettemp && fanpercent < top && temp >= lasttemp) { } else if (temp > ga->targettemp && fanpercent < top && tdiff >= 0) {
applog(LOG_DEBUG, "Temperature over target, increasing fanspeed"); applog(LOG_DEBUG, "Temperature over target, increasing fanspeed");
if (temp > ga->targettemp + opt_hysteresis) if (temp > ga->targettemp + opt_hysteresis)
newpercent = ga->targetfan + 10; newpercent = ga->targetfan + 10;
@ -1047,11 +1048,17 @@ static bool fan_autotune(int gpu, int temp, int fanpercent, int lasttemp, bool *
newpercent = ga->targetfan + 5; newpercent = ga->targetfan + 5;
if (newpercent > top) if (newpercent > top)
newpercent = top; newpercent = top;
} else if (fanpercent > bot && temp < ga->targettemp - opt_hysteresis && temp <= lasttemp) { } else if (fanpercent > bot && temp < ga->targettemp - opt_hysteresis) {
applog(LOG_DEBUG, "Temperature %d degrees below target, decreasing fanspeed", opt_hysteresis); /* Detect large swings of 5 degrees or more and change fan by
newpercent = ga->targetfan - 1; * a proportion more */
if (tdiff <= 0) {
applog(LOG_DEBUG, "Temperature %d degrees below target, decreasing fanspeed", opt_hysteresis);
newpercent = ga->targetfan - 1 + tdiff / 5;
} else if (tdiff >= 5) {
applog(LOG_DEBUG, "Temperature climbed %d while below target, increasing fanspeed", tdiff);
newpercent = ga->targetfan + tdiff / 5;
}
} else { } else {
int tdiff = round(temp - lasttemp);
/* We're in the optimal range, make minor adjustments if the /* We're in the optimal range, make minor adjustments if the
* temp is still drifting */ * temp is still drifting */

Loading…
Cancel
Save