[mpich2-commits] r5485 - in mpich2/trunk/src/pm/hydra: include rmk/pbs ui/mpiexec utils/others

balaji at mcs.anl.gov balaji at mcs.anl.gov
Mon Oct 19 14:24:18 CDT 2009


Author: balaji
Date: 2009-10-19 14:24:18 -0500 (Mon, 19 Oct 2009)
New Revision: 5485

Modified:
   mpich2/trunk/src/pm/hydra/include/hydra_utils.h
   mpich2/trunk/src/pm/hydra/rmk/pbs/rmk_pbs_query_node_list.c
   mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c
   mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h
   mpich2/trunk/src/pm/hydra/ui/mpiexec/utils.c
   mpich2/trunk/src/pm/hydra/utils/others/others.c
Log:
The hostfile parsing code was not common between the UI and the RMK
which caused the RMK to be left behind in the previous cleanup.

Modified: mpich2/trunk/src/pm/hydra/include/hydra_utils.h
===================================================================
--- mpich2/trunk/src/pm/hydra/include/hydra_utils.h	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/include/hydra_utils.h	2009-10-19 19:24:18 UTC (rev 5485)
@@ -178,6 +178,8 @@
                                     struct HYD_proxy **proxy_list);
 int HYDU_local_to_global_id(int local_id, int start_pid, int core_count,
                             int global_core_count);
+HYD_status HYDU_add_to_proxy_list(char *hostname, int num_procs,
+                                  struct HYD_proxy **proxy_list);
 
 /* signals */
 #ifdef NEEDS_POSIX_FOR_SIGACTION

Modified: mpich2/trunk/src/pm/hydra/rmk/pbs/rmk_pbs_query_node_list.c
===================================================================
--- mpich2/trunk/src/pm/hydra/rmk/pbs/rmk_pbs_query_node_list.c	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/rmk/pbs/rmk_pbs_query_node_list.c	2009-10-19 19:24:18 UTC (rev 5485)
@@ -8,62 +8,53 @@
 #include "rmki.h"
 #include "rmk_pbs.h"
 
-HYD_status HYD_rmkd_pbs_query_node_list(int *num_nodes, struct HYD_proxy **proxy_list)
+static int total_num_procs;
+
+static HYD_status process_mfile_token(char *token, int newline)
 {
-    char *host_file, *hostname, line[HYD_TMP_STRLEN], **arg_list;
     int num_procs;
-    FILE *fp;
+    char *hostname, *procs;
     HYD_status status = HYD_SUCCESS;
 
-    HYDU_FUNC_ENTER();
+    if (newline) {      /* The first entry gives the hostname and processes */
+        hostname = strtok(token, ":");
+        procs = strtok(NULL, ":");
+        num_procs = procs ? atoi(procs) : 1;
 
-    host_file = getenv("PBS_NODEFILE");
+        status = HYDU_add_to_proxy_list(hostname, num_procs, &HYD_handle.proxy_list);
+        HYDU_ERR_POP(status, "unable to initialize proxy\n");
 
-    if (host_file == NULL || host_file == NULL) {
-        *proxy_list = NULL;
+        total_num_procs += num_procs;
     }
-    else {
-        fp = fopen(host_file, "r");
-        if (!fp)
-            HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
-                                 "unable to open host file: %s\n", host_file);
+    else {      /* Not a new line */
+        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
+                             "token %s not supported at this time\n", token);
+    }
 
-        *num_nodes = 0;
-        while (fgets(line, HYD_TMP_STRLEN, fp)) {
-            char *linep = NULL;
+fn_exit:
+    return status;
 
-            linep = line;
-            strtok(linep, "#");
+fn_fail:
+    goto fn_exit;
+}
 
-            while (isspace(*linep))
-                linep++;
+HYD_status HYD_rmkd_pbs_query_node_list(int *num_nodes, struct HYD_proxy **proxy_list)
+{
+    char *hostfile;
+    HYD_status status = HYD_SUCCESS;
 
-            /* Ignore blank lines & comments */
-            if ((*linep == '#') || (*linep == '\0'))
-                continue;
+    HYDU_FUNC_ENTER();
 
-            /* break up the arguments in the line */
-            arg_list = HYDU_str_to_strlist(linep);
-            if (!arg_list)
-                HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR,
-                                    "Unable to convert host file entry to strlist\n");
-
-            hostname = arg_list[0];
-            num_procs = 1;
-
-            /* Try to find an existing proxy with this name and
-             * add this segment in. If there is no existing proxy
-             * with this name, we create a new one. */
-            status = HYDU_merge_proxy_segment(hostname, *num_nodes, num_procs, proxy_list);
-            HYDU_ERR_POP(status, "merge proxy segment failed\n");
-
-            *num_nodes += num_procs;
-
-            HYDU_FREE(arg_list);
-        }
-
-        fclose(fp);
+    hostfile = getenv("PBS_NODEFILE");
+    if (hostfile == NULL) {
+        *proxy_list = NULL;
     }
