[mpich2-commits] r5455 - in mpich2/trunk/src/pm/hydra: pm/pmiserv ui/mpiexec utils/string

balaji at mcs.anl.gov balaji at mcs.anl.gov
Wed Oct 14 06:35:40 CDT 2009


Author: balaji
Date: 2009-10-14 06:35:39 -0500 (Wed, 14 Oct 2009)
New Revision: 5455

Modified:
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c
   mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_proxy_utils.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/string/string.c
Log:
Fix a bug in multi-node launches that got introduced in r5446. Cleaned
up some redundant code along the way as well.

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c	2009-10-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle.c	2009-10-14 11:35:39 UTC (rev 5455)
@@ -314,9 +314,9 @@
             tmp[i++] = HYDU_int_to_str(block->num_blocks);
             tmp[i++] = HYDU_strdup(",");
             tmp[i++] = HYDU_int_to_str(block->block_size);
+            tmp[i++] = HYDU_strdup(")");
             if (block->next)
                 tmp[i++] = HYDU_strdup(",");
-            tmp[i++] = HYDU_strdup(")");
             HYDU_STRLIST_CONSOLIDATE(tmp, i, status);
         }
         tmp[i++] = HYDU_strdup(")");

Modified: mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_proxy_utils.c
===================================================================
--- mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_proxy_utils.c	2009-10-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_proxy_utils.c	2009-10-14 11:35:39 UTC (rev 5455)
@@ -545,12 +545,13 @@
     for (exec = HYD_PMCD_pmi_proxy_params.exec_list; exec; exec = exec->next)
         HYD_PMCD_pmi_proxy_params.local.process_count += exec->proc_count;
 
-    HYDU_MALLOC(pmi_ids, int *, HYD_PMCD_pmi_proxy_params.local.process_count * sizeof(int), status);
+    HYDU_MALLOC(pmi_ids, int *, HYD_PMCD_pmi_proxy_params.local.process_count * sizeof(int),
+                status);
     for (i = 0; i < HYD_PMCD_pmi_proxy_params.local.process_count; i++) {
-        pmi_ids[i] = HYDU_local_to_global_id(i,
-                                             HYD_PMCD_pmi_proxy_params.local.core_count,
-                                             HYD_PMCD_pmi_proxy_params.segment_list,
-                                             HYD_PMCD_pmi_proxy_params.system_global.global_core_count);
+        pmi_ids[i] =
+            HYDU_local_to_global_id(i, HYD_PMCD_pmi_proxy_params.local.core_count,
+                                    HYD_PMCD_pmi_proxy_params.segment_list,
+                                    HYD_PMCD_pmi_proxy_params.system_global.global_core_count);
     }
     
     HYDU_MALLOC(HYD_PMCD_pmi_proxy_params.downstream.out, int *,

Modified: mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c	2009-10-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.c	2009-10-14 11:35:39 UTC (rev 5455)
@@ -141,7 +141,7 @@
 
         if (HYD_handle.proxy_list == NULL) {
             /* The RMK didn't give us anything back; use localhost */
-            status = HYD_UII_mpx_init_proxy_list((char *) "localhost", 1);
+            status = HYD_UII_mpx_add_to_proxy_list((char *) "localhost", 1);
             HYDU_ERR_POP(status, "unable to initialize proxy\n");
         }
     }

Modified: mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h	2009-10-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/mpiexec.h	2009-10-14 11:35:39 UTC (rev 5455)
@@ -9,7 +9,7 @@
 
 #include "hydra.h"
 
-HYD_Status HYD_UII_mpx_init_proxy_list(char *hostname, int num_procs);
+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-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/ui/mpiexec/utils.c	2009-10-14 11:35:39 UTC (rev 5455)
@@ -150,26 +150,70 @@
     goto fn_exit;
 }
 
-HYD_Status HYD_UII_mpx_init_proxy_list(char *hostname, int num_procs)
+HYD_Status HYD_UII_mpx_add_to_proxy_list(char *hostname, int num_procs)
 {
+    static int pid = 0;
+    struct HYD_Proxy *proxy;
+    struct HYD_Proxy_segment *segment;
     HYD_Status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
 
-    status = HYDU_alloc_proxy(&HYD_handle.proxy_list);
-    HYDU_ERR_POP(status, "unable to allocate proxy\n");
+    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->hostname = HYDU_strdup(hostname);
 
-    status = HYDU_alloc_proxy_segment(&HYD_handle.proxy_list->segment_list);
-    HYDU_ERR_POP(status, "unable to allocate proxy segment\n");
+        status = HYDU_alloc_proxy_segment(&HYD_handle.proxy_list->segment_list);
+        HYDU_ERR_POP(status, "unable to allocate proxy segment\n");
 
-    HYD_handle.proxy_list->segment_list->start_pid = 0;
-    HYD_handle.proxy_list->segment_list->proc_count = num_procs;
+        HYD_handle.proxy_list->segment_list->start_pid = 0;
+        HYD_handle.proxy_list->segment_list->proc_count = num_procs;
 
-    HYD_handle.proxy_list->proxy_core_count += num_procs;
-    HYD_handle.global_core_count += num_procs;
+        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 && strcmp(proxy->hostname, hostname); 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);
+
+            status = HYDU_alloc_proxy_segment(&proxy->segment_list);
+            HYDU_ERR_POP(status, "unable to allocate proxy segment\n");
+
+            proxy->segment_list->start_pid = pid;
+            proxy->segment_list->proc_count = num_procs;
+        }
+        else { /* hostname matches */
+            for (segment = proxy->segment_list; segment->next; segment = segment->next);
+
+            /* If this segment is a continuation, just increment the
+             * size of the previous segment */
+            if (segment->start_pid + segment->proc_count == pid)
+                segment->proc_count += num_procs;
+            else {
+                status = HYDU_alloc_proxy_segment(&segment->next);
+                HYDU_ERR_POP(status, "unable to allocate proxy segment\n");
+
+                segment->next->start_pid = pid;
+                segment->next->proc_count = num_procs;
+            }
+        }
+
+        proxy->proxy_core_count += num_procs;
+        HYD_handle.global_core_count += num_procs;
+    }
+    pid += num_procs;
+
   fn_exit:
     HYDU_FUNC_EXIT();
     return status;
