mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-09 14:28:12 +00:00
Generalize --temp-cutoff and implement support for reading temperature from BitFORCE FPGAs
This commit is contained in:
parent
8c609579f4
commit
543265d66a
2
README
2
README
@ -153,6 +153,7 @@ Options for both config file and command line:
|
|||||||
--socks-proxy <arg> Set socks4 proxy (host:port)
|
--socks-proxy <arg> Set socks4 proxy (host:port)
|
||||||
--submit-stale Submit shares even if they would normally be considered stale
|
--submit-stale Submit shares even if they would normally be considered stale
|
||||||
--syslog Use system log for output messages (default: standard error)
|
--syslog Use system log for output messages (default: standard error)
|
||||||
|
--temp-cutoff <arg> Temperature where a device will be automatically disabled, one value or comma separated list (default: 95)
|
||||||
--text-only|-T Disable ncurses formatted screen output
|
--text-only|-T Disable ncurses formatted screen output
|
||||||
--url|-o <arg> URL for bitcoin JSON-RPC server
|
--url|-o <arg> URL for bitcoin JSON-RPC server
|
||||||
--user|-u <arg> Username for bitcoin JSON-RPC server
|
--user|-u <arg> Username for bitcoin JSON-RPC server
|
||||||
@ -183,7 +184,6 @@ GPU only options:
|
|||||||
--kernel-path|-K <arg> Specify a path to where the kernel .cl files are (default: "/usr/local/bin")
|
--kernel-path|-K <arg> Specify a path to where the kernel .cl files are (default: "/usr/local/bin")
|
||||||
--kernel|-k <arg> Select kernel to use (poclbm or phatk - default: auto)
|
--kernel|-k <arg> Select kernel to use (poclbm or phatk - default: auto)
|
||||||
--no-restart Do not attempt to restart GPUs that hang
|
--no-restart Do not attempt to restart GPUs that hang
|
||||||
--temp-cutoff <arg> Temperature where a GPU device will be automatically disabled, one value or comma separated list (default: 95)
|
|
||||||
--temp-hysteresis <arg> Set how much the temperature can fluctuate outside limits when automanaging speeds (default: 3)
|
--temp-hysteresis <arg> Set how much the temperature can fluctuate outside limits when automanaging speeds (default: 3)
|
||||||
--temp-overheat <arg> Overheat temperature when automatically managing fan and GPU speeds (default: 85)
|
--temp-overheat <arg> Overheat temperature when automatically managing fan and GPU speeds (default: 85)
|
||||||
--temp-target <arg> Target temperature when automatically managing fan and GPU speeds (default: 75)
|
--temp-target <arg> Target temperature when automatically managing fan and GPU speeds (default: 75)
|
||||||
|
12
adl.c
12
adl.c
@ -26,7 +26,6 @@ bool opt_reorder = false;
|
|||||||
int opt_hysteresis = 3;
|
int opt_hysteresis = 3;
|
||||||
const int opt_targettemp = 75;
|
const int opt_targettemp = 75;
|
||||||
const int opt_overheattemp = 85;
|
const int opt_overheattemp = 85;
|
||||||
const int opt_cutofftemp = 95;
|
|
||||||
static pthread_mutex_t adl_lock;
|
static pthread_mutex_t adl_lock;
|
||||||
|
|
||||||
struct gpu_adapters {
|
struct gpu_adapters {
|
||||||
@ -443,8 +442,8 @@ void init_adl(int nDevs)
|
|||||||
ga->targettemp = opt_targettemp;
|
ga->targettemp = opt_targettemp;
|
||||||
if (!ga->overtemp)
|
if (!ga->overtemp)
|
||||||
ga->overtemp = opt_overheattemp;
|
ga->overtemp = opt_overheattemp;
|
||||||
if (!ga->cutofftemp)
|
if (!gpus[gpu].cutofftemp)
|
||||||
ga->cutofftemp = opt_cutofftemp;
|
gpus[gpu].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 */
|
||||||
@ -503,6 +502,7 @@ float gpu_temp(int gpu)
|
|||||||
lock_adl();
|
lock_adl();
|
||||||
ret = __gpu_temp(ga);
|
ret = __gpu_temp(ga);
|
||||||
unlock_adl();
|
unlock_adl();
|
||||||
|
gpus[gpu].temp = ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1055,7 +1055,7 @@ void gpu_autotune(int gpu, bool *enable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (engine && ga->autoengine) {
|
if (engine && ga->autoengine) {
|
||||||
if (temp > ga->cutofftemp) {
|
if (temp > cgpu->cutofftemp) {
|
||||||
applog(LOG_WARNING, "Hit thermal cutoff limit on GPU %d, disabling!", gpu);
|
applog(LOG_WARNING, "Hit thermal cutoff limit on GPU %d, disabling!", gpu);
|
||||||
*enable = false;
|
*enable = false;
|
||||||
newengine = ga->minspeed;
|
newengine = ga->minspeed;
|
||||||
@ -1122,7 +1122,7 @@ 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("Cutoff temperature: %d\n", gpus[gpu].cutofftemp);
|
||||||
wlogprint("Toggle [F]an auto [G]PU auto\nChange [T]arget [O]verheat [C]utoff\n");
|
wlogprint("Toggle [F]an auto [G]PU auto\nChange [T]arget [O]verheat [C]utoff\n");
|
||||||
wlogprint("Or press any other key to continue\n");
|
wlogprint("Or press any other key to continue\n");
|
||||||
input = getch();
|
input = getch();
|
||||||
@ -1159,7 +1159,7 @@ void change_autosettings(int gpu)
|
|||||||
if (val <= ga->overtemp || val > 200)
|
if (val <= ga->overtemp || val > 200)
|
||||||
wlogprint("Invalid temperature");
|
wlogprint("Invalid temperature");
|
||||||
else
|
else
|
||||||
ga->cutofftemp = val;
|
gpus[gpu].cutofftemp = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
adl.h
1
adl.h
@ -6,7 +6,6 @@ bool opt_reorder;
|
|||||||
int opt_hysteresis;
|
int opt_hysteresis;
|
||||||
const int opt_targettemp;
|
const int opt_targettemp;
|
||||||
const int opt_overheattemp;
|
const int opt_overheattemp;
|
||||||
const 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);
|
||||||
|
29
bitforce.c
29
bitforce.c
@ -10,6 +10,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <strings.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
@ -146,6 +147,16 @@ static void bitforce_detect()
|
|||||||
bitforce_detect_auto();
|
bitforce_detect_auto();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_bitforce_statline_before(char *buf, struct cgpu_info *bitforce)
|
||||||
|
{
|
||||||
|
float gt = bitforce->temp;
|
||||||
|
if (gt > 0)
|
||||||
|
tailsprintf(buf, "%5.1fC ", gt);
|
||||||
|
else
|
||||||
|
tailsprintf(buf, " ", gt);
|
||||||
|
tailsprintf(buf, " | ");
|
||||||
|
}
|
||||||
|
|
||||||
static bool bitforce_thread_prepare(struct thr_info *thr)
|
static bool bitforce_thread_prepare(struct thr_info *thr)
|
||||||
{
|
{
|
||||||
struct cgpu_info *bitforce = thr->cgpu;
|
struct cgpu_info *bitforce = thr->cgpu;
|
||||||
@ -221,6 +232,23 @@ static uint64_t bitforce_scanhash(struct thr_info *thr, struct work *work, uint6
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BFwrite(fdDev, "ZKX", 3);
|
||||||
|
BFgets(pdevbuf, sizeof(pdevbuf), fdDev);
|
||||||
|
if (unlikely(!pdevbuf[0])) {
|
||||||
|
applog(LOG_ERR, "Error reading from BitForce (ZKX)");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strncasecmp(pdevbuf, "TEMP:", 5)) {
|
||||||
|
float temp = strtof(pdevbuf + 5, NULL);
|
||||||
|
if (temp > 0) {
|
||||||
|
bitforce->temp = temp;
|
||||||
|
if (temp > bitforce->cutofftemp) {
|
||||||
|
applog(LOG_WARNING, "Hit thermal cutoff limit on %s %d, disabling!", bitforce->api->name, bitforce->device_id);
|
||||||
|
bitforce->enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
usleep(4500000);
|
usleep(4500000);
|
||||||
i = 4500;
|
i = 4500;
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -267,6 +295,7 @@ struct device_api bitforce_api = {
|
|||||||
.name = "BFL",
|
.name = "BFL",
|
||||||
.api_detect = bitforce_detect,
|
.api_detect = bitforce_detect,
|
||||||
// .reinit_device = TODO
|
// .reinit_device = TODO
|
||||||
|
.get_statline_before = get_bitforce_statline_before,
|
||||||
.thread_prepare = bitforce_thread_prepare,
|
.thread_prepare = bitforce_thread_prepare,
|
||||||
.scanhash = bitforce_scanhash,
|
.scanhash = bitforce_scanhash,
|
||||||
};
|
};
|
||||||
|
51
cgminer.c
51
cgminer.c
@ -90,6 +90,7 @@ bool use_syslog = false;
|
|||||||
static bool opt_quiet = false;
|
static bool opt_quiet = false;
|
||||||
static bool opt_realquiet = false;
|
static bool opt_realquiet = false;
|
||||||
bool opt_loginput = false;
|
bool opt_loginput = false;
|
||||||
|
const int opt_cutofftemp = 95;
|
||||||
static int opt_retries = -1;
|
static int opt_retries = -1;
|
||||||
static int opt_fail_pause = 5;
|
static int opt_fail_pause = 5;
|
||||||
static int fail_pause = 5;
|
static int fail_pause = 5;
|
||||||
@ -537,6 +538,46 @@ static char *set_schedtime(const char *arg, struct schedtime *st)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *temp_cutoff_str = NULL;
|
||||||
|
|
||||||
|
char *set_temp_cutoff(char *arg)
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
|
||||||
|
if (!(arg && arg[0]))
|
||||||
|
return "Invalid parameters for set temp cutoff";
|
||||||
|
val = atoi(arg);
|
||||||
|
if (val < 0 || val > 200)
|
||||||
|
return "Invalid value passed to set temp cutoff";
|
||||||
|
temp_cutoff_str = arg;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void load_temp_cutoffs()
|
||||||
|
{
|
||||||
|
int i, val = 0, device = 0;
|
||||||
|
char *nextptr;
|
||||||
|
|
||||||
|
if (temp_cutoff_str) {
|
||||||
|
for (device = 0, nextptr = strtok(temp_cutoff_str, ","); nextptr; ++device, nextptr = strtok(NULL, ",")) {
|
||||||
|
if (device >= total_devices)
|
||||||
|
quit(1, "Too many values passed to set temp cutoff");
|
||||||
|
val = atoi(nextptr);
|
||||||
|
if (val < 0 || val > 200)
|
||||||
|
quit(1, "Invalid value passed to set temp cutoff");
|
||||||
|
|
||||||
|
devices[device]->cutofftemp = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
val = opt_cutofftemp;
|
||||||
|
if (device <= 1) {
|
||||||
|
for (i = device; i < total_devices; ++i)
|
||||||
|
devices[i]->cutofftemp = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static char *set_api_allow(const char *arg)
|
static char *set_api_allow(const char *arg)
|
||||||
{
|
{
|
||||||
opt_set_charp(arg, &opt_api_allow);
|
opt_set_charp(arg, &opt_api_allow);
|
||||||
@ -764,10 +805,12 @@ static struct opt_table opt_config_table[] = {
|
|||||||
opt_set_bool, &use_syslog,
|
opt_set_bool, &use_syslog,
|
||||||
"Use system log for output messages (default: standard error)"),
|
"Use system log for output messages (default: standard error)"),
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_ADL
|
#if defined(HAVE_ADL) || defined(USE_BITFORCE)
|
||||||
OPT_WITH_ARG("--temp-cutoff",
|
OPT_WITH_ARG("--temp-cutoff",
|
||||||
set_temp_cutoff, opt_show_intval, &opt_cutofftemp,
|
set_temp_cutoff, opt_show_intval, &opt_cutofftemp,
|
||||||
"Temperature where a GPU device will be automatically disabled, one value or comma separated list"),
|
"Temperature where a device will be automatically disabled, one value or comma separated list"),
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ADL
|
||||||
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"),
|
||||||
@ -2237,7 +2280,7 @@ void write_config(FILE *fcfg)
|
|||||||
fprintf(fcfg, "%s%1.3f", i > 0 ? "," : "", gpus[i].gpu_vddc);
|
fprintf(fcfg, "%s%1.3f", i > 0 ? "," : "", gpus[i].gpu_vddc);
|
||||||
fputs("\",\n\"temp-cutoff\" : \"", fcfg);
|
fputs("\",\n\"temp-cutoff\" : \"", fcfg);
|
||||||
for(i = 0; i < nDevs; i++)
|
for(i = 0; i < nDevs; i++)
|
||||||
fprintf(fcfg, "%s%d", i > 0 ? "," : "", gpus[i].adl.cutofftemp);
|
fprintf(fcfg, "%s%d", i > 0 ? "," : "", gpus[i].cutofftemp);
|
||||||
fputs("\",\n\"temp-overheat\" : \"", fcfg);
|
fputs("\",\n\"temp-overheat\" : \"", fcfg);
|
||||||
for(i = 0; i < nDevs; i++)
|
for(i = 0; i < nDevs; i++)
|
||||||
fprintf(fcfg, "%s%d", i > 0 ? "," : "", gpus[i].adl.overtemp);
|
fprintf(fcfg, "%s%d", i > 0 ? "," : "", gpus[i].adl.overtemp);
|
||||||
@ -4237,6 +4280,8 @@ int main (int argc, char *argv[])
|
|||||||
if (!total_devices)
|
if (!total_devices)
|
||||||
quit(1, "All devices disabled, cannot mine!");
|
quit(1, "All devices disabled, cannot mine!");
|
||||||
|
|
||||||
|
load_temp_cutoffs();
|
||||||
|
|
||||||
devcursor = 8;
|
devcursor = 8;
|
||||||
logstart = devcursor + total_devices + 1;
|
logstart = devcursor + total_devices + 1;
|
||||||
logcursor = logstart + 1;
|
logcursor = logstart + 1;
|
||||||
|
33
device-gpu.c
33
device-gpu.c
@ -269,39 +269,6 @@ char *set_gpu_vddc(char *arg)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *set_temp_cutoff(char *arg)
|
|
||||||
{
|
|
||||||
int i, val = 0, device = 0, *tco;
|
|
||||||
char *nextptr;
|
|
||||||
|
|
||||||
nextptr = strtok(arg, ",");
|
|
||||||
if (nextptr == NULL)
|
|
||||||
return "Invalid parameters for set temp cutoff";
|
|
||||||
val = atoi(nextptr);
|
|
||||||
if (val < 0 || val > 200)
|
|
||||||
return "Invalid value passed to set temp cutoff";
|
|
||||||
|
|
||||||
tco = &gpus[device++].adl.cutofftemp;
|
|
||||||
*tco = val;
|
|
||||||
|
|
||||||
while ((nextptr = strtok(NULL, ",")) != NULL) {
|
|
||||||
val = atoi(nextptr);
|
|
||||||
if (val < 0 || val > 200)
|
|
||||||
return "Invalid value passed to set temp cutoff";
|
|
||||||
|
|
||||||
tco = &gpus[device++].adl.cutofftemp;
|
|
||||||
*tco = val;
|
|
||||||
}
|
|
||||||
if (device == 1) {
|
|
||||||
for (i = device; i < MAX_GPUDEVICES; i++) {
|
|
||||||
tco = &gpus[i].adl.cutofftemp;
|
|
||||||
*tco = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *set_temp_overheat(char *arg)
|
char *set_temp_overheat(char *arg)
|
||||||
{
|
{
|
||||||
int i, val = 0, device = 0, *to;
|
int i, val = 0, device = 0, *to;
|
||||||
|
@ -12,7 +12,6 @@ extern char *set_gpu_memclock(char *arg);
|
|||||||
extern char *set_gpu_memdiff(char *arg);
|
extern char *set_gpu_memdiff(char *arg);
|
||||||
extern char *set_gpu_powertune(char *arg);
|
extern char *set_gpu_powertune(char *arg);
|
||||||
extern char *set_gpu_vddc(char *arg);
|
extern char *set_gpu_vddc(char *arg);
|
||||||
extern char *set_temp_cutoff(char *arg);
|
|
||||||
extern char *set_temp_overheat(char *arg);
|
extern char *set_temp_overheat(char *arg);
|
||||||
extern char *set_temp_target(char *arg);
|
extern char *set_temp_target(char *arg);
|
||||||
extern char *set_intensity(char *arg);
|
extern char *set_intensity(char *arg);
|
||||||
|
7
miner.h
7
miner.h
@ -221,7 +221,6 @@ struct gpu_adl {
|
|||||||
int targetfan;
|
int targetfan;
|
||||||
int targettemp;
|
int targettemp;
|
||||||
int overtemp;
|
int overtemp;
|
||||||
int cutofftemp;
|
|
||||||
int minspeed;
|
int minspeed;
|
||||||
int maxspeed;
|
int maxspeed;
|
||||||
|
|
||||||
@ -280,6 +279,10 @@ struct cgpu_info {
|
|||||||
int virtual_gpu;
|
int virtual_gpu;
|
||||||
bool dynamic;
|
bool dynamic;
|
||||||
int intensity;
|
int intensity;
|
||||||
|
|
||||||
|
float temp;
|
||||||
|
int cutofftemp;
|
||||||
|
|
||||||
#ifdef HAVE_ADL
|
#ifdef HAVE_ADL
|
||||||
bool has_adl;
|
bool has_adl;
|
||||||
struct gpu_adl adl;
|
struct gpu_adl adl;
|
||||||
@ -590,6 +593,7 @@ extern int total_accepted, total_rejected;
|
|||||||
extern int total_getworks, total_stale, total_discarded;
|
extern int total_getworks, total_stale, total_discarded;
|
||||||
extern unsigned int local_work;
|
extern unsigned int local_work;
|
||||||
extern unsigned int total_go, total_ro;
|
extern unsigned int total_go, total_ro;
|
||||||
|
extern const int opt_cutofftemp;
|
||||||
extern int opt_log_interval;
|
extern int opt_log_interval;
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
#ifdef HAVE_OPENCL
|
||||||
@ -686,6 +690,7 @@ enum cl_kernels {
|
|||||||
|
|
||||||
extern void get_datestamp(char *, struct timeval *);
|
extern void get_datestamp(char *, struct timeval *);
|
||||||
bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce);
|
bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce);
|
||||||
|
extern void tailsprintf(char *f, const char *fmt, ...);
|
||||||
extern void wlogprint(const char *f, ...);
|
extern void wlogprint(const char *f, ...);
|
||||||
extern int curses_int(const char *query);
|
extern int curses_int(const char *query);
|
||||||
extern char *curses_input(const char *query);
|
extern char *curses_input(const char *query);
|
||||||
|
Loading…
Reference in New Issue
Block a user