- Location:
- /trunk/oar
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
/trunk/oar/Makefile
r20 r30 2 2 CC=mpiCC 3 3 CCFLAGS=-O2 4 PODFLAG=-c 'User Contributed OAR Documentation' -r 'LEGI Trokata' 5 4 6 5 7 .PHONY: all clean distclean 6 8 7 all: mpilauncher 9 all: mpilauncher mpilauncher.1 oar-envsh.1 oar-dispatch.1 oar-parexec.1 8 10 9 11 clean: … … 19 21 %.o: %.cpp 20 22 $(CC) $(CCFLAGS) -c $< 23 24 %.1: %.cpp 25 sed -re 's#^[/ ]\* ?##; s#^// ?##' $< | pod2man -n $* $(PODFLAG) > $@ 26 27 %.1: % 28 pod2man -n $* $(PODFLAG) $< > $@ 29 30 # astyle --style=banner -s3 mpilauncher.cpp -
/trunk/oar/mpilauncher.cpp
r20 r30 14 14 15 15 /* 16 These two variables sets the command to launch in each sub-directory and the arguments required. The name of the root directory of the datasets is given as an argument when starting the MPIlauncher. 17 const string commandToLaunch("/HA/sources/begou/SOURCES/MES-PROJETS/MPILAUNCHER/appli.exe"); 18 const string("-l -info"); 19 */ 20 21 /* 22 getListOfDir(string rep, vector<string> &files) 23 24 Gets the list of tjhe subdirectories in the directory rep and returns them 25 in a vector array of strings. Directories ";" and ".." are removed from the 26 vector array. 27 */ 28 int getListOfDir(string rep, vector<string> &files) 29 { 30 DIR *dir; 31 struct dirent *ent; 32 int count; 33 34 count=0; 35 dir = opendir (rep.c_str()); 36 if (dir != NULL) { 37 /* search for the files within directory */ 38 while ((ent = readdir (dir)) != NULL) 39 if (ent->d_type == DT_DIR) { 40 if (strcmp(ent->d_name,".") * strcmp(ent->d_name,"..")) { 41 count++; 42 files.push_back(string(ent->d_name)); 43 } 44 } 45 closedir (dir); 46 } 47 else { 48 cerr<<"Directory "<<rep.c_str()<<" not found"<<endl; 49 } 16 * These two variables sets the command to launch in each sub-directory 17 * and the arguments required. The name of the root directory of the 18 * datasets is given as an argument when starting the MPIlauncher. const 19 * string 20 * commandToLaunch("$HOME/SOURCES/MES-PROJETS/MPILAUNCHER/appli.exe"); 21 * const string("-l -info"); 22 */ 23 24 /* 25 * getListOfDir(string rep, vector<string> &files) 26 * 27 * Gets the list of tjhe subdirectories in the directory rep and returns 28 * them in a vector array of strings. Directories ";" and ".." are removed 29 * from the vector array. 30 */ 31 int getListOfDir(string rep, vector < string > &files) { 32 DIR *dir; 33 struct dirent *ent; 34 int count; 35 36 count = 0; 37 dir = opendir(rep.c_str()); 38 if (dir != NULL) { 39 /* 40 * search for the files within directory 41 */ 42 while ((ent = readdir(dir)) != NULL) 43 if (ent->d_type == DT_DIR) { 44 if (strcmp(ent->d_name, ".") * 45 strcmp(ent->d_name, "..")) { 46 count++; 47 files.push_back(string(ent->d_name)); 48 } 49 } 50 closedir(dir); 51 } 52 else { 53 cerr << "Directory " << rep.c_str() << " not found" << endl; 54 } 50 55 return count; 51 } 52 /* getListOfCommand(string rep, vector<string> &files) 53 Gets the list of commands in the ascii file fich. One command per line (no wrap) 54 in this first version. 55 */ 56 int getListOfCommand(const string & fich, vector<string> &commands) 57 { 58 int count; 59 string line; 60 61 count=0; 62 commands.clear(); 63 64 std::ifstream infile (fich.c_str(), std::ios_base::in); 65 while (getline(infile, line, '\n')) 66 { 67 // remove all trailing blanks 68 while(line.size() >0 && isspace(line[line.size() -1])) line.erase(line.size() -1); 69 70 // no empty line 71 if (line.size() > 0) { 72 commands.push_back (line); 73 count++; 74 } 75 } 76 return count; 77 } 78 79 80 81 /* 82 Main program 83 */ 84 int main(int argc, char **argv) 85 { 86 vector<string> files = vector<string>(); 87 string rep; //root directory where to find subdirectories 88 int rank, size, nbdir, stride; 89 int nbcmd; 90 /* 91 These two variables sets the command to launch in each sub-directory and the arguments required. The name of the root directory of the datasets is given as an argument when starting the MPIlauncher. 92 */ 93 string commandToLaunch; 94 string arguments; 95 string commandfile; 96 97 string finalCommand; //command to execute 98 99 MPI_Init (&argc, &argv); /* starts MPI */ 100 MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ 101 MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ 102 103 if (argc<3){ 104 cout<<"USAGE:"<<endl; 105 cout<<argv[0]<<" root_directory command [arguments]"<<endl; 106 cout<<argv[0]<<" -f command_file"<<endl; 107 } 108 else { 109 if (strcmp(argv[1],"-f")==0) { 110 /* processing a command file now. */ 111 commandfile=argv[2]; 112 nbcmd=getListOfCommand(commandfile, files); 113 // if (rank==0){ 114 // cout<<"Command file is "<<commandfile<<endl; 115 // for (unsigned int i = 0;i < nbcmd;i++) 116 // cout<<"["<<files[i]<<"]"<<endl; 117 // } 118 119 120 //Number of commands should divide by number of cpus 121 // if (nbcmd%size != 0) { 122 // if(rank ==0) 123 // cerr <<nbcmd<<" command(s) to process in "<<commandfile 124 // <<" cannot fit on "<<size<<" processe(s)" 125 // <<endl<<"FAILED"<<endl; 126 // } 127 // else { 128 // execute the command 129 int reste; 130 stride=nbcmd/size; 131 for (unsigned int i = 0;i < stride;i++) { 132 cerr<<"Process "<<rank<<" execute "<<files[stride*rank+i] <<endl; 133 system(files[stride*rank+i].c_str() ); 134 } 135 //remaining command lines 136 reste=nbcmd-stride*size; 137 if(rank>0 && rank<=reste){ 138 cerr<<"Process "<<rank<<" execute "<<files[nbcmd-rank] <<endl; 139 system(files[nbcmd-rank].c_str() ); 140 } 141 // } 56 } 57 58 /* 59 * getListOfCommand(string rep, vector<string> &files) Gets the list of 60 * commands in the ascii file fich. One command per line (no wrap) in this 61 * first version. 62 */ 63 int getListOfCommand(const string & fich, vector < string > &commands) { 64 int count; 65 string line; 66 67 count = 0; 68 commands.clear(); 69 70 std::ifstream infile(fich.c_str(), std::ios_base::in); 71 while (getline(infile, line, '\n')) { 72 // remove all trailing blanks 73 while (line.size() > 0 && isspace(line[line.size() - 1])) 74 line.erase(line.size() - 1); 75 76 // no empty line 77 if (line.size() > 0) { 78 commands.push_back(line); 79 count++; 80 } 81 } 82 return count; 83 } 84 85 /* 86 * Main program 87 */ 88 int main(int argc, char **argv) { 89 vector < string > files = vector < string > (); 90 string rep; // root folder where to find subfolders 91 int rank, size, nbdir, stride; 92 int nbcmd; 93 /* 94 * These two variables sets the command to launch in each 95 * sub-directory and the arguments required. The name of the root 96 * directory of the datasets is given as an argument when starting the 97 * MPIlauncher. 98 */ 99 string commandToLaunch; 100 string arguments; 101 string commandfile; 102 103 string finalCommand; // command to execute 104 105 MPI_Init(&argc, &argv); // starts MPI 106 MPI_Comm_rank(MPI_COMM_WORLD, &rank); // get current process id 107 MPI_Comm_size(MPI_COMM_WORLD, &size); // get number of processes 108 109 if (argc < 3) { 110 cout << "USAGE:" << endl; 111 cout << argv[0] << " root_directory command [arguments]" << 112 endl; 113 cout << argv[0] << " -f command_file" << endl; 142 114 } 143 115 else { 144 /* processing a list of dir now */ 145 rep=string(argv[1]); 146 commandToLaunch=string(argv[2]); 147 for (int i=3; i<argc; i++) (arguments+=argv[i])+=" "; 148 149 nbdir=getListOfDir(rep, files); 150 151 //Number of dir should divide by number of cpus 152 if (nbdir%size != 0) { 153 if(rank ==0) 154 cerr <<nbdir<<" dataset(s) to process cannot fit on "<<size<<" processes"<<endl<<"FAILED"<<endl; 155 } 156 else { 157 // execute the command 158 stride=nbdir/size; 159 for (unsigned int i = 0;i < stride;i++) { 160 string finalCommand("cd "); 161 finalCommand +=rep; 162 finalCommand +="/"; 163 finalCommand += files[stride*rank+i]; 164 finalCommand +=";"; 165 finalCommand +=commandToLaunch; 166 finalCommand +=" "; 167 finalCommand +=arguments; 168 //cout<<"On "<<rank<<" execute "<<finalCommand<<endl; 169 system(finalCommand.c_str() ); 170 } 171 } 172 } 173 } 174 MPI_Finalize(); 175 176 return 0; 177 } 116 if (strcmp(argv[1], "-f") == 0) { 117 /* 118 * processing a command file now. 119 */ 120 commandfile = argv[2]; 121 nbcmd = getListOfCommand(commandfile, files); 122 int reste; 123 stride = nbcmd / size; 124 for (unsigned int i = 0; i < stride; i++) { 125 cerr << "Process " << rank << " execute " << 126 files[stride * rank + i] << endl; 127 system(files[stride * rank + i].c_str()); 128 } 129 // remaining command lines 130 reste = nbcmd - stride * size; 131 if (rank > 0 && rank <= reste) { 132 cerr << "Process " << rank << " execute " << 133 files[nbcmd - rank] << endl; 134 system(files[nbcmd - rank].c_str()); 135 } 136 } 137 else { 138 /* 139 * processing a list of dir now 140 */ 141 rep = string(argv[1]); 142 commandToLaunch = string(argv[2]); 143 for (int i = 3; i < argc; i++) 144 (arguments += argv[i]) += " "; 145 146 nbdir = getListOfDir(rep, files); 147 148 // Number of dir should divide by number of cpus 149 if (nbdir % size != 0) { 150 if (rank == 0) 151 cerr << nbdir << 152 " dataset(s) to process cannot fit on " 153 << size << " processes" << endl << 154 "FAILED" << endl; 155 } 156 else { 157 // execute the command 158 stride = nbdir / size; 159 for (unsigned int i = 0; i < stride; i++) { 160 string finalCommand("cd "); 161 finalCommand += rep; 162 finalCommand += "/"; 163 finalCommand += 164 files[stride * rank + i]; 165 finalCommand += ";"; 166 finalCommand += commandToLaunch; 167 finalCommand += " "; 168 finalCommand += arguments; 169 // cout<<"On "<<rank<<" execute "<<finalCommand<<endl; 170 system(finalCommand.c_str()); 171 } 172 } 173 } 174 } 175 MPI_Finalize(); 176 177 return 0; 178 } 179 180 /* 181 * Documentation in Perl POD format (man perlpod) 182 * 183 * =head1 NAME 184 * 185 * mpilauncher - parallel execute lot of small job via mpi 186 * 187 * =head1 SYNOPSIS 188 * 189 * mpilauncher root_folder command [args] 190 * mpilauncher -f command_file 191 * 192 * =head1 DESCRIPTION 193 * 194 * C<mpilauncher> need to be executed inside an MPI environment (mpirun), 195 * typically a cluster... Job process are divide by the number of core and 196 * are launched on each core via the "system" command one after other. 197 * 198 * There is two case: jobs are list and define in a file (option -f) or 199 * one command is launched inside a lot of folder. In this last case, you 200 * need to give the root folder path in which you have all your subfolder... 201 * 202 * 203 * =head1 SEE ALSO 204 * 205 * oar-dispatch, oar-parexec 206 * 207 * 208 * =head1 AUTHORS 209 * 210 * Written by Patrick Begou - Gabriel Moreau, Grenoble - France 211 * 212 * 213 * =head1 LICENSE AND COPYRIGHT 214 * 215 * GPL version 2 or later 216 * 217 * Copyright (C) 2011 Patrick Begou / LEGI - CNRS UMR 5519 - France 218 * 219 * =cut 220 * 221 */ -
/trunk/oar/oar-dispatch
r20 r30 106 106 =head1 SYNOPSIS 107 107 108 oar-dispatch [-- coreinteger] [--overload real] --file filepath [--verbose]108 oar-dispatch [--task integer] [--overload real] --file filepath [--verbose] 109 109 oar-dispatch --help 110 110 111 111 =head1 OPTIONS 112 112 113 --task number of task to do in parallel. 114 default to line number of file OAR_NODE_FILE. 113 =over 12 114 115 =item B<[-t|--task integer]> 116 117 Number of task to do in parallel. 118 Default to the line number of the file OAR_NODE_FILE. 115 119 116 --overload number of OAR job to create / number of task. 117 Some job are create in advance to start whenever it's possible. 118 1.1 by default. 120 =item B<[-o|--overload real]> 119 121 120 --file file name which content OAR job list 122 Number of OAR job to create / number of task. 123 Some job are create in advance to start whenever it's possible. 124 1.1 by default. 121 125 122 --verbose 126 =item B<[-f|--file filepath]> 127 128 File name which content OAR job list 129 130 =item B<[-v|--verbose]> 123 131 124 --help 132 =item B<[-h|--help]> 133 134 =back 125 135 126 136 Input job file name content can have … … 133 143 just after C<oarsub>. 134 144 135 Example where F<$HOME/test/subjob.txt> is a list of OAR script job (and can be executable but not need here). 145 =head1 EXAMPLE 146 147 Example where the file F<$HOME/test/subjob.txt> is a list of OAR script job (and can be executable but not need here). 136 148 137 149 oarsub -n test -l /core=1,walltime=00:05:00 $HOME/test/subjob1.oar … … 161 173 162 174 175 =head1 SEE ALSO 176 177 oar-parexec, mpilauncher 178 179 163 180 =head1 AUTHORS 164 181 165 Gabriel Moreau (C) 2011 182 Written by Gabriel Moreau, Grenoble - France 183 184 185 =head1 LICENSE AND COPYRIGHT 186 187 GPL version 2 or later and Perl equivalent 188 189 Copyright (C) 2011 Gabriel Moreau / LEGI - CNRS UMR 5519 - France 190 -
/trunk/oar/oar-envsh
r20 r30 28 28 29 29 exec /opt/oar/current/bin/oarsh $HOST "$MYENV $@" 30 31 exit 32 33 ################################################################ 34 35 Documentation in Perl POD format (man perlpod) 36 37 =head1 NAME 38 39 oar-envsh - oarsh with env variable transmit 40 41 =head1 SYNOPSIS 42 43 oar-envsh node command 44 45 =head1 DESCRIPTION 46 47 C<oar-envsh> need to be executed inside an OAR cluster. 48 It's a simple wrapper around C<oarsh> command 49 which is a wrapper around C<ssh> command! 50 51 With C<oar-envsh>, almost all env variable are export 52 in the new shell except the following: 53 54 USER TERM OAR* SGE_* LS_COLORS 55 ENV BASH_ENV HOSTNAME LOGNAME MAIL 56 MANPATH OMPI_MCA_plm_rsh_agent PWD 57 SHELL SSH_* SUDO_COMMAND= HOME DISPLAY 58 SHLVL 59 60 Alway use C<oarsh>, 61 only use C<oar-envsh> if really needed! 62 63 64 =head1 SEE ALSO 65 66 oarsh 67 68 69 =head1 AUTHORS 70 71 Written by : 72 73 Nicolas Capit, Grenoble - France 74 Patrick Begou - Gabriel Moreau, Grenoble - France 75 76 77 =head1 LICENSE AND COPYRIGHT 78 79 GPL version 2 or later 80 81 Copyright (C) 2011 Patrick Begou / LEGI - CNRS UMR 5519 - France 82 83 =cut -
/trunk/oar/oar-parexec
r20 r30 29 29 ) || pod2usage( -verbose => 0 ); 30 30 pod2usage( -verbose => 2 ) if $help; 31 pod2usage( -verbose => 2 ) if -e $file;31 pod2usage( -verbose => 2 ) if not -e $file; 32 32 33 33 my @job = (); … … 147 147 --help 148 148 149 File name content can have 149 150 =head1 DESCRIPTION 151 152 C<oar-parexec> need to be executed inside an OAR job environment. 153 because it need the two environment variable that OAR define by 154 default: 155 156 OAR_NODE_FILE path to a file which content one node by line 157 158 OAR_WORKDIR dir to launch job and do a chdir inside 159 160 Content for the job file (option C<--file>) could have: 150 161 151 162 - empty line … … 168 179 oarsub -n test -l /core=6,walltime=00:35:00 "oar-parexec -f ./subjob.list.txt" 169 180 181 182 =head1 SEE ALSO 183 184 oar-dispatch, mpilauncher 185 186 170 187 =head1 AUTHORS 171 188 172 Gabriel Moreau (C) 2011 189 Written by Gabriel Moreau, Grenoble - France 173 190 191 192 =head1 LICENSE AND COPYRIGHT 193 194 GPL version 2 or later and Perl equivalent 195 196 Copyright (C) 2011 Gabriel Moreau / LEGI - CNRS UMR 5519 - France 197
Note: See TracChangeset
for help on using the changeset viewer.