Fixed a bug in passing argv for machine-specific initialization procedures.
authorChao Mei <chaomei2@illinois.edu>
Tue, 7 Jun 2011 16:54:59 +0000 (11:54 -0500)
committerChao Mei <chaomei2@illinois.edu>
Tue, 7 Jun 2011 17:01:19 +0000 (12:01 -0500)
This bug is exposed on MPI layer on "respect" which has MPI 1.2 version
installed. But on newer machines which has newer MPI version, say 2.1, then
this bug does not show up. So I think this bug is really a compatibility
issue with older MPI version.

src/arch/bluegenep/machine.c
src/arch/lapi/machine.c
src/arch/mpi/machine.c
src/arch/util/machine-common.c

index 60b9f03a8cbb3268d4bf4bcf6f1ab541f806ecb5..310518e73a34fc44d9e9d705e3f4f53a1ed3c06c 100644 (file)
@@ -283,7 +283,7 @@ DCMF_Request_t * first_pkt_recv_done (void              * clientdata,
 /* ### End of Communication-Op Related Functions ### */
 
 /* ### Beginning of Machine-startup Related Functions ### */
-static void MachineInitForDCMF(int argc, char **argv, int *numNodes, int *myNodeID);
+static void MachineInitForDCMF(int *argc, char ***argv, int *numNodes, int *myNodeID);
 #define MachineSpecificInit MachineInitForDCMF
 
 static void MachinePreCommonInitForDCMF(int everReturn);
@@ -720,7 +720,7 @@ static void MachineExitForDCMF() {
  *  Obtain the number of nodes, my node id, and consuming machine layer
  *  specific arguments
  */
-static void MachineInitForDCMF(int argc, char **argv, int *numNodes, int *myNodeID) {
+static void MachineInitForDCMF(int *argc, char ***argv, int *numNodes, int *myNodeID) {
 
     DCMF_Messager_initialize();
 
@@ -842,7 +842,7 @@ static void MachineInitForDCMF(int argc, char **argv, int *numNodes, int *myNode
     }
 
     /* checksum flag */
-    if (CmiGetArgFlag(argv,"+checksum")) {
+    if (CmiGetArgFlag(*argv,"+checksum")) {
 #if CMK_ERROR_CHECKING
         checksum_flag = 1;
         if (*myNodeID == 0) CmiPrintf("Charm++: CheckSum checking enabled! \n");
index ee2f8baf0daa9551db42e9874241950834e7d9e2..f42a115b30577fe2ae79146ca70c42d46f87e688 100755 (executable)
@@ -326,7 +326,7 @@ static CmiCommHandle MachineSendFuncForLAPI(int destNode, int size, char *msg, i
 #define CmiMachineSpecificSendFunc MachineSendFuncForLAPI
 
 /* ### Beginning of Machine-startup Related Functions ### */
-static void MachineInitForLAPI(int argc, char **argv, int *numNodes, int *myNodeID);
+static void MachineInitForLAPI(int *argc, char ***argv, int *numNodes, int *myNodeID);
 #define MachineSpecificInit MachineInitForLAPI
 
 static void MachinePreCommonInitForLAPI(int everReturn);
@@ -831,9 +831,10 @@ void MachineExitForLAPI(void) {
  *  Obtain the number of nodes, my node id, and consuming machine layer
  *  specific arguments
  */
-static void MachineInitForLAPI(int argc, char **argv, int *numNodes, int *myNodeID) {
+static void MachineInitForLAPI(int *argc, char ***argv, int *numNodes, int *myNodeID) {
 
     lapi_info_t info;
+    char **largv = *argv;
 
     memset(&info,0,sizeof(info));
 
@@ -856,8 +857,8 @@ static void MachineInitForLAPI(int argc, char **argv, int *numNodes, int *myNode
 
     /* Make polling as the default mode as real apps have better perf */
     CsvAccess(lapiInterruptMode) = 0;
-    if (CmiGetArgFlag(argv,"+poll")) CsvAccess(lapiInterruptMode) = 0;
-    if (CmiGetArgFlag(argv,"+nopoll")) CsvAccess(lapiInterruptMode) = 1;
+    if (CmiGetArgFlag(largv,"+poll")) CsvAccess(lapiInterruptMode) = 0;
+    if (CmiGetArgFlag(largv,"+nopoll")) CsvAccess(lapiInterruptMode) = 1;
 
     check_lapi(LAPI_Senv,(lapiContext, ERROR_CHK, lapiDebugMode));
     check_lapi(LAPI_Senv,(lapiContext, INTERRUPT_SET, CsvAccess(lapiInterruptMode)));
@@ -874,9 +875,9 @@ static void MachineInitForLAPI(int argc, char **argv, int *numNodes, int *myNode
      */
     check_lapi(LAPI_Addr_set,(lapiContext,(void *)PumpMsgsBegin,lapiHeaderHandler));
 
-    if (CmiGetArgFlag(argv,"++debug")) {  /*Pause so user has a chance to start and attach debugger*/
+    if (CmiGetArgFlag(largv,"++debug")) {  /*Pause so user has a chance to start and attach debugger*/
         printf("CHARMDEBUG> Processor %d has PID %d\n",*myNodeID,getpid());
-        if (!CmiGetArgFlag(argv,"++debug-no-pause"))
+        if (!CmiGetArgFlag(largv,"++debug-no-pause"))
             sleep(30);
     }
 
index c2ae27121f09273f03b729c6d9414869f359cf34..10d65b797ca1e488730aa2bfe84adcf995f2f01b 100644 (file)
@@ -234,7 +234,7 @@ static CmiCommHandle MachineSpecificSendForMPI(int destNode, int size, char *msg
 #define CmiMachineSpecificSendFunc MachineSpecificSendForMPI
 
 /* ### Beginning of Machine-startup Related Functions ### */
-static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeID);
+static void MachineInitForMPI(int *argc, char ***argv, int *numNodes, int *myNodeID);
 #define MachineSpecificInit MachineInitForMPI
 
 static void MachinePreCommonInitForMPI(int everReturn);
@@ -1011,19 +1011,21 @@ static char *thread_level_tostring(int thread_level) {
  *  Obtain the number of nodes, my node id, and consuming machine layer
  *  specific arguments
  */
-static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeID) {
+static void MachineInitForMPI(int *argc, char ***argv, int *numNodes, int *myNodeID) {
     int n,i;
     int ver, subver;
     int provided;
     int thread_level;
     int myNID;
+    int largc=*argc;
+    char** largv=*argv;
 
 #if MACHINE_DEBUG
     debugLog=NULL;
 #endif
 #if CMK_USE_HP_MAIN_FIX
 #if FOR_CPLUS
-    _main(argc,argv);
+    _main(largc,largv);
 #endif
 #endif
 
@@ -1033,13 +1035,15 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
 #else
     thread_level = MPI_THREAD_SINGLE;
 #endif
-    MPI_Init_thread(&argc, &argv, thread_level, &provided);
+    MPI_Init_thread(argc, argv, thread_level, &provided);
     _thread_provided = provided;
 #else
-    MPI_Init(&argc, &argv);
+    MPI_Init(argc, argv);
     thread_level = 0;
     provided = -1;
 #endif
+    largc = *argc;
+    largv = *argv;
     MPI_Comm_size(MPI_COMM_WORLD, numNodes);
     MPI_Comm_rank(MPI_COMM_WORLD, myNodeID);
 
@@ -1050,7 +1054,7 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
         printf("Charm++> Running on MPI version: %d.%d multi-thread support: %s (max supported: %s)\n", ver, subver, thread_level_tostring(thread_level), thread_level_tostring(provided));
     }
 
-    idleblock = CmiGetArgFlag(argv, "+idleblocking");
+    idleblock = CmiGetArgFlag(largv, "+idleblocking");
     if (idleblock && _Cmi_mynode == 0) {
         printf("Charm++: Running in idle blocking mode.\n");
     }
@@ -1070,7 +1074,7 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
 #if CMK_NO_OUTSTANDING_SENDS
     no_outstanding_sends=1;
 #endif
-    if (CmiGetArgFlag(argv,"+no_outstanding_sends")) {
+    if (CmiGetArgFlag(largv,"+no_outstanding_sends")) {
         no_outstanding_sends = 1;
         if (myNID == 0)
             printf("Charm++: Will%s consume outstanding sends in scheduler loop\n",
@@ -1078,13 +1082,13 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
     }
 
     request_max=MAX_QLEN;
-    CmiGetArgInt(argv,"+requestmax",&request_max);
+    CmiGetArgInt(largv,"+requestmax",&request_max);
     /*printf("request max=%d\n", request_max);*/
 
 #if MPI_POST_RECV
-    CmiGetArgInt(argv, "+postRecvCnt", &MPI_POST_RECV_COUNT);
-    CmiGetArgInt(argv, "+postRecvLowerSize", &MPI_POST_RECV_LOWERSIZE);
-    CmiGetArgInt(argv, "+postRecvUpperSize", &MPI_POST_RECV_UPPERSIZE);
+    CmiGetArgInt(largv, "+postRecvCnt", &MPI_POST_RECV_COUNT);
+    CmiGetArgInt(largv, "+postRecvLowerSize", &MPI_POST_RECV_LOWERSIZE);
+    CmiGetArgInt(largv, "+postRecvUpperSize", &MPI_POST_RECV_UPPERSIZE);
     if (MPI_POST_RECV_COUNT<=0) MPI_POST_RECV_COUNT=1;
     if (MPI_POST_RECV_LOWERSIZE>MPI_POST_RECV_UPPERSIZE) MPI_POST_RECV_UPPERSIZE = MPI_POST_RECV_LOWERSIZE;
     MPI_POST_RECV_SIZE = MPI_POST_RECV_UPPERSIZE;
@@ -1095,9 +1099,9 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
 #endif
 
 #if CMI_DYNAMIC_EXERT_CAP
-    CmiGetArgInt(argv, "+dynCapThreshold", &CMI_DYNAMIC_OUTGOING_THRESHOLD);
-    CmiGetArgInt(argv, "+dynCapSend", &CMI_DYNAMIC_SEND_CAPSIZE);
-    CmiGetArgInt(argv, "+dynCapRecv", &CMI_DYNAMIC_RECV_CAPSIZE);
+    CmiGetArgInt(largv, "+dynCapThreshold", &CMI_DYNAMIC_OUTGOING_THRESHOLD);
+    CmiGetArgInt(largv, "+dynCapSend", &CMI_DYNAMIC_SEND_CAPSIZE);
+    CmiGetArgInt(largv, "+dynCapRecv", &CMI_DYNAMIC_RECV_CAPSIZE);
     if (myNID==0) {
         printf("Charm++: using dynamic flow control with outgoing threshold %d, send cap %d, recv cap %d\n",
                CMI_DYNAMIC_OUTGOING_THRESHOLD, CMI_DYNAMIC_SEND_CAPSIZE, CMI_DYNAMIC_RECV_CAPSIZE);
@@ -1105,7 +1109,7 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
 #endif
 
     /* checksum flag */
-    if (CmiGetArgFlag(argv,"+checksum")) {
+    if (CmiGetArgFlag(largv,"+checksum")) {
 #if CMK_ERROR_CHECKING
         checksum_flag = 1;
         if (myNID == 0) CmiPrintf("Charm++: CheckSum checking enabled! \n");
@@ -1115,8 +1119,8 @@ static void MachineInitForMPI(int argc, char **argv, int *numNodes, int *myNodeI
     }
 
     {
-        int debug = CmiGetArgFlag(argv,"++debug");
-        int debug_no_pause = CmiGetArgFlag(argv,"++debug-no-pause");
+        int debug = CmiGetArgFlag(largv,"++debug");
+        int debug_no_pause = CmiGetArgFlag(largv,"++debug-no-pause");
         if (debug || debug_no_pause) {  /*Pause so user has a chance to start and attach debugger*/
 #if CMK_HAS_GETPID
             printf("CHARMDEBUG> Processor %d has PID %d\n",myNID,getpid());
index 541715c2872dda9496ccbce34f99ed8a9e7b43fe..3fcaba722979ca931d788c3c3af964b54ddadf16 100644 (file)
@@ -219,7 +219,8 @@ static int        Cmi_usrsched;  /* Continue after start function finishes? */
 void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret);
 static void ConverseRunPE(int everReturn);
 
-static void MachineSpecificInit(int argc, char **argv, int *numNodes, int *myNodeID);
+/*argc and argv could be changed by machine-specific initialization procedure*/
+static void MachineSpecificInit(int *argc, char ***argv, int *numNodes, int *myNodeID);
 /* Used in ConverseRunPE: one is called before ConverseCommonInit;
   * The other is called after ConverseCommonInit as some data structures
   * have been initialized, such as the tracing-relatd stuff --Chao Mei
@@ -821,7 +822,7 @@ void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret)
      */
     /* argv could be changed inside MachineSpecificInit */
     /* Inside this function, the number of nodes and my node id are obtained */
-    MachineSpecificInit(argc, argv, &_Cmi_numnodes, &_Cmi_mynode);
+    MachineSpecificInit(&argc, &argv, &_Cmi_numnodes, &_Cmi_mynode);
 
     _Cmi_numpes = _Cmi_numnodes * _Cmi_mynodesize;
     Cmi_nodestart = _Cmi_mynode * _Cmi_mynodesize;