@@ -181,11 +225,8 @@
 
 static HYD_Status process_mfile_token(char *token, int newline)
 {
-    static int pid = 0;
     int num_procs;
     char *hostname, *procs;
-    struct HYD_Proxy *proxy;
-    struct HYD_Proxy_segment *proxy_segment;
     HYD_Status status = HYD_SUCCESS;
 
     if (newline) { /* The first entry gives the hostname and processes */
@@ -193,42 +234,8 @@
         procs = strtok(NULL, ":");
         num_procs = procs ? atoi(procs) : 1;
 
-        if (HYD_handle.proxy_list == NULL) {
-            status = HYD_UII_mpx_init_proxy_list(hostname, num_procs);
-            HYDU_ERR_POP(status, "unable to initialize proxy\n");
-        }
-        else {
-            for (proxy = HYD_handle.proxy_list;
-                 proxy->next && strcmp(proxy->hostname, hostname); 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;
-            }
-
-            for (proxy_segment = proxy->segment_list; proxy_segment->next;
-                 proxy_segment = proxy_segment->next);
-
-            /* If this segment is a continuation, just increment the
-             * size of the previous segment */
-            if (proxy_segment->start_pid + proxy_segment->proc_count == pid)
-                proxy_segment->proc_count += num_procs;
-            else {
-                status = HYDU_alloc_proxy_segment(&proxy_segment->next);
-                HYDU_ERR_POP(status, "unable to allocate proxy segment\n");
-
-                proxy_segment->next->start_pid = pid;
-                proxy_segment->next->proc_count = num_procs;
-            }
-
-            HYD_handle.proxy_list->proxy_core_count += num_procs;
-            HYD_handle.global_core_count += num_procs;
-        }
-
-        pid += num_procs;
+        status = HYD_UII_mpx_add_to_proxy_list(hostname, num_procs);
+        HYDU_ERR_POP(status, "unable to initialize proxy\n");
     }
     else { /* Not a new line */
         HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
@@ -260,8 +267,8 @@
         HYDU_ERR_POP(status, "error parsing hostfile\n");
     }
     else {
-        status = HYD_UII_mpx_init_proxy_list((char *) "localhost", 1);
-        HYDU_ERR_POP(status, "unable to initialize proxy\n");
+        status = HYD_UII_mpx_add_to_proxy_list((char *) "localhost", 1);
+        HYDU_ERR_POP(status, "unable to add proxy\n");
     }
 
     (*argv)++;

Modified: mpich2/trunk/src/pm/hydra/utils/string/string.c
===================================================================
--- mpich2/trunk/src/pm/hydra/utils/string/string.c	2009-10-14 11:35:35 UTC (rev 5454)
+++ mpich2/trunk/src/pm/hydra/utils/string/string.c	2009-10-14 11:35:39 UTC (rev 5455)
@@ -192,9 +192,9 @@
 
 char **HYDU_str_to_strlist(char *str)
 {
-    int argc = 0;
+    int argc = 0, i;
     char **strlist = NULL;
-    char *p, *r;
+    char *p;
     HYD_Status status = HYD_SUCCESS;
 
     HYDU_FUNC_ENTER();
@@ -208,19 +208,23 @@
     while (*p) {
         while (isspace(*p))
             p++;
+
         if (argc >= HYD_NUM_TMP_STRINGS)
             HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "too many arguments in line\n");
 
-        /* Make a copy and NULL terminate it */
-        strlist[argc] = HYDU_strdup(p);
-        r = strlist[argc];
-        while (*r && !isspace(*r))
-            r++;
-        *r = 0;
+        HYDU_MALLOC(strlist[argc], char *, HYD_TMP_STRLEN, status);
 
-        while (*p && !isspace(*p))
+        /* Copy till you hit a space */
+        i = 0;
+        while (*p && !isspace(*p)) {
+            strlist[argc][i] = *p;
+            i++;
             p++;
-        argc++;
+        }
+        if (i) {
+            strlist[argc][i] = 0;
+            argc++;
+        }
     }
     strlist[argc] = NULL;
 



More information about the mpich2-commits mailing list