diff --git a/LCS/ACC/PLC/src/ACCmain.cc b/LCS/ACC/PLC/src/ACCmain.cc index f5c98bea3c54d73954321154880f5e8e65502e34..b520e8910b4ec017fc01d131f72b865c0bbd29a2 100644 --- a/LCS/ACC/PLC/src/ACCmain.cc +++ b/LCS/ACC/PLC/src/ACCmain.cc @@ -39,16 +39,43 @@ namespace LOFAR { using APS::ParameterSet; - int ACCmain (int argc, char* argv[], ProcessControl* theProcess) { + int ACCmain (int argc, char* orig_argv[], ProcessControl* theProcess) { - string programName = basename(argv[0]); + char** argv = orig_argv; #ifdef HAVE_MPI - TH_MPI::initMPI(argc, (const char**)argv); + TH_MPI::initMPI(argc, orig_argv); + + int myRank = TH_MPI::getCurrentRank(); + + // The MPI standard does not demand that the commandline arguments are distributed, so we do it ourselves. + + // Broadcast number of arguments + MPI_Bcast(&argc, 1, MPI_INT, 0, MPI_COMM_WORLD); + if (myRank != 0) { + argv = new char*[argc]; + } else { + char** argv = orig_argv; + } + + for (int arg = 0; arg < argc; arg++) { + int arglen = 0; + if (myRank == 0) arglen = strlen(argv[arg]) + 1; + + // Broadcast the length of this argument + MPI_Bcast(&arglen, 1, MPI_INT, 0, MPI_COMM_WORLD); + + if (myRank != 0) { + argv[arg] = new char[arglen]; + } + // Broadcast the argument; + MPI_Bcast(argv[arg], arglen, MPI_BYTE, 0, MPI_COMM_WORLD); + } #endif - try { + string programName = basename(argv[0]); + try { // Check invocation syntax if ((argc!=3) || (strncmp("ACC", argv[1], 3) != 0)) {