+    else {
+        total_num_procs = 0;
+        status = HYDU_parse_hostfile(hostfile, process_mfile_token);
+        HYDU_ERR_POP(status, "error parsing hostfile\n");
+        *num_nodes = total_num_procs;
+    }
 
   fn_exit:
     HYDU_FUNC_EXIT();

Modified: mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c	2009-10-19 19:24:18 UTC (rev 5485)
@@ -141,9 +141,14 @@
 
         if (HYD_handle.proxy_list == NULL) {
             /* The RMK didn't give us anything back; use localhost */
-            status = HYD_uii_mpx_add_to_proxy_list((char *) "localhost", 1);
+            status = HYDU_add_to_proxy_list((char *) "localhost", 1, &HYD_handle.proxy_list);
             HYDU_ERR_POP(status, "unable to initialize proxy\n");
+            HYD_handle.global_core_count += 1;
         }
+        else {
+            /* The RMK returned a node list */
+            HYD_handle.global_core_count += num_nodes;
+        }
     }
 
     /* If the number of processes is not given, we allocate all the
@@ -154,6 +159,10 @@
                 exec_info->process_count = 1;
             else
                 exec_info->process_count = num_nodes;
+
+            /* If we didn't get anything from the user, take whatever
+             * the RMK gave */
+            HYD_handle.global_process_count += exec_info->process_count;
         }
     }
 
@@ -190,23 +199,22 @@
 
     if (HYD_handle.print_rank_map) {
         FORALL_ACTIVE_PROXIES(proxy, HYD_handle.proxy_list) {
-            HYDU_dump(stdout, "[%s] ", proxy->hostname);
+            HYDU_dump_noprefix(stdout, "(%s:", proxy->hostname);
 
             process_id = 0;
             for (exec = proxy->exec_list; exec; exec = exec->next) {
                 for (i = 0; i < exec->proc_count; i++) {
-                    HYDU_dump(stdout, "%d",
-                              HYDU_local_to_global_id(process_id++,
-                                                      proxy->start_pid,
-                                                      proxy->proxy_core_count,
-                                                      HYD_handle.global_core_count));
-                    if (i < exec->proc_count - 1)
-                        HYDU_dump(stdout, ",");
+                    HYDU_dump_noprefix(stdout, "%d",
+                                       HYDU_local_to_global_id(process_id++,
+                                                               proxy->start_pid,
+                                                               proxy->proxy_core_count,
+                                                               HYD_handle.global_core_count));
+                    if (i < exec->proc_count - 1 || exec->next)
+                        HYDU_dump_noprefix(stdout, ",");
                 }
             }
-            HYDU_dump(stdout, "\n");
+            HYDU_dump_noprefix(stdout, ")\n");
         }
-        HYDU_dump(stdout, "\n");
     }
 
     FORALL_ACTIVE_PROXIES(proxy, HYD_handle.proxy_list)

Modified: mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h	2009-10-19 19:24:18 UTC (rev 5485)
@@ -9,7 +9,6 @@
 
 #include "hydra.h"
 
-HYD_status HYD_uii_mpx_add_to_proxy_list(char *hostname, int num_procs);
 HYD_status HYD_uii_mpx_get_parameters(char **t_argv);
 HYD_status HYD_uii_mpx_stdout_cb(int fd, HYD_event_t events, void *userp);
 HYD_status HYD_uii_mpx_stderr_cb(int fd, HYD_event_t events, void *userp);

Modified: mpich2/trunk/src/pm/hydra/ui/mpiexec/utils.c
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpiexec/utils.c	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/utils.c	2009-10-19 19:24:18 UTC (rev 5485)
@@ -150,53 +150,6 @@
     goto fn_exit;
 }
 
