12 void aide(char *prog);
13 void genereLiensLigne(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle);
14 void genereLiensAnneau(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle);
15 void genereLiensComplet(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle);
16 void genereRoutesLigne(ofstream &fic, int nbNoeuds, bool lienUnique);
17 void genereRoutesAnneau(ofstream &fic, int nbNoeuds, bool lienUnique);
18 void genereRoutesComplet(ofstream &fic, int nbNoeuds, bool lienUnique);
19 void genereDeploiementLigne(string &nom, int nbNoeuds);
20 void genereDeploiementAnneau(string &nom, int nbNoeuds);
21 void genereDeploiementComplet(string &nom, int nbNoeuds);
23 int main(int argc, char **argv)
26 int nbNoeuds=10; // Taille du cluster
27 char topo='L'; // Ligne, Anneau ou Complet
28 int minV=98095000, maxV=98095000; // Vitesses min et max des procs
29 int minB=100000000, maxB=100000000; // Bandes passantes min et max
30 double minL=0.0001, maxL=0.0001; // Latences min et max
31 bool liensDyns=false; // Indique si les liens sont intermittants ou pas
32 double minP=0.001,maxP=1.0; // Intervalles de période pour les intermittences des liens
33 double intervalle=10.0; // Taille de l'intervalle de temps pour les traces dynamiques des liens
34 long graine=1; // Initialisation générateur aléatoire
35 ofstream ficP; // Fichiers Plateforme et Déploiement
36 string nomFicP,nomFicD; // Noms des fichiers
37 bool lienUnique=false; // Indique si tous les liens sont identiques
39 while ((opt = getopt(argc, argv, "a:b:B:dD:f:F:g:i:l:L:n:P:t:v:V:")) != -1) {
54 nomFicD=string(optarg);
66 intervalle=atof(optarg);
75 nbNoeuds=atoi(optarg);
78 nomFicP=string(optarg);
95 // Vérification de la spécification du nom de fichier
96 if(nomFicP.size()==0 || nomFicD.size()==0){
100 cout << "Paramètres de génération de la plateforme :" << endl;
101 cout << "-----------------------------------------" << endl;
102 cout << "\tGraine : " << graine << endl;
104 cout << "\tNb noeuds : " << nbNoeuds << endl;
105 cout << "\tTopologie : " << ((topo=='L')?"Ligne":((topo=='A')?"Anneau":"Complet")) << endl;
106 cout << "\tVitesse min : " << minV << endl;
107 cout << "\tVitesse max : " << maxV << endl;
108 cout << "\tDébit min : " << minB << endl;
109 cout << "\tDébit max : " << maxB << endl;
110 cout << "\tLatence min : " << minL << endl;
111 cout << "\tLatence max : " << maxL << endl;
112 cout << "\tLiens dyns : " << ((liensDyns)?"oui":"non") << endl;
114 cout << "\t\tPériode min : " << minP << endl;
115 cout << "\t\tPériode max : " << maxP << endl;
116 cout << "\t\tIntervalle : " << intervalle << endl;
119 cout << "\tPlateforme : " << nomFicP << endl;
120 cout << "\tDéploiement : " << nomFicD << endl;
121 cout << "-----------------------------------------" << endl;
124 // Init générateur aléat
127 // Génération du fichier de plateforme
128 ficP.open(nomFicP.c_str());
131 ficP << "<?xml version='1.0'?>" << endl;
132 ficP << "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">" << endl;
133 ficP << "<platform version=\"2\">" << endl;
138 for(i=1;i<=nbNoeuds;++i){
139 int power=(int) (minV + (maxV - minV + 1.0) * rand() / (RAND_MAX + 1.0) );
140 puiss.push_back(power);
142 puiss[i = (rand() % nbNoeuds)] = maxV; // on force la présence des extremum
143 puiss[(i + ( rand() % nbNoeuds ) ) % nbNoeuds] = minV;
144 for(i=0;i<nbNoeuds;++i){
145 ficP << " <host id=\"" << i+1 << "\" power=\"" << puiss[i] << "\"/>" << endl;
149 for(int i=1;i<=nbNoeuds;++i){
150 ficP << " <host id=\"" << i << "\" power=\"" << maxV << "\"/>" << endl;
154 if(minB==maxB && minL==maxL && !liensDyns){ // liens identiques partout et statiques
155 ficP << " <link id=\"unique\" bandwidth=\"" << maxB << "\" latency=\"" << minL << "\"/>" << endl;
160 genereLiensLigne(ficP, nbNoeuds, minB, maxB, minL, maxL, liensDyns, minP, maxP, intervalle);
163 genereLiensAnneau(ficP, nbNoeuds, minB, maxB, minL, maxL, liensDyns, minP, maxP, intervalle);
166 genereLiensComplet(ficP, nbNoeuds, minB, maxB, minL, maxL, liensDyns, minP, maxP, intervalle);
173 genereRoutesLigne(ficP, nbNoeuds, lienUnique);
176 genereRoutesAnneau(ficP, nbNoeuds, lienUnique);
179 genereRoutesComplet(ficP, nbNoeuds, lienUnique);
182 // Fin de description de plateforme
183 ficP << "</platform>" << endl;
184 // Fermeture du fichier
188 // Génération du fichier de déploiement
191 genereDeploiementLigne(nomFicD, nbNoeuds);
194 genereDeploiementAnneau(nomFicD, nbNoeuds);
197 genereDeploiementComplet(nomFicD, nbNoeuds);
204 void aide(char *prog)
206 cout << "Usage : " << prog << " [options]" << endl
207 << "Options :" << endl
208 << " -b entier : bande passante min des liens" << endl
209 << " -B entier : bande passante max des liens" << endl
210 << " -d : liens dynamiques" << endl
211 << " -D fichier : nom du fichier de déploiement" << endl
212 << " -f réel : durée min d'intermittence des liens" << endl
213 << " -F réel : durée max d'intermittence des liens" << endl
214 << " -i réel : intervalle de temps des intermittences des liens" << endl
215 << " -l entier : latence min des liens" << endl
216 << " -L entier : latence max des liens" << endl
217 << " -n entier : nombre de procs" << endl
218 << " -P fichier : nom du fichier de plateforme" << endl
219 << " -t car : type de topologie (L, A, C)" << endl
220 << " -v entier : vitesse min des procs" << endl
221 << " -V entier : vitesse max des procs" << endl
225 void genereLiensLigne(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle)
230 for(int i=1; i<nbNoeuds; ++i){
232 fic << " <link id=\"" << i << "-" << i+1 << "\"";
233 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
234 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
236 // Spécification du fichier d'état dans la description du lien
238 nom << i << "-" << i+1 << ".txt";
239 fic << " state_file=\"" << nom.str() << "\"";
240 // Écriture du fichier d'état
241 ficState.open(nom.str().c_str());
244 bool etat = rand()%2;
245 ficState << "PERIODICITY " << (minP + (maxP - minP) * rand() / RAND_MAX ) << endl;
246 while(somme<intervalle){
247 double val = (minP + (maxP - minP) * rand() / RAND_MAX );
249 ficState << somme << " " << ((etat==0)?1.0:-1.0) << endl;
257 fic << " <link id=\"" << i+1 << "-" << i << "\"";
258 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
259 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
261 // Spécification du fichier d'état dans la description du lien
262 fic << " state_file=\"" << nom.str() << "\"";
268 void genereLiensAnneau(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle)
273 genereLiensLigne(fic, nbNoeuds, minB, maxB, minL, maxL, liensDyns, minP, maxP, intervalle);
274 // Sens dernier -> premier
275 fic << " <link id=\"" << nbNoeuds << "-" << 1 << "\"";
276 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
277 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
279 // Spécification du fichier d'état dans la description du lien
281 nom << nbNoeuds << "-" << 1 << ".txt";
282 fic << " state_file=\"" << nom.str() << "\"";
283 // Écriture du fichier d'état
284 ficState.open(nom.str().c_str());
287 bool etat = rand()%2;
288 ficState << "PERIODICITY " << (minP + (maxP - minP) * rand() / RAND_MAX ) << endl;
289 while(somme<intervalle){
290 double val = (minP + (maxP - minP) * rand() / RAND_MAX );
292 ficState << somme << " " << ((etat==0)?1.0:-1.0) << endl;
299 // Sens premier -> dernier
300 fic << " <link id=\"" << 1 << "-" << nbNoeuds << "\"";
301 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
302 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
304 // Spécification du fichier d'état dans la description du lien
305 fic << " state_file=\"" << nom.str() << "\"";
310 void genereLiensComplet(ofstream &fic, int nbNoeuds, int minB, int maxB, double minL, double maxL, bool liensDyns, double minP, double maxP, double intervalle)
315 for(int i=1; i<=nbNoeuds ; ++i){
316 for(int j=i+1; j<=nbNoeuds ; ++j){
318 fic << " <link id=\"" << i << "-" << j << "\"";
319 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
320 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
322 // Spécification du fichier d'état dans la description du lien
324 nom << i << "-" << j << ".txt";
325 fic << " state_file=\"" << nom.str() << "\"";
326 // Écriture du fichier d'état
327 ficState.open(nom.str().c_str());
330 bool etat = rand()%2;
331 ficState << "PERIODICITY " << (minP + (maxP - minP) * rand() / RAND_MAX ) << endl;
332 while(somme<intervalle){
333 double val = (minP + (maxP - minP) * rand() / RAND_MAX );
335 ficState << somme << " " << ((etat==0)?1.0:-1.0) << endl;
343 fic << " <link id=\"" << j << "-" << i << "\"";
344 fic << " bandwidth=\"" << (int) (minB + (maxB - minB + 1.0) * rand() / (RAND_MAX + 1.0) ) << "\"";
345 fic << " latency=\"" << (minL + (maxL - minL) * rand() / RAND_MAX ) << "\"";
347 // Spécification du fichier d'état dans la description du lien
348 fic << " state_file=\"" << nom.str() << "\"";
355 void genereRoutesLigne(ofstream &fic, int nbNoeuds, bool lienUnique)
357 for(int i=1; i<nbNoeuds; ++i){
359 fic << " <route src=\"" << i << "\" dst=\"" << i+1 << "\">" << endl;
361 fic << " <link:ctn id=\"unique\"/>" << endl;
363 fic << " <link:ctn id=\"" << i << "-" << i+1 << "\"/>" << endl;
365 fic << " </route>" << endl;
367 fic << " <route src=\"" << i+1 << "\" dst=\"" << i << "\">" << endl;
369 fic << " <link:ctn id=\"unique\"/>" << endl;
371 fic << " <link:ctn id=\"" << i+1 << "-" << i << "\"/>" << endl;
373 fic << " </route>" << endl;
377 void genereRoutesAnneau(ofstream &fic, int nbNoeuds, bool lienUnique)
379 genereRoutesLigne(fic, nbNoeuds, lienUnique);
380 // Sens dernier -> premier
381 fic << " <route src=\"" << nbNoeuds << "\" dst=\"" << 1 << "\">" << endl;
383 fic << " <link:ctn id=\"unique\"/>" << endl;
385 fic << " <link:ctn id=\"" << nbNoeuds << "-" << 1 << "\"/>" << endl;
387 fic << " </route>" << endl;
388 // Sens premier -> dernier
389 fic << " <route src=\"" << 1 << "\" dst=\"" << nbNoeuds << "\">" << endl;
391 fic << " <link:ctn id=\"unique\"/>" << endl;
393 fic << " <link:ctn id=\"" << 1 << "-" << nbNoeuds << "\"/>" << endl;
395 fic << " </route>" << endl;
398 void genereRoutesComplet(ofstream &fic, int nbNoeuds, bool lienUnique)
400 for(int i=1; i<=nbNoeuds ; ++i){
401 for(int j=i+1; j<=nbNoeuds ; ++j){
403 fic << " <route src=\"" << i << "\" dst=\"" << j << "\">" << endl;
405 fic << " <link:ctn id=\"unique\"/>" << endl;
407 fic << " <link:ctn id=\"" << i << "-" << j << "\"/>" << endl;
409 fic << " </route>" << endl;
411 fic << " <route src=\"" << j << "\" dst=\"" << i << "\">" << endl;
413 fic << " <link:ctn id=\"unique\"/>" << endl;
415 fic << " <link:ctn id=\"" << j << "-" << i << "\"/>" << endl;
417 fic << " </route>" << endl;
422 void genereDeploiementLigne(string &nom, int nbNoeuds)
426 fic.open(nom.c_str());
428 fic << "<?xml version='1.0'?>" << endl;
429 fic << "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">" << endl;
430 fic << "<platform version=\"2\">" << endl;
431 for(int i=1; i<=nbNoeuds; ++i){
432 // Dépendances du proc i
433 fic << " <process host=\"" << i << "\" function=\"Calculs\">" << endl;
435 fic << " <argument value=\"" << i-1 << "\"/>" << endl;
437 fic << " <argument value=\"" << i+1 << "\"/>" << endl;
438 fic << " </process>" << endl;
440 fic << "</platform>" << endl;
443 cout << "Problème d'écriture du fichier de déploiement !" << endl;
447 void genereDeploiementAnneau(string &nom, int nbNoeuds)
451 fic.open(nom.c_str());
453 fic << "<?xml version='1.0'?>" << endl;
454 fic << "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">" << endl;
455 fic << "<platform version=\"2\">" << endl;
456 for(int i=1; i<=nbNoeuds; ++i){
457 // Dépendances du proc i
458 fic << " <process host=\"" << i << "\" function=\"Calculs\">" << endl;
459 fic << " <argument value=\"" << 1+(i-1+nbNoeuds-1)%nbNoeuds << "\"/>" << endl;
460 fic << " <argument value=\"" << 1+(i%nbNoeuds) << "\"/>" << endl;
461 fic << " </process>" << endl;
463 fic << "</platform>" << endl;
466 cout << "Problème d'écriture du fichier de déploiement !" << endl;
470 void genereDeploiementComplet(string &nom, int nbNoeuds)
474 fic.open(nom.c_str());
476 fic << "<?xml version='1.0'?>" << endl;
477 fic << "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">" << endl;
478 fic << "<platform version=\"2\">" << endl;
479 for(int i=1; i<=nbNoeuds; ++i){
480 // Dépendances du proc i
481 fic << " <process host=\"" << i << "\" function=\"Calculs\">" << endl;
482 for(int j=1; j<=nbNoeuds; ++j){
484 fic << " <argument value=\"" << j << "\"/>" << endl;
486 fic << " </process>" << endl;
488 fic << "</platform>" << endl;
491 cout << "Problème d'écriture du fichier de déploiement !" << endl;