Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Flavien's platform generator. It can produce lines, rings, tores, meshes, hypercubes...
[simgrid.git] / tools / platform_generation / simple_generator.c
diff --git a/tools/platform_generation/simple_generator.c b/tools/platform_generation/simple_generator.c
new file mode 100644 (file)
index 0000000..bd0d014
--- /dev/null
@@ -0,0 +1,267 @@
+/* $Id$ */
+
+/* Simple Generator                                                         */
+/* generates SimGrid platforms being either lines, rings, mesh, tore or     */
+/*  hypercubes.                                                             */
+
+/* Copyright (C) 2006 Flavien Vernier (original code)                       */
+/* Copyright (C) 2006 Martin Quinson  (cleanups & maintainance)             */
+/* All right reserved.                                                      */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+
+#include<stdio.h>
+#include<math.h>
+#include <stdlib.h>
+
+int MFLOPS=1000;
+int MBYTES=100;
+double LAT_S=0.00015;
+
+int size=0;
+int x=0,y=0;
+int dimension=0;
+
+int rand_mflops_min=0, rand_mflops_max=0;
+int rand_mbytes_min=0, rand_mbytes_max=0;
+double rand_lat_s_min=0.0, rand_lat_s_max=0.0;
+
+void randParam(){
+  if(rand_mflops_min!=rand_mflops_max){
+    MFLOPS=rand_mflops_min+((double)(rand_mflops_max-rand_mflops_min)*((double)rand()/RAND_MAX));
+  }
+  if(rand_mbytes_min!=rand_mbytes_max){
+    MBYTES=rand_mbytes_min+((double)(rand_mbytes_max-rand_mbytes_min)*((double)rand()/RAND_MAX));
+  }
+  if(rand_lat_s_min!=rand_lat_s_max){
+    LAT_S=rand_lat_s_min+((rand_lat_s_max-rand_lat_s_min)*((double)rand()/RAND_MAX));
+  }
+}
+
+void generateLine(){
+  int i;
+  fprintf(stdout,"<?xml version='1.0'?>\n<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n<platform_description>\n");
+  
+  
+  for(i=0;i<size;i++){
+    fprintf(stdout,"<cpu name=\"node%i\" power=\"%i\"/>\n",i,MFLOPS);
+    randParam();
+  }
+  
+  for(i=0;i<2*(size-1);i++){
+    fprintf(stdout,"<network_link name=\"link%i\" bandwidth=\"%i\" latency=\"%f\"/>\n",i,MBYTES,LAT_S);
+    randParam();
+  }
+
+  for(i=0;i<size-1;i++){
+    fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",i,(i+1),2*i);
+    fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",(i+1),i,2*i+1);
+  }
+  fprintf(stdout,"</platform_description>\n");
+
+}
+
+void generateRing(){
+  int i;
+  fprintf(stdout,"<?xml version='1.0'?>\n<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n<platform_description>\n");
+  
+  
+  for(i=0;i<size;i++){
+    fprintf(stdout,"<cpu name=\"node%i\" power=\"%i\"/>\n",i,MFLOPS);
+    randParam();
+  }
+  
+  for(i=0;i<2*size;i++){
+    fprintf(stdout,"<network_link name=\"link%i\" bandwidth=\"%i\" latency=\"%f\"/>\n",i,MBYTES,LAT_S);
+    randParam();
+  }
+
+  for(i=0;i<size;i++){
+    fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",i,(i+1)%size,2*i);
+    fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",(i+1)%size,i,2*i+1);
+  }
+  fprintf(stdout,"</platform_description>\n");
+}
+
+void generateMesh(){
+  int i,j,l;
+  fprintf(stdout,"<?xml version='1.0'?>\n<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n<platform_description>\n");
+  
+  for(i=0;i<x*y;i++){
+    fprintf(stdout,"<cpu name=\"node%i\" power=\"%i\"/>\n",i,MFLOPS);
+    randParam();
+  }
+  
+  for(i=0;i<2*((x-1)*y+(y-1)*x);i++){
+    fprintf(stdout,"<network_link name=\"link%i\" bandwidth=\"%i\" latency=\"%f\"/>\n",i,MBYTES,LAT_S);
+    randParam();
+  }
+
+  l=0;
+  for(j=0;j<y;j++){
+    for(i=0;i<x;i++){
+      if((i+1)%x!=0){
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,j*x+(i+1),l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+(i+1),j*x+i,l++);
+      }
+      if(j<y-1){
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,j*x+(i+x),l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+(i+x),j*x+i,l++);
+      }
+    }
+  }
+  fprintf(stdout,"</platform_description>\n");
+}
+
+void generateTore(){
+  int i,j,l;
+  fprintf(stdout,"<?xml version='1.0'?>\n<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n<platform_description>\n");
+  
+  for(i=0;i<x*y;i++){
+    fprintf(stdout,"<cpu name=\"node%i\" power=\"%i\"/>\n",i,MFLOPS);
+    randParam();
+  }
+  
+  for(i=0;i<4*x*y;i++){
+    fprintf(stdout,"<network_link name=\"link%i\" bandwidth=\"%i\" latency=\"%f\"/>\n",i,MBYTES,LAT_S);
+    randParam();
+  }
+
+  l=0;
+  for(j=0;j<y;j++){
+    for(i=0;i<x;i++){
+      if((i+1)%x!=0){
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,j*x+(i+1),l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+(i+1),j*x+i,l++);
+      }else{
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,j*x+i-x+1,l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i-x+1,j*x+i,l++);
+      }
+      if(j<y-1){
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,j*x+(i+x),l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+(i+x),j*x+i,l++);
+      }else{
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",j*x+i,i,l++);
+       fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",i,j*x+i,l++);
+      }
+    }
+  }
+  fprintf(stdout,"</platform_description>\n");
+}
+
+
+void generateHypercube(){
+  int i,d,l;
+
+  fprintf(stdout,"<?xml version='1.0'?>\n<!DOCTYPE platform_description SYSTEM \"surfxml.dtd\">\n<platform_description>\n");
+  
+  for(i=0;i<(int)pow(2.0,(double)dimension);i++){
+    fprintf(stdout,"<cpu name=\"node%i\" power=\"%i\"/>\n",i,MFLOPS);
+    randParam();
+  }
+
+  for(i=0;i<dimension*(int)pow(2.0,(double)dimension);i++){
+    fprintf(stdout,"<network_link name=\"link%i\" bandwidth=\"%i\" latency=\"%f\"/>\n",i,MBYTES,LAT_S);
+    randParam();
+  }
+
+  fprintf(stdout,"ROUTES\n");
+  l=0;
+  for(i=0;i<(int)pow(2.0,(double)dimension);i++){
+    for(d=1;d<(int)pow(2.0,(double)dimension);d=2*d)
+      fprintf(stdout,"<route src=\"node%i\" dst=\"node%i\"> <route_element name=\"link%i\"/></route>\n",i,i^d,l++);
+  }
+  fprintf(stdout,"</platform_description>\n");
+}
+
+void usage(int argc, char** argv){
+  fprintf(stderr,"%s topo [options] > platform_file.xml\n",argv[0]);
+  fprintf(stderr,"\ntopo:\n");
+  fprintf(stderr,"\t LINE n   \t generates a line of n nodes.\n");
+  fprintf(stderr,"\t RING n   \t generates a ring of n nodes.\n");
+  fprintf(stderr,"\t MESH x y \t generates a mesh of x line(s) y column(s).\n");
+  fprintf(stderr,"\t TORE x y \t generates a tore of x line(s) y column(s).\n");
+  fprintf(stderr,"\t HYPE d   \t generates a hypercubee of dimension d\n");
+  fprintf(stderr,"\noptions:\n");
+  fprintf(stderr,"\t --mflops n \t defines the power of each node (default: 1000), n must be integer\n");
+  fprintf(stderr,"\t --mbytes n \t defines the bandwidth of each edge (default: 100), n must be integer\n");
+  fprintf(stderr,"\t --lat_s  n \t defines the latency of each edge (default: 0.00015), n can be float\n");
+  fprintf(stderr,"\t --rand_mflops min max \t defines a random power between min and max for each node\n");
+  fprintf(stderr,"\t --rand_mbytes min max \t defines a random bandwidth between min and max for each edge\n");
+  fprintf(stderr,"\t --rand_lat_s  min max \t defines a random latency between min and max for each edge\n");
+  fprintf(stderr,"\t --help\n");
+}
+
+
+int main(int argc, char** argv){
+  int i=1;
+
+  void (*generate)(); 
+  generate=NULL;
+
+  srand(time(NULL));
+
+  while(i<argc){
+    if((strcmp(argv[i],"LINE")==0)&&(i+1<argc)){
+      generate=generateLine;
+      size=atoi(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"RING")==0)&&(i+1<argc)){
+      generate=generateRing;
+      size=atoi(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"MESH")==0)&&(i+2<argc)){
+      generate=generateMesh;
+      x=atoi(argv[i+1]);
+      y=atoi(argv[i+2]);
+      i+=3;
+    }else if((strcmp(argv[i],"TORE")==0)&&(i+2<argc)){
+      generate=generateTore;
+      x=atoi(argv[i+1]);
+      y=atoi(argv[i+2]);
+      i+=3;
+    }else if((strcmp(argv[i],"HYPE")==0)&&(i+1<argc)){
+      generate=generateHypercube;
+      dimension=atoi(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"--mflops")==0)&&(i+1<argc)){
+      MFLOPS=atoi(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"--mbytes")==0)&&(i+1<argc)){
+      MBYTES=atoi(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"--lat_s")==0)&&(i+1<argc)){
+      LAT_S=atof(argv[i+1]);
+      i+=2;
+    }else if((strcmp(argv[i],"--rand_mflops")==0)&&(i+2<argc)){
+      rand_mflops_min=atoi(argv[i+1]);
+      rand_mflops_max=atoi(argv[i+2]);
+      randParam();
+      i+=3;
+    }else if((strcmp(argv[i],"--rand_mbytes")==0)&&(i+2<argc)){
+      rand_mbytes_min=atoi(argv[i+1]);
+      rand_mbytes_max=atoi(argv[i+2]);
+      randParam();
+      i+=3;
+    }else if((strcmp(argv[i],"--rand_lat_s")==0)&&(i+2<argc)){
+      rand_lat_s_min=atof(argv[i+1]);
+      rand_lat_s_max=atof(argv[i+2]);
+      randParam();
+      i+=3;
+    }else{
+      usage(argc,argv);
+      return 1;
+    }
+  }
+  if(generate!=NULL){
+    (*generate)();
+    return 0;
+  }else{
+      usage(argc,argv);
+      return 1;    
+  }
+  return 0;
+}
+