242
243
static bool _valid_node_list(char **node_list_pptr)
244
char *nodelist = NULL;
246
if (strchr(*node_list_pptr, '/') == NULL)
247
return true; /* not a file name */
249
247
/* If we are using Arbitrary and we specified the number of
250
248
procs to use then we need exactly this many since we are
251
249
saying, lay it out this way! Same for max and min nodes.
252
250
Other than that just read in as many in the hostfile */
253
if(opt.distribution == SLURM_DIST_ARBITRARY) {
255
nodelist = slurm_read_hostfile(*node_list_pptr,
257
else if(opt.max_nodes)
258
nodelist = slurm_read_hostfile(*node_list_pptr,
253
else if(opt.nodes_set) {
255
count = opt.max_nodes;
260
256
else if(opt.min_nodes)
261
nodelist = slurm_read_hostfile(*node_list_pptr,
264
nodelist = slurm_read_hostfile(*node_list_pptr, NO_VAL);
266
if (nodelist == NULL)
268
xfree(*node_list_pptr);
269
*node_list_pptr = xstrdup(nodelist);
276
* returns 1 is the argument appears to be a value, 0 otherwise
278
static int _isvalue(char *arg) {
279
if (isdigit(*arg)) { /* decimal values and 0x... hex values */
283
while (isxdigit(*arg)) { /* hex values not preceded by 0x */
286
if (*arg == ',' || *arg == '\0') { /* end of field or string */
290
return 0; /* not a value */
294
* First clear all of the bits in "*data" which are set in "clear_mask".
295
* Then set all of the bits in "*data" that are set in "set_mask".
297
static void clear_then_set(int *data, int clear_mask, int set_mask)
299
*data &= ~clear_mask;
303
static void _print_cpu_bind_help()
306
"CPU bind options:\n"
307
" --cpu_bind= Bind tasks to CPUs\n"
308
" q[uiet] quietly bind before task runs (default)\n"
309
" v[erbose] verbosely report binding before task runs\n"
310
" no[ne] don't bind tasks to CPUs (default)\n"
311
" rank bind by task rank\n"
312
" map_cpu:<list> specify a CPU ID binding for each task\n"
313
" where <list> is <cpuid1>,<cpuid2>,...<cpuidN>\n"
314
" mask_cpu:<list> specify a CPU ID binding mask for each task\n"
315
" where <list> is <mask1>,<mask2>,...<maskN>\n"
316
" sockets auto-generated masks bind to sockets\n"
317
" cores auto-generated masks bind to cores\n"
318
" threads auto-generated masks bind to threads\n"
319
" help show this help message\n");
323
* verify cpu_bind arguments
325
* we support different launch policy names
326
* we also allow a verbose setting to be specified
333
* --cpu_bind={MAP_CPU|MASK_CPU}:0,1,2,3,4
336
* returns -1 on error, 0 otherwise
338
static int _verify_cpu_bind(const char *arg, char **cpu_bind,
339
cpu_bind_type_t *flags)
343
CPU_BIND_NONE|CPU_BIND_RANK|CPU_BIND_MAP|CPU_BIND_MASK;
345
CPU_BIND_TO_SOCKETS|CPU_BIND_TO_CORES|CPU_BIND_TO_THREADS;
353
/* change all ',' delimiters not followed by a digit to ';' */
354
/* simplifies parsing tokens while keeping map/mask together */
355
while (p[0] != '\0') {
356
if ((p[0] == ',') && (!_isvalue(&(p[1]))))
362
while ((tok = strsep(&p, ";"))) {
363
if (strcasecmp(tok, "help") == 0) {
364
_print_cpu_bind_help();
366
} else if ((strcasecmp(tok, "q") == 0) ||
367
(strcasecmp(tok, "quiet") == 0)) {
368
*flags &= ~CPU_BIND_VERBOSE;
369
} else if ((strcasecmp(tok, "v") == 0) ||
370
(strcasecmp(tok, "verbose") == 0)) {
371
*flags |= CPU_BIND_VERBOSE;
372
} else if ((strcasecmp(tok, "no") == 0) ||
373
(strcasecmp(tok, "none") == 0)) {
374
clear_then_set((int *)flags, bind_bits, CPU_BIND_NONE);
376
} else if (strcasecmp(tok, "rank") == 0) {
377
clear_then_set((int *)flags, bind_bits, CPU_BIND_RANK);
379
} else if ((strncasecmp(tok, "map_cpu", 7) == 0) ||
380
(strncasecmp(tok, "mapcpu", 6) == 0)) {
382
list = strsep(&tok, ":=");
383
list = strsep(&tok, ":=");
384
clear_then_set((int *)flags, bind_bits, CPU_BIND_MAP);
387
*cpu_bind = xstrdup(list);
389
error("missing list for \"--cpu_bind=map_cpu:<list>\"");
393
} else if ((strncasecmp(tok, "mask_cpu", 8) == 0) ||
394
(strncasecmp(tok, "maskcpu", 7) == 0)) {
396
list = strsep(&tok, ":=");
397
list = strsep(&tok, ":=");
398
clear_then_set((int *)flags, bind_bits, CPU_BIND_MASK);
401
*cpu_bind = xstrdup(list);
403
error("missing list for \"--cpu_bind=mask_cpu:<list>\"");
407
} else if ((strcasecmp(tok, "socket") == 0) ||
408
(strcasecmp(tok, "sockets") == 0)) {
409
clear_then_set((int *)flags, bind_to_bits,
410
CPU_BIND_TO_SOCKETS);
411
} else if ((strcasecmp(tok, "core") == 0) ||
412
(strcasecmp(tok, "cores") == 0)) {
413
clear_then_set((int *)flags, bind_to_bits,
415
} else if ((strcasecmp(tok, "thread") == 0) ||
416
(strcasecmp(tok, "threads") == 0)) {
417
clear_then_set((int *)flags, bind_to_bits,
418
CPU_BIND_TO_THREADS);
420
error("unrecognized --cpu_bind argument \"%s\"", tok);
430
static void _print_mem_bind_help()
433
"Memory bind options:\n"
434
" --mem_bind= Bind memory to locality domains (ldom)\n"
435
" q[uiet] quietly bind before task runs (default)\n"
436
" v[erbose] verbosely report binding before task runs\n"
437
" no[ne] don't bind tasks to memory (default)\n"
438
" rank bind by task rank\n"
439
" local bind to memory local to processor\n"
440
" map_mem:<list> specify a memory binding for each task\n"
441
" where <list> is <cpuid1>,<cpuid2>,...<cpuidN>\n"
442
" mask_mem:<list> specify a memory binding mask for each tasks\n"
443
" where <list> is <mask1>,<mask2>,...<maskN>\n"
444
" help show this help message\n");
448
* verify mem_bind arguments
450
* we support different memory binding names
451
* we also allow a verbose setting to be specified
455
* --mem_bind={MAP_MEM|MASK_MEM}:0,1,2,3,4
457
* returns -1 on error, 0 otherwise
459
static int _verify_mem_bind(const char *arg, char **mem_bind,
460
mem_bind_type_t *flags)
463
int bind_bits = MEM_BIND_NONE|MEM_BIND_RANK|MEM_BIND_LOCAL|
464
MEM_BIND_MAP|MEM_BIND_MASK;
472
/* change all ',' delimiters not followed by a digit to ';' */
473
/* simplifies parsing tokens while keeping map/mask together */
474
while (p[0] != '\0') {
475
if ((p[0] == ',') && (!_isvalue(&(p[1]))))
481
while ((tok = strsep(&p, ";"))) {
482
if (strcasecmp(tok, "help") == 0) {
483
_print_mem_bind_help();
486
} else if ((strcasecmp(tok, "q") == 0) ||
487
(strcasecmp(tok, "quiet") == 0)) {
488
*flags &= ~MEM_BIND_VERBOSE;
489
} else if ((strcasecmp(tok, "v") == 0) ||
490
(strcasecmp(tok, "verbose") == 0)) {
491
*flags |= MEM_BIND_VERBOSE;
492
} else if ((strcasecmp(tok, "no") == 0) ||
493
(strcasecmp(tok, "none") == 0)) {
494
clear_then_set((int *)flags, bind_bits, MEM_BIND_NONE);
496
} else if (strcasecmp(tok, "rank") == 0) {
497
clear_then_set((int *)flags, bind_bits, MEM_BIND_RANK);
499
} else if (strcasecmp(tok, "local") == 0) {
500
clear_then_set((int *)flags, bind_bits, MEM_BIND_LOCAL);
502
} else if ((strncasecmp(tok, "map_mem", 7) == 0) ||
503
(strncasecmp(tok, "mapmem", 6) == 0)) {
505
list = strsep(&tok, ":=");
506
list = strsep(&tok, ":=");
507
clear_then_set((int *)flags, bind_bits, MEM_BIND_MAP);
510
*mem_bind = xstrdup(list);
512
error("missing list for \"--mem_bind=map_mem:<list>\"");
516
} else if ((strncasecmp(tok, "mask_mem", 8) == 0) ||
517
(strncasecmp(tok, "maskmem", 7) == 0)) {
519
list = strsep(&tok, ":=");
520
list = strsep(&tok, ":=");
521
clear_then_set((int *)flags, bind_bits, MEM_BIND_MASK);
524
*mem_bind = xstrdup(list);
526
error("missing list for \"--mem_bind=mask_mem:<list>\"");
531
error("unrecognized --mem_bind argument \"%s\"", tok);
257
count = opt.min_nodes;
260
return verify_node_list(node_list_pptr, opt.distribution, count);
761
488
{"SLURM_RAMDISK_IMAGE", OPT_STRING, &opt.ramdiskimage, NULL },
762
489
{"SLURM_IOLOAD_IMAGE", OPT_STRING, &opt.ramdiskimage, NULL },
763
490
{"SLURM_REMOTE_CWD", OPT_STRING, &opt.cwd, NULL },
491
{"SLURM_RESV_PORTS", OPT_RESV_PORTS, NULL, NULL },
764
492
{"SLURM_STDERRMODE", OPT_STRING, &opt.efname, NULL },
765
493
{"SLURM_STDINMODE", OPT_STRING, &opt.ifname, NULL },
766
494
{"SLURM_STDOUTMODE", OPT_STRING, &opt.ofname, NULL },
767
495
{"SLURM_THREADS", OPT_INT, &opt.max_threads, NULL },
768
496
{"SLURM_TIMELIMIT", OPT_STRING, &opt.time_limit_str,NULL },
769
497
{"SLURM_CHECKPOINT", OPT_STRING, &opt.ckpt_interval_str, NULL },
770
{"SLURM_CHECKPOINT_PATH",OPT_STRING, &opt.ckpt_path, NULL },
498
{"SLURM_CHECKPOINT_DIR",OPT_STRING, &opt.ckpt_dir, NULL },
499
{"SLURM_RESTART_DIR", OPT_STRING, &opt.restart_dir , NULL },
771
500
{"SLURM_WAIT", OPT_INT, &opt.max_wait, NULL },
772
501
{"SLURM_DISABLE_STATUS",OPT_INT, &opt.disable_status,NULL },
773
502
{"SLURM_MPI_TYPE", OPT_MPI, NULL, NULL },
774
{"SLURM_SRUN_COMM_IFHN",OPT_STRING, &opt.ctrl_comm_ifhn,NULL },
775
503
{"SLURM_SRUN_MULTI", OPT_MULTI, NULL, NULL },
776
504
{"SLURM_UNBUFFEREDIO", OPT_INT, &opt.unbuffered, NULL },
777
505
{"SLURM_NODELIST", OPT_STRING, &opt.alloc_nodelist,NULL },
954
698
{"slurmd-debug", required_argument, 0, 'd'},
955
699
{"chdir", required_argument, 0, 'D'},
956
700
{"error", required_argument, 0, 'e'},
701
{"preserve-env", no_argument, 0, 'E'},
702
{"preserve-slurm-env", no_argument, 0, 'E'},
957
703
{"geometry", required_argument, 0, 'g'},
958
704
{"hold", no_argument, 0, 'H'},
959
705
{"input", required_argument, 0, 'i'},
960
{"immediate", no_argument, 0, 'I'},
706
{"immediate", optional_argument, 0, 'I'},
961
707
{"join", no_argument, 0, 'j'},
962
708
{"job-name", required_argument, 0, 'J'},
963
709
{"no-kill", no_argument, 0, 'k'},
2254
2076
"Usage: srun [OPTIONS...] executable [args...]\n"
2256
2078
"Parallel run options:\n"
2257
" -n, --ntasks=ntasks number of tasks to run\n"
2258
" -N, --nodes=N number of nodes on which to run (N = min[-max])\n"
2079
" --begin=time defer job until HH:MM DD/MM/YY\n"
2259
2080
" -c, --cpus-per-task=ncpus number of cpus required per task\n"
2260
" --ntasks-per-node=n number of tasks to invoke on each node\n"
2261
" -i, --input=in location of stdin redirection\n"
2262
" -o, --output=out location of stdout redirection\n"
2081
" --checkpoint=time job step checkpoint interval\n"
2082
" --checkpoint-dir=dir directory to store job step checkpoint image \n"
2084
" --comment=name arbitrary comment\n"
2085
" --core=type change default corefile format type\n"
2086
" (type=\"list\" to list of valid formats)\n"
2087
" -d, --slurmd-debug=level slurmd debug level\n"
2088
" -D, --chdir=path change remote current working directory\n"
2263
2089
" -e, --error=err location of stderr redirection\n"
2264
" -r, --relative=n run job step relative to node n of allocation\n"
2265
" -p, --partition=partition partition requested\n"
2090
" --epilog=program run \"program\" after launching job step\n"
2091
" -E, --preserve-env env vars for node and task counts override\n"
2092
" command-line flags\n"
2093
" --get-user-env used by Moab. See srun man page.\n"
2266
2094
" -H, --hold submit job in held state\n"
2267
" -t, --time=minutes time limit\n"
2268
" -D, --chdir=path change remote current working directory\n"
2269
" -I, --immediate exit if resources are not immediately available\n"
2270
" -O, --overcommit overcommit resources\n"
2095
" -i, --input=in location of stdin redirection\n"
2096
" -I, --immediate[=secs] exit if resources not available in \"secs\"\n"
2097
" --jobid=id run under already allocated job\n"
2098
" -J, --job-name=jobname name of job\n"
2271
2099
" -k, --no-kill do not kill job on node failure\n"
2272
2100
" -K, --kill-on-bad-exit kill the job if any task terminates with a\n"
2273
2101
" non-zero exit code\n"
2274
" -s, --share share nodes with other jobs\n"
2275
2102
" -l, --label prepend task number to lines of stdout/err\n"
2276
" -u, --unbuffered do not line-buffer stdout/err\n"
2103
" -L, --licenses=names required license, comma separated\n"
2277
2104
" -m, --distribution=type distribution method for processes to nodes\n"
2278
2105
" (type = block|cyclic|arbitrary)\n"
2279
" -J, --job-name=jobname name of job\n"
2280
" --jobid=id run under already allocated job\n"
2106
" --mail-type=type notify on state change: BEGIN, END, FAIL or ALL\n"
2107
" --mail-user=user who to send email notification for job state\n"
2281
2109
" --mpi=type type of MPI being used\n"
2282
" -b, --batch submit as batch job for later execution\n"
2110
" --multi-prog if set the program name specified is the\n"
2111
" configuration specification for multiple programs\n"
2112
" -n, --ntasks=ntasks number of tasks to run\n"
2113
" --nice[=value] decrease secheduling priority by value\n"
2114
" --ntasks-per-node=n number of tasks to invoke on each node\n"
2115
" -N, --nodes=N number of nodes on which to run (N = min[-max])\n"
2116
" -o, --output=out location of stdout redirection\n"
2117
" -O, --overcommit overcommit resources\n"
2118
" -p, --partition=partition partition requested\n"
2119
" --prolog=program run \"program\" before launching job step\n"
2120
" --propagate[=rlimits] propagate all [or specific list of] rlimits\n"
2122
" --pty run task zero in pseudo terminal\n"
2124
" -P, --dependency=type:jobid defer job until condition on jobid is satisfied\n"
2125
" -q, --quit-on-interrupt quit on single Ctrl-C\n"
2126
" -Q, --quiet quiet mode (suppress informational messages)\n"
2127
" -r, --relative=n run job step relative to node n of allocation\n"
2128
" --restart-dir=dir directory of checkpoint image files to restart\n"
2130
" -s, --share share nodes with other jobs\n"
2131
" -t, --time=minutes time limit\n"
2132
" --task-epilog=program run \"program\" after launching task\n"
2133
" --task-prolog=program run \"program\" before launching task\n"
2283
2134
" -T, --threads=threads set srun launch fanout\n"
2135
" -u, --unbuffered do not line-buffer stdout/err\n"
2136
" -U, --account=name charge job to specified account\n"
2137
" -v, --verbose verbose mode (multiple -v's increase verbosity)\n"
2284
2138
" -W, --wait=sec seconds to wait after first task exits\n"
2285
2139
" before killing job\n"
2286
" -q, --quit-on-interrupt quit on single Ctrl-C\n"
2287
2140
" -X, --disable-status Disable Ctrl-C status feature\n"
2288
" -v, --verbose verbose mode (multiple -v's increase verbosity)\n"
2289
" -Q, --quiet quiet mode (suppress informational messages)\n"
2290
" -d, --slurmd-debug=level slurmd debug level\n"
2291
" --core=type change default corefile format type\n"
2292
" (type=\"list\" to list of valid formats)\n"
2293
" -P, --dependency=type:jobid defer job until condition on jobid is satisfied\n"
2294
" --nice[=value] decrease secheduling priority by value\n"
2295
" -U, --account=name charge job to specified account\n"
2296
" --comment=name arbitrary comment\n"
2297
" --propagate[=rlimits] propagate all [or specific list of] rlimits\n"
2298
" --mpi=type specifies version of MPI to use\n"
2299
" --prolog=program run \"program\" before launching job step\n"
2300
" --epilog=program run \"program\" after launching job step\n"
2301
" --task-prolog=program run \"program\" before launching task\n"
2302
" --task-epilog=program run \"program\" after launching task\n"
2303
" --begin=time defer job until HH:MM DD/MM/YY\n"
2304
" --mail-type=type notify on state change: BEGIN, END, FAIL or ALL\n"
2305
" --mail-user=user who to send email notification for job state changes\n"
2306
" --ctrl-comm-ifhn=addr interface hostname for PMI communications from srun\n"
2307
" --multi-prog if set the program name specified is the\n"
2308
" configuration specification for multiple programs\n"
2309
" --get-user-env used by Moab. See srun man page.\n"
2310
" -L, --licenses=names required license, comma separated\n"
2311
" --checkpoint=time job step checkpoint interval\n"
2312
" --checkpoint-path=dir path to store job step checkpoint image files\n"
2314
" --pty run task zero in pseudo terminal\n"
2317
2142
"Constraint options:\n"
2143
" -C, --constraint=list specify a list of constraints\n"
2144
" --contiguous demand a contiguous range of nodes\n"
2318
2145
" --mincpus=n minimum number of cpus per node\n"
2146
" --mincores=n minimum number of cores per cpu\n"
2319
2147
" --minsockets=n minimum number of sockets per node\n"
2320
" --mincores=n minimum number of cores per cpu\n"
2321
2148
" --minthreads=n minimum number of threads per core\n"
2322
2149
" --mem=MB minimum amount of real memory\n"
2150
" --reservation=name allocate resources from named reservation\n"
2323
2151
" --tmp=MB minimum amount of temporary disk\n"
2324
" --contiguous demand a contiguous range of nodes\n"
2325
" -C, --constraint=list specify a list of constraints\n"
2326
2152
" -w, --nodelist=hosts... request a specific list of hosts\n"
2327
2153
" -x, --exclude=hosts... exclude a specific list of hosts\n"
2328
2154
" -Z, --no-allocate don't allocate nodes (must supply -w)\n"
2333
2159
" or don't share CPUs for job steps\n"
2334
2160
" --mem-per-cpu=MB maximum amount of real memory per allocated\n"
2335
2161
" CPU required by the job.\n"
2336
" --mem >= --job-mem if --mem is specified.\n"
2162
" --mem >= --mem-per-cpu if --mem is specified.\n"
2163
" --resv-ports reserve communication ports\n"
2338
2165
"Affinity/Multi-core options: (when the task/affinity plugin is enabled)\n"
2339
" -B --extra-node-info=S[:C[:T]] Expands to:\n"
2340
" --sockets-per-node=S number of sockets per node to allocate\n"
2341
" --cores-per-socket=C number of cores per socket to allocate\n"
2342
" --threads-per-core=T number of threads per core to allocate\n"
2166
" -B --extra-node-info=S[:C[:T]] Expands to:\n"
2167
" --sockets-per-node=S number of sockets per node to allocate\n"
2168
" --cores-per-socket=C number of cores per socket to allocate\n"
2169
" --threads-per-core=T number of threads per core to allocate\n"
2343
2170
" each field can be 'min[-max]' or wildcard '*'\n"
2344
2171
" total cpus requested = (N x S x C x T)\n"
2346
2172
" --ntasks-per-socket=n number of tasks to invoke on each socket\n"
2347
2173
" --ntasks-per-core=n number of tasks to invoke on each core\n"
2349
2176
conf = slurm_conf_lock();
2350
2177
if (conf->task_plugin != NULL
2351
2178
&& strcasecmp(conf->task_plugin, "task/affinity") == 0) {
2180
" --cpu_bind= Bind tasks to CPUs\n"
2181
" (see \"--cpu_bind=help\" for options)\n"
2353
2182
" --hint= Bind tasks according to application hints\n"
2354
2183
" (see \"--hint=help\" for options)\n"
2355
" --cpu_bind= Bind tasks to CPUs\n"
2356
" (see \"--cpu_bind=help\" for options)\n"
2357
2184
" --mem_bind= Bind memory to locality domains (ldom)\n"
2358
2185
" (see \"--mem_bind=help\" for options)\n"
2361
2188
slurm_conf_unlock();
2363
2189
spank_print_options (stdout, 6, 30);
2367
2192
#ifdef HAVE_AIX /* AIX/Federation specific options */
2368
"AIX related options:\n"
2369
" --network=type communication protocol to be used\n"
2193
"AIX related options:\n"
2194
" --network=type communication protocol to be used\n"
2373
2198
#ifdef HAVE_BG /* Blue gene specific options */
2374
"Blue Gene related options:\n"
2375
" -g, --geometry=XxYxZ geometry constraints of the job\n"
2376
" -R, --no-rotate disable geometry rotation\n"
2377
" --reboot reboot block before starting job\n"
2378
" --conn-type=type constraint on type of connection, MESH or TORUS\n"
2379
" if not set, then tries to fit TORUS else MESH\n"
2199
"Blue Gene related options:\n"
2200
" -g, --geometry=XxYxZ geometry constraints of the job\n"
2201
" -R, --no-rotate disable geometry rotation\n"
2202
" --reboot reboot block before starting job\n"
2203
" --conn-type=type constraint on type of connection, MESH or TORUS\n"
2204
" if not set, then tries to fit TORUS else MESH\n"
2380
2205
#ifndef HAVE_BGL
2381
" If wanting to run in HTC mode (only for 1\n"
2382
" midplane and below). You can use HTC_S for\n"
2383
" SMP, HTC_D for Dual, HTC_V for\n"
2384
" virtual node mode, and HTC_L for Linux mode.\n"
2385
" --cnload-image=path path to compute node image for bluegene block. Default if not set\n"
2386
" --mloader-image=path path to mloader image for bluegene block. Default if not set\n"
2387
" --ioload-image=path path to ioload image for bluegene block. Default if not set\n"
2206
" If wanting to run in HTC mode (only for 1\n"
2207
" midplane and below). You can use HTC_S for\n"
2208
" SMP, HTC_D for Dual, HTC_V for\n"
2209
" virtual node mode, and HTC_L for Linux mode.\n"
2210
" --cnload-image=path path to compute node image for bluegene block. Default if not set\n"
2211
" --mloader-image=path path to mloader image for bluegene block. Default if not set\n"
2212
" --ioload-image=path path to ioload image for bluegene block. Default if not set\n"
2389
" --blrts-image=path path to blrts image for bluegene block. Default if not set\n"
2390
" --linux-image=path path to linux image for bluegene block. Default if not set\n"
2391
" --mloader-image=path path to mloader image for bluegene block. Default if not set\n"
2392
" --ramdisk-image=path path to ramdisk image for bluegene block. Default if not set\n"
2397
" --help show this help message\n"
2398
" --usage display brief usage message\n"
2399
" --print-request Display job's layout without scheduling it\n"
2402
" -V, --version output version information and exit\n"
2214
" --blrts-image=path path to blrts image for bluegene block. Default if not set\n"
2215
" --linux-image=path path to linux image for bluegene block. Default if not set\n"
2216
" --mloader-image=path path to mloader image for bluegene block. Default if not set\n"
2217
" --ramdisk-image=path path to ramdisk image for bluegene block. Default if not set\n"
2222
" --help show this help message\n"
2223
" --usage display brief usage message\n"
2224
" --print-request Display job's layout without scheduling it\n"
2227
" -V, --version output version information and exit\n"