Skip to content

Commit

Permalink
Added program exit values for gpu-engine and gpu-memclock. This is ma…
Browse files Browse the repository at this point in the history
…inly relevant for mining rigs that are also used for other purposes. Like my gaming PC. :)

When my R9 290 is mining, it is running at 1000 engine and 1500 memclock. But when I am using it for gaming, it runs 1117 engine and 1375 memclock. Normally I have to use a utility like MSI AfterBurner or Sapphire TriXX to do so. But this change allows me to set an exit value for each GPU when cgminer exits.

Above functionality as an example: --gpu-engine 1000:1117 --gpu-memclock 1500:1375

You can still combine it with multiple cards like this:
--gpu-engine 900,1000:1117 --gpu-memclock 1375,1500:1375
or this:
--gpu-engine 900:880,1000:1117 --gpu-memclock 1375:1250,1500:1375
  • Loading branch information
Kalroth committed Jan 11, 2014
1 parent 015c064 commit 09423b7
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 16 deletions.
12 changes: 12 additions & 0 deletions adl.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,9 @@ void init_adl(int nDevs)

if (gpus[gpu].deven == DEV_DISABLED) {
gpus[gpu].gpu_engine =
gpus[gpu].gpu_engine_exit =
gpus[gpu].gpu_memclock =
gpus[gpu].gpu_memclock_exit =
gpus[gpu].gpu_vddc =
gpus[gpu].gpu_fan =
gpus[gpu].gpu_powertune = 0;
Expand Down Expand Up @@ -1434,6 +1436,16 @@ void clear_adl(int nDevs)
/* Only reset the values if we've changed them at any time */
if (!gpus[i].has_adl || !ga->managed)
continue;

int lev;
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1;

/* Set exit values of the GPU */
if (gpus[i].gpu_engine_exit)
ga->DefPerfLev->aLevels[lev].iEngineClock = gpus[i].gpu_engine_exit * 100;
if (gpus[i].gpu_memclock_exit)
ga->DefPerfLev->aLevels[lev].iMemoryClock = gpus[i].gpu_memclock_exit * 100;

ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, ga->DefPerfLev);
free(ga->DefPerfLev);
ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->DefFanSpeedValue);
Expand Down
19 changes: 19 additions & 0 deletions cgminer.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,25 @@ void get_intrange(char *arg, int *val1, int *val2)
*val2 = *val1;
}

void get_intexitval(char *arg, int *val1, int *val2)
{
if (sscanf(arg, "%d:%d", val1, val2) == 1)
*val2 = *val1;
}

void get_intrangeexitval(char *arg, int *val1, int *val2, int *val3)
{
if (sscanf(arg, "%d:%d", val2, val3) == 2)
{
*val1 = *val2;
}
else if (sscanf(arg, "%d-%d:%d", val1, val2, val3) != 3)
{
get_intrange(arg, val1, val2);
*val3 = *val2;
}
}

static char *set_devices(char *arg)
{
int i, val1 = 0, val2 = 0;
Expand Down
44 changes: 28 additions & 16 deletions driver-opencl.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,33 +280,36 @@ char *set_gpu_map(char *arg)

char *set_gpu_engine(char *arg)
{
int i, val1 = 0, val2 = 0, device = 0;
int i, min_val = 0, gpu_val = 0, exit_val = 0, device = 0;
char *nextptr;

nextptr = strtok(arg, ",");
if (nextptr == NULL)
return "Invalid parameters for set gpu engine";
get_intrange(nextptr, &val1, &val2);
if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999)
get_intrangeexitval(nextptr, &min_val, &gpu_val, &exit_val);
if (min_val < 0 || min_val > 9999 || gpu_val < 0 || gpu_val > 9999 || exit_val < 0 || exit_val > 9999)
return "Invalid value passed to set_gpu_engine";

gpus[device].min_engine = val1;
gpus[device].gpu_engine = val2;
gpus[device].min_engine = min_val;
gpus[device].gpu_engine = gpu_val;
gpus[device].gpu_engine_exit = exit_val;
device++;

while ((nextptr = strtok(NULL, ",")) != NULL) {
get_intrange(nextptr, &val1, &val2);
if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999)
get_intrangeexitval(nextptr, &min_val, &gpu_val, &exit_val);
if (min_val < 0 || min_val > 9999 || gpu_val < 0 || gpu_val > 9999 || exit_val < 0 || exit_val > 9999)
return "Invalid value passed to set_gpu_engine";
gpus[device].min_engine = val1;
gpus[device].gpu_engine = val2;
gpus[device].min_engine = min_val;
gpus[device].gpu_engine = gpu_val;
gpus[device].gpu_engine_exit = exit_val;
device++;
}

if (device == 1) {
for (i = 1; i < MAX_GPUDEVICES; i++) {
gpus[i].min_engine = gpus[0].min_engine;
gpus[i].gpu_engine = gpus[0].gpu_engine;
gpus[i].gpu_engine_exit = gpus[0].gpu_engine_exit;
}
}

Expand Down Expand Up @@ -351,28 +354,37 @@ char *set_gpu_fan(char *arg)

char *set_gpu_memclock(char *arg)
{
int i, val = 0, device = 0;
int i, val = 0, exit_val = 0, device = 0;
char *nextptr;
char *valuesptr;

nextptr = strtok(arg, ",");
if (nextptr == NULL)
return "Invalid parameters for set gpu memclock";
val = atoi(nextptr);
if (val < 0 || val >= 9999)
get_intexitval(nextptr, &val, &exit_val);

if (val < 0 || val > 9999 || exit_val < 0 || exit_val > 9999)
return "Invalid value passed to set_gpu_memclock";

gpus[device++].gpu_memclock = val;
gpus[device].gpu_memclock = val;
gpus[device].gpu_memclock_exit = exit_val;
device++;

while ((nextptr = strtok(NULL, ",")) != NULL) {
val = atoi(nextptr);
if (val < 0 || val >= 9999)
get_intexitval(nextptr, &val, &exit_val);
if (val < 0 || val > 9999 || exit_val < 0 || exit_val > 9999)
return "Invalid value passed to set_gpu_memclock";

gpus[device++].gpu_memclock = val;
gpus[device].gpu_memclock = val;
gpus[device].gpu_memclock_exit = exit_val;
device++;
}
if (device == 1) {
for (i = device; i < MAX_GPUDEVICES; i++)
{
gpus[i].gpu_memclock = gpus[0].gpu_memclock;
gpus[i].gpu_memclock_exit = gpus[0].gpu_memclock_exit;
}
}

return NULL;
Expand Down
2 changes: 2 additions & 0 deletions miner.h
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,8 @@ struct cgpu_info {
int gpu_memdiff;
int gpu_powertune;
float gpu_vddc;
int gpu_engine_exit;
int gpu_memclock_exit;
#endif
int diff1;
double diff_accepted;
Expand Down

0 comments on commit 09423b7

Please sign in to comment.