Browse Source

Add a thermal cutoff option as well and set it to 95 degrees by default.

nfactor-troky
Con Kolivas 13 years ago
parent
commit
3997f308a0
  1. 27
      adl.c
  2. 4
      adl.h
  3. 11
      main.c
  4. 1
      miner.h

27
adl.c

@ -24,6 +24,7 @@ bool adl_active;
int opt_hysteresis = 3; int opt_hysteresis = 3;
int opt_targettemp = 75; int opt_targettemp = 75;
int opt_overheattemp = 85; int opt_overheattemp = 85;
int opt_cutofftemp = 95;
static pthread_mutex_t adl_lock; static pthread_mutex_t adl_lock;
// Memory allocation function // Memory allocation function
@ -327,6 +328,7 @@ void init_adl(int nDevs)
/* Set some default temperatures for autotune when enabled */ /* Set some default temperatures for autotune when enabled */
ga->targettemp = opt_targettemp; ga->targettemp = opt_targettemp;
ga->overtemp = opt_overheattemp; ga->overtemp = opt_overheattemp;
ga->cutofftemp = opt_cutofftemp;
if (opt_autofan) { if (opt_autofan) {
ga->autofan = true; ga->autofan = true;
/* Set a safe starting default if we're automanaging fan speeds */ /* Set a safe starting default if we're automanaging fan speeds */
@ -840,15 +842,12 @@ out:
return ret; return ret;
} }
void gpu_autotune(int gpu) void gpu_autotune(int gpu, bool *enable)
{ {
int temp, fanpercent, engine, newpercent, newengine; int temp, fanpercent, engine, newpercent, newengine;
bool fan_optimal = true; bool fan_optimal = true;
struct gpu_adl *ga; struct gpu_adl *ga;
if (!gpus[gpu].has_adl || !adl_active)
return;
ga = &gpus[gpu].adl; ga = &gpus[gpu].adl;
lock_adl(); lock_adl();
@ -886,7 +885,11 @@ void gpu_autotune(int gpu)
} }
if (engine && ga->autoengine) { if (engine && ga->autoengine) {
if (temp > ga->overtemp && engine > ga->minspeed) { if (temp > ga->cutofftemp) {
applog(LOG_WARNING, "Hit thermal cutoff limit, disabling GPU!");
*enable = false;
newengine = ga->minspeed;
} else if (temp > ga->overtemp && engine > ga->minspeed) {
applog(LOG_WARNING, "Overheat detected, decreasing GPU clock speed"); applog(LOG_WARNING, "Overheat detected, decreasing GPU clock speed");
newengine = ga->minspeed; newengine = ga->minspeed;
} else if (temp > ga->targettemp + opt_hysteresis && engine > ga->minspeed && fan_optimal) { } else if (temp > ga->targettemp + opt_hysteresis && engine > ga->minspeed && fan_optimal) {
@ -943,8 +946,9 @@ void change_autosettings(int gpu)
wlogprint("Target temperature: %d\n", ga->targettemp); wlogprint("Target temperature: %d\n", ga->targettemp);
wlogprint("Overheat temperature: %d\n", ga->overtemp); wlogprint("Overheat temperature: %d\n", ga->overtemp);
wlogprint("Cutoff temperature: %d\n", ga->cutofftemp);
wlogprint("Hysteresis differece: %d\n", opt_hysteresis); wlogprint("Hysteresis differece: %d\n", opt_hysteresis);
wlogprint("Toggle [F]an auto [G]PU auto\nChange [T]arget [O]verheat [H]ysteresis\n"); wlogprint("Toggle [F]an auto [G]PU auto\nChange [T]arget [O]verheat [C]utoff [H]ysteresis\n");
wlogprint("Or press any other key to continue\n"); wlogprint("Or press any other key to continue\n");
input = getch(); input = getch();
if (!strncasecmp(&input, "f", 1)) { if (!strncasecmp(&input, "f", 1)) {
@ -968,12 +972,19 @@ void change_autosettings(int gpu)
else else
ga->targettemp = val; ga->targettemp = val;
} else if (!strncasecmp(&input, "o", 1)) { } else if (!strncasecmp(&input, "o", 1)) {
wlogprint("Enter oveheat temperature for this GPU in C (%d-100)", ga->targettemp); wlogprint("Enter overheat temperature for this GPU in C (%d+)", ga->targettemp);
val = curses_int(""); val = curses_int("");
if (val <= ga->targettemp || val > 100) if (val <= ga->targettemp || val > 200)
wlogprint("Invalid temperature"); wlogprint("Invalid temperature");
else else
ga->overtemp = val; ga->overtemp = val;
} else if (!strncasecmp(&input, "c", 1)) {
wlogprint("Enter cutoff temperature for this GPU in C (%d+)", ga->overtemp);
val = curses_int("");
if (val <= ga->overtemp || val > 200)
wlogprint("Invalid temperature");
else
ga->cutofftemp = val;
} else if (!strncasecmp(&input, "h", 1)) { } else if (!strncasecmp(&input, "h", 1)) {
val = curses_int("Enter hysteresis temperature difference (0-10)"); val = curses_int("Enter hysteresis temperature difference (0-10)");
if (val < 1 || val > 10) if (val < 1 || val > 10)

4
adl.h

@ -5,6 +5,7 @@ bool adl_active;
int opt_hysteresis; int opt_hysteresis;
int opt_targettemp; int opt_targettemp;
int opt_overheattemp; int opt_overheattemp;
int opt_cutofftemp;
void init_adl(int nDevs); void init_adl(int nDevs);
float gpu_temp(int gpu); float gpu_temp(int gpu);
int gpu_engineclock(int gpu); int gpu_engineclock(int gpu);
@ -16,13 +17,12 @@ int gpu_fanpercent(int gpu);
bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vddc, bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vddc,
int *activity, int *fanspeed, int *fanpercent, int *powertune); int *activity, int *fanspeed, int *fanpercent, int *powertune);
void change_gpusettings(int gpu); void change_gpusettings(int gpu);
void gpu_autotune(int gpu); void gpu_autotune(int gpu, bool *enable);
void clear_adl(int nDevs); void clear_adl(int nDevs);
#else /* HAVE_ADL */ #else /* HAVE_ADL */
#define adl_active (0) #define adl_active (0)
static inline void init_adl(int nDevs) {} static inline void init_adl(int nDevs) {}
static inline void change_gpusettings(int gpu) { } static inline void change_gpusettings(int gpu) { }
static inline void gpu_autotune(int gpu) { }
static inline void clear_adl(int nDevs) {} static inline void clear_adl(int nDevs) {}
#endif #endif
#endif #endif

11
main.c

@ -1412,6 +1412,9 @@ static struct opt_table opt_config_table[] = {
"Use system log for output messages (default: standard error)"), "Use system log for output messages (default: standard error)"),
#endif #endif
#ifdef HAVE_ADL #ifdef HAVE_ADL
OPT_WITH_ARG("--temp-cutoff",
set_int_0_to_9999, opt_show_intval, &opt_cutofftemp,
"Set the temperature where a GPU device will be automatically disabled"),
OPT_WITH_ARG("--temp-hysteresis", OPT_WITH_ARG("--temp-hysteresis",
set_int_1_to_10, opt_show_intval, &opt_hysteresis, set_int_1_to_10, opt_show_intval, &opt_hysteresis,
"Set how much the temperature can fluctuate outside limits when automanaging speeds"), "Set how much the temperature can fluctuate outside limits when automanaging speeds"),
@ -4573,6 +4576,7 @@ static void *watchdog_thread(void *userdata)
for (i = 0; i < gpu_threads; i++) { for (i = 0; i < gpu_threads; i++) {
struct thr_info *thr; struct thr_info *thr;
bool *enable;
int gpu; int gpu;
/* Use only one thread per device to determine if the GPU is healthy */ /* Use only one thread per device to determine if the GPU is healthy */
@ -4580,9 +4584,10 @@ static void *watchdog_thread(void *userdata)
break; break;
thr = &thr_info[i]; thr = &thr_info[i];
gpu = thr->cgpu->cpu_gpu; gpu = thr->cgpu->cpu_gpu;
enable = &gpu_devices[gpu];
#ifdef HAVE_ADL #ifdef HAVE_ADL
if (adl_active) if (adl_active && gpus[gpu].has_adl && *enable)
gpu_autotune(gpu); gpu_autotune(gpu, enable);
if (opt_debug && gpus[gpu].has_adl) { if (opt_debug && gpus[gpu].has_adl) {
int engineclock = 0, memclock = 0, activity = 0, fanspeed = 0, fanpercent = 0, powertune = 0; int engineclock = 0, memclock = 0, activity = 0, fanspeed = 0, fanpercent = 0, powertune = 0;
float temp = 0, vddc = 0; float temp = 0, vddc = 0;
@ -4593,7 +4598,7 @@ static void *watchdog_thread(void *userdata)
} }
#endif #endif
/* Thread is waiting on getwork or disabled */ /* Thread is waiting on getwork or disabled */
if (thr->getwork || !gpu_devices[gpu]) if (thr->getwork || !*enable)
continue; continue;
if (gpus[gpu].status != LIFE_WELL && now.tv_sec - thr->last.tv_sec < 60) { if (gpus[gpu].status != LIFE_WELL && now.tv_sec - thr->last.tv_sec < 60) {

1
miner.h

@ -180,6 +180,7 @@ struct gpu_adl {
int targettemp; int targettemp;
int overtemp; int overtemp;
int cutofftemp;
int minspeed; int minspeed;
int maxspeed; int maxspeed;
}; };

Loading…
Cancel
Save