|
|
@ -191,7 +191,6 @@ static int opt_fail_pause = 5; |
|
|
|
static int fail_pause = 5; |
|
|
|
static int fail_pause = 5; |
|
|
|
static int opt_log_interval = 5; |
|
|
|
static int opt_log_interval = 5; |
|
|
|
bool opt_log_output = false; |
|
|
|
bool opt_log_output = false; |
|
|
|
static bool opt_dynamic = true; |
|
|
|
|
|
|
|
static int opt_queue = 1; |
|
|
|
static int opt_queue = 1; |
|
|
|
int opt_vectors; |
|
|
|
int opt_vectors; |
|
|
|
int opt_worksize; |
|
|
|
int opt_worksize; |
|
|
@ -216,7 +215,6 @@ static bool forced_n_threads; |
|
|
|
static int opt_n_threads; |
|
|
|
static int opt_n_threads; |
|
|
|
static int mining_threads; |
|
|
|
static int mining_threads; |
|
|
|
static int num_processors; |
|
|
|
static int num_processors; |
|
|
|
static int scan_intensity; |
|
|
|
|
|
|
|
bool use_curses = true; |
|
|
|
bool use_curses = true; |
|
|
|
static bool opt_submit_stale; |
|
|
|
static bool opt_submit_stale; |
|
|
|
static bool opt_nogpu; |
|
|
|
static bool opt_nogpu; |
|
|
@ -947,12 +945,6 @@ static char *set_int_0_to_9999(const char *arg, int *i) |
|
|
|
return set_int_range(arg, i, 0, 9999); |
|
|
|
return set_int_range(arg, i, 0, 9999); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static char *forced_int_1010(const char *arg, int *i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
opt_dynamic = false; |
|
|
|
|
|
|
|
return set_int_range(arg, i, -10, 10); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char *force_nthreads_int(const char *arg, int *i) |
|
|
|
static char *force_nthreads_int(const char *arg, int *i) |
|
|
|
{ |
|
|
|
{ |
|
|
|
forced_n_threads = true; |
|
|
|
forced_n_threads = true; |
|
|
@ -1370,6 +1362,50 @@ static char *set_temp_target(char *arg) |
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef HAVE_OPENCL |
|
|
|
|
|
|
|
static char *set_intensity(char *arg) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int i, device = 0, *tt; |
|
|
|
|
|
|
|
char *nextptr, val = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nextptr = strtok(arg, ","); |
|
|
|
|
|
|
|
if (nextptr == NULL) |
|
|
|
|
|
|
|
return "Invalid parameters for set intensity"; |
|
|
|
|
|
|
|
if (!strncasecmp(nextptr, "d", 1)) |
|
|
|
|
|
|
|
gpus[device].dynamic = true; |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
val = atoi(nextptr); |
|
|
|
|
|
|
|
if (val < -10 || val > 10) |
|
|
|
|
|
|
|
return "Invalid value passed to set intensity"; |
|
|
|
|
|
|
|
tt = &gpus[device].intensity; |
|
|
|
|
|
|
|
*tt = val; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
device++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((nextptr = strtok(NULL, ",")) != NULL) { |
|
|
|
|
|
|
|
if (!strncasecmp(nextptr, "d", 1)) |
|
|
|
|
|
|
|
gpus[device].dynamic = true; |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
val = atoi(nextptr); |
|
|
|
|
|
|
|
if (val < -10 || val > 10) |
|
|
|
|
|
|
|
return "Invalid value passed to set intensity"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tt = &gpus[device].intensity; |
|
|
|
|
|
|
|
*tt = val; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
device++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (device == 1) { |
|
|
|
|
|
|
|
for (i = device; i < MAX_GPUDEVICES; i++) { |
|
|
|
|
|
|
|
gpus[i].dynamic = gpus[0].dynamic; |
|
|
|
|
|
|
|
gpus[i].intensity = gpus[0].intensity; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* These options are available from config file or commandline */ |
|
|
|
/* These options are available from config file or commandline */ |
|
|
|
static struct opt_table opt_config_table[] = { |
|
|
|
static struct opt_table opt_config_table[] = { |
|
|
@ -1449,8 +1485,8 @@ static struct opt_table opt_config_table[] = { |
|
|
|
"Set the GPU voltage in Volts - one value for all or separate by commas for per card"), |
|
|
|
"Set the GPU voltage in Volts - one value for all or separate by commas for per card"), |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
OPT_WITH_ARG("--intensity|-I", |
|
|
|
OPT_WITH_ARG("--intensity|-I", |
|
|
|
forced_int_1010, NULL, &scan_intensity, |
|
|
|
set_intensity, NULL, NULL, |
|
|
|
"Intensity of GPU scanning (-10 -> 10, default: dynamic to maintain desktop interactivity)"), |
|
|
|
"Intensity of GPU scanning (d or -10 -> 10, default: d to maintain desktop interactivity)"), |
|
|
|
OPT_WITH_ARG("--kernel-path|-K", |
|
|
|
OPT_WITH_ARG("--kernel-path|-K", |
|
|
|
opt_set_charp, opt_show_charp, &opt_kernel_path, |
|
|
|
opt_set_charp, opt_show_charp, &opt_kernel_path, |
|
|
|
"Specify a path to where the kernel .cl files are"), |
|
|
|
"Specify a path to where the kernel .cl files are"), |
|
|
@ -1854,9 +1890,9 @@ static void curses_print_status(void) |
|
|
|
mvwhline(statuswin, 1, 0, '-', 80); |
|
|
|
mvwhline(statuswin, 1, 0, '-', 80); |
|
|
|
mvwprintw(statuswin, 2, 0, " %s", statusline); |
|
|
|
mvwprintw(statuswin, 2, 0, " %s", statusline); |
|
|
|
wclrtoeol(statuswin); |
|
|
|
wclrtoeol(statuswin); |
|
|
|
mvwprintw(statuswin, 3, 0, " TQ: %d ST: %d SS: %d DW: %d NB: %d LW: %d GF: %d RF: %d I: %d", |
|
|
|
mvwprintw(statuswin, 3, 0, " TQ: %d ST: %d SS: %d DW: %d NB: %d LW: %d GF: %d RF: %d", |
|
|
|
total_queued, requests_staged(), total_stale, total_discarded, new_blocks, |
|
|
|
total_queued, requests_staged(), total_stale, total_discarded, new_blocks, |
|
|
|
local_work, total_go, total_ro, scan_intensity); |
|
|
|
local_work, total_go, total_ro); |
|
|
|
wclrtoeol(statuswin); |
|
|
|
wclrtoeol(statuswin); |
|
|
|
if (pool_strategy == POOL_LOADBALANCE && total_pools > 1) |
|
|
|
if (pool_strategy == POOL_LOADBALANCE && total_pools > 1) |
|
|
|
mvwprintw(statuswin, 4, 0, " Connected to multiple pools with%s LP", |
|
|
|
mvwprintw(statuswin, 4, 0, " Connected to multiple pools with%s LP", |
|
|
@ -3067,12 +3103,7 @@ static void set_options(void) |
|
|
|
immedok(logwin, true); |
|
|
|
immedok(logwin, true); |
|
|
|
clear_logwin(); |
|
|
|
clear_logwin(); |
|
|
|
retry: |
|
|
|
retry: |
|
|
|
wlogprint("\n[D]ynamic mode: %s\n[L]ongpoll: %s\n", |
|
|
|
wlogprint("\n[L]ongpoll: %s\n", want_longpoll ? "On" : "Off"); |
|
|
|
opt_dynamic ? "On" : "Off", want_longpoll ? "On" : "Off"); |
|
|
|
|
|
|
|
if (opt_dynamic) |
|
|
|
|
|
|
|
wlogprint("[I]ntensity: Dynamic\n"); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
wlogprint("[I]ntensity: %d\n", scan_intensity); |
|
|
|
|
|
|
|
wlogprint("[Q]ueue: %d\n[S]cantime: %d\n[R]etries: %d\n[P]ause: %d\n", |
|
|
|
wlogprint("[Q]ueue: %d\n[S]cantime: %d\n[R]etries: %d\n[P]ause: %d\n", |
|
|
|
opt_queue, opt_scantime, opt_retries, opt_fail_pause); |
|
|
|
opt_queue, opt_scantime, opt_retries, opt_fail_pause); |
|
|
|
wlogprint("Select an option or any other key to return\n"); |
|
|
|
wlogprint("Select an option or any other key to return\n"); |
|
|
@ -3086,23 +3117,11 @@ retry: |
|
|
|
} |
|
|
|
} |
|
|
|
opt_queue = selected; |
|
|
|
opt_queue = selected; |
|
|
|
goto retry; |
|
|
|
goto retry; |
|
|
|
} else if (!strncasecmp(&input, "d", 1)) { |
|
|
|
|
|
|
|
opt_dynamic ^= true; |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} else if (!strncasecmp(&input, "l", 1)) { |
|
|
|
} else if (!strncasecmp(&input, "l", 1)) { |
|
|
|
want_longpoll ^= true; |
|
|
|
want_longpoll ^= true; |
|
|
|
applog(LOG_WARNING, "Longpoll %s", want_longpoll ? "enabled" : "disabled"); |
|
|
|
applog(LOG_WARNING, "Longpoll %s", want_longpoll ? "enabled" : "disabled"); |
|
|
|
restart_longpoll(); |
|
|
|
restart_longpoll(); |
|
|
|
goto retry; |
|
|
|
goto retry; |
|
|
|
} else if (!strncasecmp(&input, "i", 1)) { |
|
|
|
|
|
|
|
selected = curses_int("Set GPU scan intensity (-10 -> 10)"); |
|
|
|
|
|
|
|
if (selected < -10 || selected > 10) { |
|
|
|
|
|
|
|
wlogprint("Invalid selection\n"); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
opt_dynamic = false; |
|
|
|
|
|
|
|
scan_intensity = selected; |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} else if (!strncasecmp(&input, "s", 1)) { |
|
|
|
} else if (!strncasecmp(&input, "s", 1)) { |
|
|
|
selected = curses_int("Set scantime in seconds"); |
|
|
|
selected = curses_int("Set scantime in seconds"); |
|
|
|
if (selected < 0 || selected > 9999) { |
|
|
|
if (selected < 0 || selected > 9999) { |
|
|
@ -3194,6 +3213,11 @@ retry: |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
wlog("Last initialised: %s\n", cgpu->init); |
|
|
|
wlog("Last initialised: %s\n", cgpu->init); |
|
|
|
|
|
|
|
wlog("Intensity: "); |
|
|
|
|
|
|
|
if (gpus[gpu].dynamic) |
|
|
|
|
|
|
|
wlog("Dynamic\n"); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
wlog("%u\n", gpus[gpu].intensity); |
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
thr = &thr_info[i]; |
|
|
|
thr = &thr_info[i]; |
|
|
|
if (thr->cgpu != cgpu) |
|
|
|
if (thr->cgpu != cgpu) |
|
|
@ -3220,7 +3244,7 @@ retry: |
|
|
|
wlog("\n"); |
|
|
|
wlog("\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
wlogprint("[E]nable [D]isable [R]estart GPU %s\n",adl_active ? "[C]hange settings" : ""); |
|
|
|
wlogprint("[E]nable [D]isable [I]ntensity [R]estart GPU %s\n",adl_active ? "[C]hange settings" : ""); |
|
|
|
|
|
|
|
|
|
|
|
wlogprint("Or press any other key to continue\n"); |
|
|
|
wlogprint("Or press any other key to continue\n"); |
|
|
|
input = getch(); |
|
|
|
input = getch(); |
|
|
@ -3269,6 +3293,37 @@ retry: |
|
|
|
} |
|
|
|
} |
|
|
|
gpu_devices[selected] = false; |
|
|
|
gpu_devices[selected] = false; |
|
|
|
goto retry; |
|
|
|
goto retry; |
|
|
|
|
|
|
|
} else if (!strncasecmp(&input, "i", 1)) { |
|
|
|
|
|
|
|
int intensity; |
|
|
|
|
|
|
|
char *intvar; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (selected) |
|
|
|
|
|
|
|
selected = curses_int("Select GPU to change intensity on"); |
|
|
|
|
|
|
|
if (selected < 0 || selected >= nDevs) { |
|
|
|
|
|
|
|
wlogprint("Invalid selection\n"); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
intvar = curses_input("Set GPU scan intensity (d or -10 -> 10)"); |
|
|
|
|
|
|
|
if (!intvar) { |
|
|
|
|
|
|
|
wlogprint("Invalid input\n"); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!strncasecmp(intvar, "d", 1)) { |
|
|
|
|
|
|
|
wlogprint("Dynamic mode enabled on gpu %d\n", selected); |
|
|
|
|
|
|
|
gpus[selected].dynamic = true; |
|
|
|
|
|
|
|
free(intvar); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
intensity = atoi(intvar); |
|
|
|
|
|
|
|
free(intvar); |
|
|
|
|
|
|
|
if (intensity < -10 || intensity > 10) { |
|
|
|
|
|
|
|
wlogprint("Invalid selection\n"); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
gpus[selected].dynamic = false; |
|
|
|
|
|
|
|
gpus[selected].intensity = intensity; |
|
|
|
|
|
|
|
wlogprint("Intensity on gpu %d set to %d\n", selected, intensity); |
|
|
|
|
|
|
|
goto retry; |
|
|
|
} else if (!strncasecmp(&input, "r", 1)) { |
|
|
|
} else if (!strncasecmp(&input, "r", 1)) { |
|
|
|
if (selected) |
|
|
|
if (selected) |
|
|
|
selected = curses_int("Select GPU to attempt to restart"); |
|
|
|
selected = curses_int("Select GPU to attempt to restart"); |
|
|
@ -4152,9 +4207,9 @@ static cl_int queue_phatk_kernel(_clState *clState, dev_blk_ctx *blk) |
|
|
|
|
|
|
|
|
|
|
|
static void set_threads_hashes(unsigned int vectors, unsigned int *threads, |
|
|
|
static void set_threads_hashes(unsigned int vectors, unsigned int *threads, |
|
|
|
unsigned int *hashes, size_t *globalThreads, |
|
|
|
unsigned int *hashes, size_t *globalThreads, |
|
|
|
unsigned int minthreads) |
|
|
|
unsigned int minthreads, int intensity) |
|
|
|
{ |
|
|
|
{ |
|
|
|
*threads = 1 << (15 + scan_intensity); |
|
|
|
*threads = 1 << (15 + intensity); |
|
|
|
if (*threads < minthreads) |
|
|
|
if (*threads < minthreads) |
|
|
|
*threads = minthreads; |
|
|
|
*threads = minthreads; |
|
|
|
*globalThreads = *threads; |
|
|
|
*globalThreads = *threads; |
|
|
@ -4203,12 +4258,6 @@ static void *gpuminer_thread(void *userdata) |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (opt_dynamic) { |
|
|
|
|
|
|
|
/* Minimise impact on desktop if we want dynamic mode */ |
|
|
|
|
|
|
|
setpriority(PRIO_PROCESS, 0, 19); |
|
|
|
|
|
|
|
drop_policy(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); |
|
|
|
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); |
|
|
|
|
|
|
|
|
|
|
|
res = calloc(BUFFERSIZE, 1); |
|
|
|
res = calloc(BUFFERSIZE, 1); |
|
|
@ -4222,7 +4271,7 @@ static void *gpuminer_thread(void *userdata) |
|
|
|
gettimeofday(&tv_start, NULL); |
|
|
|
gettimeofday(&tv_start, NULL); |
|
|
|
localThreads[0] = clState->work_size; |
|
|
|
localThreads[0] = clState->work_size; |
|
|
|
set_threads_hashes(vectors, &threads, &hashes, &globalThreads[0], |
|
|
|
set_threads_hashes(vectors, &threads, &hashes, &globalThreads[0], |
|
|
|
localThreads[0]); |
|
|
|
localThreads[0], gpus[gpu].intensity); |
|
|
|
|
|
|
|
|
|
|
|
diff.tv_sec = 0; |
|
|
|
diff.tv_sec = 0; |
|
|
|
gettimeofday(&tv_end, NULL); |
|
|
|
gettimeofday(&tv_end, NULL); |
|
|
@ -4262,19 +4311,20 @@ static void *gpuminer_thread(void *userdata) |
|
|
|
timeval_subtract(&diff, &tv_gpuend, &tv_gpustart); |
|
|
|
timeval_subtract(&diff, &tv_gpuend, &tv_gpustart); |
|
|
|
gpu_us = diff.tv_sec * 1000000 + diff.tv_usec; |
|
|
|
gpu_us = diff.tv_sec * 1000000 + diff.tv_usec; |
|
|
|
decay_time(&gpu_ms_average, gpu_us / 1000); |
|
|
|
decay_time(&gpu_ms_average, gpu_us / 1000); |
|
|
|
if (opt_dynamic) { |
|
|
|
if (gpus[gpu].dynamic) { |
|
|
|
/* Try to not let the GPU be out for longer than 6ms, but
|
|
|
|
/* Try to not let the GPU be out for longer than 6ms, but
|
|
|
|
* increase intensity when the system is idle, unless |
|
|
|
* increase intensity when the system is idle, unless |
|
|
|
* dynamic is disabled. */ |
|
|
|
* dynamic is disabled. */ |
|
|
|
if (gpu_ms_average > 7) { |
|
|
|
if (gpu_ms_average > 7) { |
|
|
|
if (scan_intensity > -10) |
|
|
|
if (gpus[gpu].intensity > -10) |
|
|
|
scan_intensity--; |
|
|
|
gpus[gpu].intensity--; |
|
|
|
} else if (gpu_ms_average < 3) { |
|
|
|
} else if (gpu_ms_average < 3) { |
|
|
|
if (scan_intensity < 10) |
|
|
|
if (gpus[gpu].intensity < 10) |
|
|
|
scan_intensity++; |
|
|
|
gpus[gpu].intensity++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
set_threads_hashes(vectors, &threads, &hashes, globalThreads, localThreads[0]); |
|
|
|
set_threads_hashes(vectors, &threads, &hashes, globalThreads, |
|
|
|
|
|
|
|
localThreads[0], gpus[gpu].intensity); |
|
|
|
|
|
|
|
|
|
|
|
if (diff.tv_sec > opt_scantime || |
|
|
|
if (diff.tv_sec > opt_scantime || |
|
|
|
work->blk.nonce >= MAXTHREADS - hashes || |
|
|
|
work->blk.nonce >= MAXTHREADS - hashes || |
|
|
@ -5213,8 +5263,10 @@ int main (int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_OPENCL |
|
|
|
#ifdef HAVE_OPENCL |
|
|
|
if (!skip_to_bench) { |
|
|
|
if (!skip_to_bench) { |
|
|
|
for (i = 0; i < MAX_GPUDEVICES; i++) |
|
|
|
for (i = 0; i < MAX_GPUDEVICES; i++) { |
|
|
|
gpu_devices[i] = false; |
|
|
|
gpu_devices[i] = false; |
|
|
|
|
|
|
|
gpus[i].dynamic = true; |
|
|
|
|
|
|
|
} |
|
|
|
nDevs = clDevicesNum(); |
|
|
|
nDevs = clDevicesNum(); |
|
|
|
if (nDevs < 0) { |
|
|
|
if (nDevs < 0) { |
|
|
|
applog(LOG_ERR, "clDevicesNum returned error, none usable"); |
|
|
|
applog(LOG_ERR, "clDevicesNum returned error, none usable"); |
|
|
|