blob: 98227285574c36373b39507e89f8602a7cffe358 [file] [log] [blame]
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 */