initial commit
This commit is contained in:
commit
a34c9714ab
|
|
@ -0,0 +1,8 @@
|
|||
mkparallel
|
||||
---
|
||||
Execute a serial command embarassingly parallel.
|
||||
Usage:
|
||||
mpirun -n <nproc> mkparallel <command> <digits>
|
||||
|
||||
<command> is the command to be executed where every occurence of {} will be replaced by the rank of the processor.
|
||||
The rank can be padded with leading zeros by specifying <digits> with a value greater than zero.
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <mpi.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
string toStringZeroPadded(int,int);
|
||||
void replaceAll(string&r,const string&,const string&);
|
||||
|
||||
int main(int argc,char *argv[])
|
||||
{
|
||||
int ierr;
|
||||
int nproc;
|
||||
int rank;
|
||||
MPI_Status status;
|
||||
|
||||
ierr = MPI_Init(&argc,&argv);
|
||||
ierr = MPI_Comm_rank(MPI_COMM_WORLD,&rank);
|
||||
ierr = MPI_Comm_size(MPI_COMM_WORLD,&nproc);
|
||||
|
||||
// Check positional arguments
|
||||
if(argc!=3){
|
||||
cerr << "Usage: mpirun -n " << nproc << " " << argv[0] << " <cmd> <digits>\n"
|
||||
<< " <cmd> command to be executed embarassingly parallel. {} is replaced by rank\n"
|
||||
<< " <digits> number of leading zeros for rank replacement\n";
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Parse command line arguments
|
||||
string arg_cmd = argv[1];
|
||||
string arg_digits = argv[2];
|
||||
int digits;
|
||||
try{
|
||||
digits = stoi(arg_digits);
|
||||
}
|
||||
catch(const invalid_argument& ia){
|
||||
cerr << "Invalid argument to " << ia.what() << ": " << arg_digits << endl;
|
||||
return 2;
|
||||
}
|
||||
|
||||
// Construct command to be executed
|
||||
string str_cmd = arg_cmd;
|
||||
string str_rank;
|
||||
if(digits>0)
|
||||
str_rank = toStringZeroPadded(rank,digits);
|
||||
else
|
||||
str_rank = to_string(rank);
|
||||
replaceAll(str_cmd,"{}",str_rank);
|
||||
cerr << "Rank " << rank << " is executing: " << str_cmd << endl;
|
||||
|
||||
// Run command and return exit code
|
||||
int exitcode = system(str_cmd.c_str());
|
||||
cerr << "Rank " << rank << " finished with exitcode " << exitcode << endl;
|
||||
|
||||
// Finalize
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
}
|
||||
|
||||
string toStringZeroPadded(int val,int pad){
|
||||
char tmp[pad];
|
||||
string str;
|
||||
sprintf(tmp,"%0*d",pad,val);
|
||||
str = tmp;
|
||||
return str;
|
||||
}
|
||||
|
||||
void replaceAll(string& str,const string& from,const string& to){
|
||||
if(from.empty())
|
||||
return;
|
||||
size_t start_pos = 0;
|
||||
while((start_pos=str.find(from,start_pos))!=string::npos){
|
||||
str.replace(start_pos,from.length(),to);
|
||||
start_pos+=to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
int checkMpiError(int ierr){
|
||||
char msg[MPI_MAX_ERROR_STRING];
|
||||
int msglen, ierr2;
|
||||
if(ierr!=0){
|
||||
ierr2 = MPI_Error_string(ierr,msg,&msglen);
|
||||
cout << msg << endl;
|
||||
return ierr2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
Loading…
Reference in New Issue