From ced0cdca7fb1c82eaeee4aa475bc903a187704be Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Thu, 9 Oct 2008 23:45:05 +0000 Subject: [PATCH] Process TaskPluginParam to set default task binding within srun --- src/common/proc_args.c | 9 ++- src/plugins/task/affinity/task_affinity.c | 2 + src/salloc/opt.c | 4 +- src/sbatch/opt.c | 4 +- src/srun/opt.c | 77 ++++++++++++++++++++--- 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/src/common/proc_args.c b/src/common/proc_args.c index cede1aed102..e0af31276b3 100644 --- a/src/common/proc_args.c +++ b/src/common/proc_args.c @@ -408,10 +408,12 @@ bool verify_socket_core_thread_count(const char *arg, for (j=0;j<3;j++) { for (i=0;i<47;i++) { - if (*cur_ptr == '\0' || *cur_ptr ==':') break; + if (*cur_ptr == '\0' || *cur_ptr ==':') + break; buf[j][i] = *cur_ptr++; } - if (*cur_ptr == '\0') break; + if (*cur_ptr == '\0') + break; xassert(*cur_ptr == ':'); buf[j][i] = '\0'; cur_ptr++; @@ -499,7 +501,8 @@ bool verify_hint(const char *arg, int *min_sockets, int *max_sockets, *max_threads = 1; *cpu_bind_type |= CPU_BIND_TO_THREADS; } else { - error("unrecognized --hint argument \"%s\", see --hint=help", tok); + error("unrecognized --hint argument \"%s\", " + "see --hint=help", tok); xfree(buf); return 1; } diff --git a/src/plugins/task/affinity/task_affinity.c b/src/plugins/task/affinity/task_affinity.c index 37526fe6a7c..a21110e8aa1 100644 --- a/src/plugins/task/affinity/task_affinity.c +++ b/src/plugins/task/affinity/task_affinity.c @@ -136,7 +136,9 @@ static void _update_bind_type(launch_tasks_request_msg_t *req) if (conf->task_plugin_param & CPU_BIND_VERBOSE) { req->cpu_bind_type |= CPU_BIND_VERBOSE; + set_bind = true; } + if (set_bind) { char bind_str[128]; slurm_sprint_cpu_bind_type(bind_str, req->cpu_bind_type); diff --git a/src/salloc/opt.c b/src/salloc/opt.c index 16799bd3aa6..85bcd1e4942 100644 --- a/src/salloc/opt.c +++ b/src/salloc/opt.c @@ -62,12 +62,12 @@ #include "src/common/log.h" #include "src/common/parse_time.h" #include "src/common/proc_args.h" +#include "src/common/read_config.h" /* contains getnodename() */ #include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_rlimits_info.h" #include "src/common/uid.h" #include "src/common/xmalloc.h" #include "src/common/xstring.h" -#include "src/common/slurm_rlimits_info.h" -#include "src/common/read_config.h" /* contains getnodename() */ #include "src/salloc/salloc.h" #include "src/salloc/opt.h" diff --git a/src/sbatch/opt.c b/src/sbatch/opt.c index 40cca296d81..edbb5f4a1bd 100644 --- a/src/sbatch/opt.c +++ b/src/sbatch/opt.c @@ -62,12 +62,12 @@ #include "src/common/log.h" #include "src/common/parse_time.h" #include "src/common/proc_args.h" +#include "src/common/read_config.h" /* contains getnodename() */ #include "src/common/slurm_protocol_api.h" +#include "src/common/slurm_rlimits_info.h" #include "src/common/uid.h" #include "src/common/xmalloc.h" #include "src/common/xstring.h" -#include "src/common/slurm_rlimits_info.h" -#include "src/common/read_config.h" /* contains getnodename() */ #include "src/sbatch/opt.h" diff --git a/src/srun/opt.c b/src/srun/opt.c index cfb94b654ec..6a77665ee8b 100644 --- a/src/srun/opt.c +++ b/src/srun/opt.c @@ -71,22 +71,23 @@ #include "src/common/list.h" #include "src/common/log.h" +#include "src/common/mpi.h" +#include "src/common/optz.h" #include "src/common/parse_time.h" +#include "src/common/plugstack.h" #include "src/common/proc_args.h" #include "src/common/slurm_protocol_api.h" #include "src/common/slurm_protocol_interface.h" +#include "src/common/slurm_rlimits_info.h" #include "src/common/uid.h" #include "src/common/xmalloc.h" #include "src/common/xstring.h" -#include "src/common/slurm_rlimits_info.h" -#include "src/common/plugstack.h" -#include "src/common/optz.h" + #include "src/api/pmi_server.h" #include "src/srun/multi_prog.h" #include "src/srun/opt.h" #include "src/srun/debugger.h" -#include "src/common/mpi.h" /* generic OPT_ definitions -- mainly for use with env vars */ #define OPT_NONE 0x00 @@ -200,7 +201,6 @@ static bool _opt_verify(void); static void _process_env_var(env_vars_t *e, const char *val); static bool _under_parallel_debugger(void); - static void _usage(void); static bool _valid_node_list(char **node_list_pptr); static int _verify_cpu_bind(const char *arg, char **cpu_bind, @@ -340,11 +340,41 @@ static int _verify_cpu_bind(const char *arg, char **cpu_bind, CPU_BIND_NONE|CPU_BIND_RANK|CPU_BIND_MAP|CPU_BIND_MASK; int bind_to_bits = CPU_BIND_TO_SOCKETS|CPU_BIND_TO_CORES|CPU_BIND_TO_THREADS; + uint16_t task_plugin_param = slurm_get_task_plugin_param(); if (arg == NULL) { + if ((*flags != 0) || /* already set values */ + (task_plugin_param == 0)) /* no system defaults */ + return 0; + + /* set system defaults */ + xfree(*cpu_bind); + if (task_plugin_param & CPU_BIND_NONE) { + *flags = CPU_BIND_NONE; + } else if (task_plugin_param & CPU_BIND_TO_SOCKETS) { + *flags = CPU_BIND_TO_SOCKETS; + *cpu_bind = xstrdup("sockets"); + } else if (task_plugin_param & CPU_BIND_TO_CORES) { + *flags = CPU_BIND_TO_CORES; + *cpu_bind = xstrdup("cores"); + } else if (task_plugin_param & CPU_BIND_TO_THREADS) { + *flags |= CPU_BIND_TO_THREADS; + *cpu_bind = xstrdup("threads"); + } + if (task_plugin_param & CPU_BIND_VERBOSE) { + *flags |= CPU_BIND_VERBOSE; + if (*cpu_bind) + xstrcat(*cpu_bind, ",verbose"); + else + *cpu_bind = xstrdup("verbose"); + } return 0; } + /* Start with system default verbose flag (if set) */ + if (task_plugin_param & CPU_BIND_VERBOSE) + *flags |= CPU_BIND_VERBOSE; + buf = xstrdup(arg); p = buf; /* change all ',' delimiters not followed by a digit to ';' */ @@ -399,28 +429,52 @@ static int _verify_cpu_bind(const char *arg, char **cpu_bind, } else { error("missing list for \"--cpu_bind=mask_cpu:<list>\""); xfree(buf); - return 1; + return -1; } } else if ((strcasecmp(tok, "socket") == 0) || (strcasecmp(tok, "sockets") == 0)) { + if (task_plugin_param & + (CPU_BIND_NONE | CPU_BIND_TO_CORES | + CPU_BIND_TO_THREADS)) { + error("--cpu_bind=sockets incompatable with " + "TaskPluginParam configuration " + "parameter"); + return -1; + } clear_then_set((int *)flags, bind_to_bits, CPU_BIND_TO_SOCKETS); } else if ((strcasecmp(tok, "core") == 0) || (strcasecmp(tok, "cores") == 0)) { + if (task_plugin_param & + (CPU_BIND_NONE | CPU_BIND_TO_SOCKETS | + CPU_BIND_TO_THREADS)) { + error("--cpu_bind=cores incompatable with " + "TaskPluginParam configuration " + "parameter"); + return -1; + } clear_then_set((int *)flags, bind_to_bits, CPU_BIND_TO_CORES); } else if ((strcasecmp(tok, "thread") == 0) || (strcasecmp(tok, "threads") == 0)) { + if (task_plugin_param & + (CPU_BIND_NONE | CPU_BIND_TO_SOCKETS | + CPU_BIND_TO_CORES)) { + error("--cpu_bind=threads incompatable with " + "TaskPluginParam configuration " + "parameter"); + return -1; + } clear_then_set((int *)flags, bind_to_bits, CPU_BIND_TO_THREADS); } else { error("unrecognized --cpu_bind argument \"%s\"", tok); xfree(buf); - return 1; + return -1; } } - xfree(buf); + return 0; } @@ -1517,7 +1571,8 @@ static void set_options(const int argc, char **argv) opt.reboot = true; break; case LONG_OPT_GET_USER_ENV: - error("--get-user-env is no longer supported in srun, use sbatch"); + error("--get-user-env is no longer supported in srun, " + "use sbatch"); break; case LONG_OPT_PTY: #ifdef HAVE_PTY_H @@ -2018,6 +2073,10 @@ static bool _opt_verify(void) xfree(sched_name); } + if (_verify_cpu_bind(NULL, &opt.cpu_bind, + &opt.cpu_bind_type)) + exit(1); + return verified; } -- GitLab