-HYD_status HYD_uii_mpx_add_to_proxy_list(char *hostname, int num_procs)
-{
-    static int pid = 0;
-    struct HYD_proxy *proxy;
-    HYD_status status = HYD_SUCCESS;
-
-    HYDU_FUNC_ENTER();
-
-    if (HYD_handle.proxy_list == NULL) {
-        status = HYDU_alloc_proxy(&HYD_handle.proxy_list);
-        HYDU_ERR_POP(status, "unable to allocate proxy\n");
-
-        HYD_handle.proxy_list->hostname = HYDU_strdup(hostname);
-
-        HYD_handle.proxy_list->start_pid = 0;
-        HYD_handle.proxy_list->proxy_core_count = num_procs;
-        HYD_handle.global_core_count += num_procs;
-    }
-    else {
-        for (proxy = HYD_handle.proxy_list; proxy->next; proxy = proxy->next);
-
-        if (strcmp(proxy->hostname, hostname)) {
-            /* If the hostname does not match, create a new proxy */
-            status = HYDU_alloc_proxy(&proxy->next);
-            HYDU_ERR_POP(status, "unable to allocate proxy\n");
-
-            proxy = proxy->next;
-
-            proxy->hostname = HYDU_strdup(hostname);
-
-            proxy->start_pid = pid;
-        }
-
-        proxy->proxy_core_count += num_procs;
-        HYD_handle.global_core_count += num_procs;
-    }
-    pid += num_procs;
-
-  fn_exit:
-    HYDU_FUNC_EXIT();
-    return status;
-
-  fn_fail:
-    goto fn_exit;
-}
-
-
 static HYD_status process_mfile_token(char *token, int newline)
 {
     int num_procs;
@@ -208,8 +161,9 @@
         procs = strtok(NULL, ":");
         num_procs = procs ? atoi(procs) : 1;
 
-        status = HYD_uii_mpx_add_to_proxy_list(hostname, num_procs);
+        status = HYDU_add_to_proxy_list(hostname, num_procs, &HYD_handle.proxy_list);
         HYDU_ERR_POP(status, "unable to initialize proxy\n");
+        HYD_handle.global_core_count += num_procs;
     }
     else {      /* Not a new line */
         HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
@@ -241,8 +195,9 @@
         HYDU_ERR_POP(status, "error parsing hostfile\n");
     }
     else {
-        status = HYD_uii_mpx_add_to_proxy_list((char *) "localhost", 1);
+        status = HYDU_add_to_proxy_list((char *) "localhost", 1, &HYD_handle.proxy_list);
         HYDU_ERR_POP(status, "unable to add proxy\n");
+        HYD_handle.global_core_count += 1;
     }
 
     (*argv)++;

Modified: mpich2/trunk/src/pm/hydra/utils/others/others.c
===================================================================
--- mpich2/trunk/src/pm/hydra/utils/others/others.c	2009-10-19 08:05:04 UTC (rev 5484)
+++ mpich2/trunk/src/pm/hydra/utils/others/others.c	2009-10-19 19:24:18 UTC (rev 5485)
@@ -46,3 +46,48 @@
 {
     return ((local_id / core_count) * global_core_count) + (local_id % core_count) + start_pid;
 }
+
+HYD_status HYDU_add_to_proxy_list(char *hostname, int num_procs,
+                                  struct HYD_proxy **proxy_list)
+{
+    static int pid = 0;
+    struct HYD_proxy *proxy;
+    HYD_status status = HYD_SUCCESS;
+
+    HYDU_FUNC_ENTER();
+
+    if (*proxy_list == NULL) {
+        status = HYDU_alloc_proxy(proxy_list);
+        HYDU_ERR_POP(status, "unable to allocate proxy\n");
+
+        (*proxy_list)->hostname = HYDU_strdup(hostname);
+
+        (*proxy_list)->start_pid = 0;
+        (*proxy_list)->proxy_core_count = num_procs;
+    }
+    else {
+        for (proxy = *proxy_list; proxy->next; proxy = proxy->next);
+
+        if (strcmp(proxy->hostname, hostname)) {
+            /* If the hostname does not match, create a new proxy */
+            status = HYDU_alloc_proxy(&proxy->next);
+            HYDU_ERR_POP(status, "unable to allocate proxy\n");
+
+            proxy = proxy->next;
+
+            proxy->hostname = HYDU_strdup(hostname);
+
+            proxy->start_pid = pid;
+        }
+
+        proxy->proxy_core_count += num_procs;
+    }
+    pid += num_procs;
+
+  fn_exit:
+    HYDU_FUNC_EXIT();
+    return status;
+
+  fn_fail:
+    goto fn_exit;
+}



More information about the mpich2-commits mailing list