|
Lines 4-9
Link Here
|
| 4 |
* Copyright (C) 2012 Bull |
4 |
* Copyright (C) 2012 Bull |
| 5 |
* Written by Don Albert, <don.albert@bull.com> |
5 |
* Written by Don Albert, <don.albert@bull.com> |
| 6 |
* Modified by Rod Schultz, <rod.schultz@bull.com> for min-max:gov |
6 |
* Modified by Rod Schultz, <rod.schultz@bull.com> for min-max:gov |
|
|
7 |
* Modified by Janne Blomqvist, <janne.blomqvist@aalto.fi> for |
| 8 |
* intel_pstate support |
| 7 |
* |
9 |
* |
| 8 |
* This file is part of SLURM, a resource management program. |
10 |
* This file is part of SLURM, a resource management program. |
| 9 |
* For details, see <http://slurm.schedmd.com/>. |
11 |
* For details, see <http://slurm.schedmd.com/>. |
|
Lines 208-218
_cpu_freq_cpu_avail(int cpuidx)
Link Here
|
| 208 |
snprintf(path, sizeof(path), PATH_TO_CPU |
210 |
snprintf(path, sizeof(path), PATH_TO_CPU |
| 209 |
"cpu%u/cpufreq/scaling_available_frequencies", cpuidx); |
211 |
"cpu%u/cpufreq/scaling_available_frequencies", cpuidx); |
| 210 |
if ( ( fp = fopen(path, "r") ) == NULL ) { |
212 |
if ( ( fp = fopen(path, "r") ) == NULL ) { |
| 211 |
static bool open_err_log = true; /* Log once */ |
213 |
/* Don't log an error here, |
| 212 |
if (open_err_log) { |
214 |
* scaling_available_frequencies does not exist when |
| 213 |
error("%s: Could not open %s", __func__, path); |
215 |
* using the intel_pstate driver. */ |
| 214 |
open_err_log = false; |
|
|
| 215 |
} |
| 216 |
return SLURM_FAILURE; |
216 |
return SLURM_FAILURE; |
| 217 |
} |
217 |
} |
| 218 |
for (i = 0; i < (FREQ_LIST_MAX-1); i++) { |
218 |
for (i = 0; i < (FREQ_LIST_MAX-1); i++) { |
|
Lines 424-429
cpu_freq_cpuset_validate(stepd_step_rec_t *job)
Link Here
|
| 424 |
char *cpu_str; |
424 |
char *cpu_str; |
| 425 |
char *savestr = NULL; |
425 |
char *savestr = NULL; |
| 426 |
|
426 |
|
|
|
427 |
|
| 427 |
debug_flags = slurm_get_debug_flags(); /* init for slurmstepd */ |
428 |
debug_flags = slurm_get_debug_flags(); /* init for slurmstepd */ |
| 428 |
if (debug_flags & DEBUG_FLAG_CPU_FREQ) { |
429 |
if (debug_flags & DEBUG_FLAG_CPU_FREQ) { |
| 429 |
info("cpu_freq_cpuset_validate: request: min=(%12d %8x) " |
430 |
info("cpu_freq_cpuset_validate: request: min=(%12d %8x) " |
|
Lines 761-769
_cpu_freq_current_state(int cpuidx)
Link Here
|
| 761 |
* than the 'cpuinfo' values. |
762 |
* than the 'cpuinfo' values. |
| 762 |
* The 'cpuinfo' values are read only. min/max seem to be raw |
763 |
* The 'cpuinfo' values are read only. min/max seem to be raw |
| 763 |
* hardware capability. |
764 |
* hardware capability. |
| 764 |
* The 'scaling' values are set by the governor |
765 |
* The 'scaling' values are set by the governor. |
|
|
766 |
* For the current frequency, use the cpuinfo_cur_freq file |
| 767 |
* since the intel_pstate driver doesn't necessarily create |
| 768 |
* the scaling_cur_freq file. |
| 765 |
*/ |
769 |
*/ |
| 766 |
freq = _cpu_freq_get_scaling_freq(cpuidx, "scaling_cur_freq"); |
770 |
freq = _cpu_freq_get_scaling_freq(cpuidx, "cpuinfo_cur_freq"); |
| 767 |
if (freq == 0) |
771 |
if (freq == 0) |
| 768 |
return SLURM_FAILURE; |
772 |
return SLURM_FAILURE; |
| 769 |
cpufreq[cpuidx].org_frequency = freq; |
773 |
cpufreq[cpuidx].org_frequency = freq; |
|
Lines 898-910
_cpu_freq_setup_data(stepd_step_rec_t *job, int cpx)
Link Here
|
| 898 |
if ( (job->cpu_freq_min == NO_VAL || job->cpu_freq_min==0) |
902 |
if ( (job->cpu_freq_min == NO_VAL || job->cpu_freq_min==0) |
| 899 |
&& (job->cpu_freq_max == NO_VAL || job->cpu_freq_max==0) |
903 |
&& (job->cpu_freq_max == NO_VAL || job->cpu_freq_max==0) |
| 900 |
&& (job->cpu_freq_gov == NO_VAL || job->cpu_freq_gov==0)) { |
904 |
&& (job->cpu_freq_gov == NO_VAL || job->cpu_freq_gov==0)) { |
| 901 |
return; /* No --cpu-freq */ |
905 |
/* If no --cpu-freq, use default governor from conf file. */ |
|
|
906 |
slurm_ctl_conf_t *conf = slurm_conf_lock(); |
| 907 |
job->cpu_freq_gov = conf->cpu_freq_def; |
| 908 |
slurm_conf_unlock(); |
| 909 |
if (job->cpu_freq_gov == NO_VAL) |
| 910 |
return; |
| 902 |
} |
911 |
} |
| 903 |
|
912 |
|
| 904 |
/* Get current state */ |
913 |
/* Get current state */ |
| 905 |
if (_cpu_freq_current_state(cpx) == SLURM_FAILURE) |
914 |
if (_cpu_freq_current_state(cpx) == SLURM_FAILURE) |
| 906 |
return; |
915 |
return; |
| 907 |
|
916 |
|
| 908 |
if (job->cpu_freq_min == NO_VAL && |
917 |
if (job->cpu_freq_min == NO_VAL && |
| 909 |
job->cpu_freq_max != NO_VAL && |
918 |
job->cpu_freq_max != NO_VAL && |
| 910 |
job->cpu_freq_gov == NO_VAL) { |
919 |
job->cpu_freq_gov == NO_VAL) { |
|
Lines 1008-1013
_cpu_freq_check_freq(const char* arg)
Link Here
|
| 1008 |
return 0; |
1017 |
return 0; |
| 1009 |
} |
1018 |
} |
| 1010 |
|
1019 |
|
|
|
1020 |
|
| 1011 |
/* |
1021 |
/* |
| 1012 |
* set cpu frequency if possible for each cpu of the job step |
1022 |
* set cpu frequency if possible for each cpu of the job step |
| 1013 |
*/ |
1023 |
*/ |
|
Lines 1020-1025
cpu_freq_set(stepd_step_rec_t *job)
Link Here
|
| 1020 |
|
1030 |
|
| 1021 |
if ((!cpu_freq_count) || (!cpufreq)) |
1031 |
if ((!cpu_freq_count) || (!cpufreq)) |
| 1022 |
return; |
1032 |
return; |
|
|
1033 |
|
| 1023 |
for (i = 0; i < cpu_freq_count; i++) { |
1034 |
for (i = 0; i < cpu_freq_count; i++) { |
| 1024 |
if (cpufreq[i].new_frequency == NO_VAL |
1035 |
if (cpufreq[i].new_frequency == NO_VAL |
| 1025 |
&& cpufreq[i].new_min_freq == NO_VAL |
1036 |
&& cpufreq[i].new_min_freq == NO_VAL |
|
Lines 1377-1390
cpu_freq_verify_def(const char *arg, uint32_t *freq)
Link Here
|
| 1377 |
*freq = cpufreq; |
1388 |
*freq = cpufreq; |
| 1378 |
return 0; |
1389 |
return 0; |
| 1379 |
} |
1390 |
} |
| 1380 |
cpufreq = _cpu_freq_check_freq(arg); |
1391 |
error("%s: CpuFreqDef=%s invalid", __func__, arg); |
| 1381 |
if (cpufreq == 0) { |
1392 |
return -1; |
| 1382 |
error("cpu_freq_verify_def: CpuFreqDef=%s invalid", arg); |
|
|
| 1383 |
return -1; |
| 1384 |
} |
| 1385 |
debug3("cpu_freq_verify_def: %s set", arg); |
| 1386 |
*freq = cpufreq; |
| 1387 |
return 0; |
| 1388 |
} |
1393 |
} |
| 1389 |
|
1394 |
|
| 1390 |
/* |
1395 |
/* |