diff --git a/README b/README index 8b10c42..9e52eb8 100644 --- a/README +++ b/README @@ -136,6 +136,18 @@ system contains rules that depend on proper behavior of tools like "cp force make to treat them properly. See the manual for details. +SLURM +----- + +This patch will use SLURM to launch tasks across a job's current resource +allocation. Depending upon the size of modules to be compiled, this may +or may not improve performance. If most modules are thousands of lines +long, the use of additional resources should more than compensate for the +overhead of SLURM's task launch. Use with make's "-j" option within an +existing SLURM allocation. Outside of a SLURM allocation, make's behavior +will be unchanged. Designed for GNU make-4.0. + + Ports ----- diff --git a/job.c b/job.c index febfac0..eea50f1 100644 --- a/job.c +++ b/job.c @@ -2269,6 +2269,23 @@ void child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, char **argv, char **envp) { + char** argx=NULL; + /* PARALLEL JOB LAUNCH VIA SLURM */ + if (getenv("SLURM_JOB_ID")) { + unsigned int i, argc=4; + for (i=0; argv[i] != NULL ; i++) argc++; + argx = (char**) malloc( sizeof(char*)*( argc )); + argx[0] = "srun"; + argx[1] = "-N1"; + argx[2] = "-n1"; + for (i=0; argv[i] != NULL ; i++) { + argx[i+3] = argv[i]; + } + argx[ argc -1 ] = NULL; + argv = argx; + } +/* END OF SLURM PATCH */ + /* For any redirected FD, dup2() it to the standard FD then close it. */ if (stdin_fd != FD_STDIN) { @@ -2288,6 +2305,8 @@ child_execute_job (int stdin_fd, int stdout_fd, int stderr_fd, /* Run the command. */ exec_command (argv, envp); + + free(argx); } #endif /* !AMIGA && !__MSDOS__ && !VMS */ #endif /* !WINDOWS32 */