Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
get rid of surf_exit()
[simgrid.git] / doc / doxygen / platform.doc
1 /*! @page platform Describing the virtual platform
2
3
4 @section pf_res Resource description
5
6 @subsection pf_res_computing Computing Resources
7
8
9 @subsubsection pf_tag_cluster <cluster>
10
11 ``<cluster />`` represents a machine-cluster. It is most commonly used
12 when one wants to define many hosts and a network quickly. Technically,
13 ``cluster`` is a meta-tag: <b>from the inner SimGrid point of
14 view, a cluster is a network zone where some optimized routing is defined</b>.
15 The default inner organization of the cluster is as follow:
16
17 @verbatim
18                  __________
19                 |          |
20                 |  router  |
21     ____________|__________|_____________ backbone
22       |   |   |              |     |   |
23     l0| l1| l2|           l97| l96 |   | l99
24       |   |   |   ........   |     |   |
25       |                                |
26     c-0.me                             c-99.me
27 @endverbatim
28
29 Here, a set of <b>host</b>s is defined. Each of them has a <b>link</b>
30 to a central backbone (backbone is a link itself, as a link can
31 be used to represent a switch, see the switch / link section
32 below for more details about it). A <b>router</b> allows one to connect a
33 <b>cluster</b> to the outside world. Internally,
34 SimGrid treats a cluster as a network zone containing all hosts: the router is the default
35 gateway for the cluster.
36
37 There is an alternative organization, which is as follows:
38 @verbatim
39                  __________
40                 |          |
41                 |  router  |
42                 |__________|
43                     / | @
44                    /  |  @
45                l0 / l1|   @l2
46                  /    |    @
47                 /     |     @
48             host0   host1   host2
49 @endverbatim
50
51 The principle is the same, except that there is no backbone. This representation
52 can be obtained easily: just do not set the bb_* attributes.
53
54
55 Attribute name  | Mandatory | Values | Description
56 --------------- | --------- | ------ | -----------
57 id              | yes       | string | The identifier of the cluster. Facilitates referring to this cluster.
58 prefix          | yes       | string | Each node of the cluster has to have a name. This name will be prefixed with this prefix.
59 suffix          | yes       | string | Each node of the cluster will be suffixed with this suffix
60 radical         | yes       | string | Regexp used to generate cluster nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names.
61 speed           | yes       | int    | Same as the ``speed`` attribute of the ``@<host@>`` tag.
62 core            | no        | int (default: 1) | Same as the ``core`` attribute of the ``@<host@>`` tag.
63 bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the @ref pf_tag_link "link section" for syntax/details.
64 lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
65 sharing_policy  | no        | string | Sharing policy for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
66 bb_bw           | no        | int    | Bandwidth for backbone (if any). See <b>link</b> section for syntax/details. If bb_bw and bb_lat (see below) attributes are omitted, no backbone is created (alternative cluster architecture <b>described before</b>).
67 bb_lat          | no        | int    | Latency for backbone (if any). See <b>link</b> section for syntax/details. If bb_lat and bb_bw (see above) attributes are omitted, no backbone is created (alternative cluster architecture <b>described before</b>).
68 bb_sharing_policy | no      | string | Sharing policy for the backbone (if any). See <b>link</b> section for syntax/details.
69 limiter_link      | no        | int    | Bandwidth for limiter link (if any). This adds a specific link for each node, to set the maximum bandwidth reached when communicating in both directions at the same time. In theory this value should be 2*bw for splitduplex links, but in reality this might be less. This value will depend heavily on the communication model, and on the cluster's hardware, so no default value can be set, this has to be measured. More details can be obtained in <a href="https://hal.inria.fr/hal-00919507/"> "Toward Better Simulation of MPI Applications on Ethernet/TCP Networks"</a>
70 loopback_bw       | no      | int    | Bandwidth for loopback (if any). See <b>link</b> section for syntax/details. If loopback_bw and loopback_lat (see below) attributes are omitted, no loopback link is created and all intra-node communication will use the main network link of the node. Loopback link is a @ref pf_sharing_policy_fatpipe "@b FATPIPE".
71 loopback_lat      | no      | int    | Latency for loopback (if any). See <b>link</b> section for syntax/details. See loopback_bw for more info.
72 topology          | no      | FLAT@|TORUS@|FAT_TREE@|DRAGONFLY (default: FLAT) | Network topology to use. SimGrid currently supports FLAT (with or without backbone, as described before), <a href="http://en.wikipedia.org/wiki/Torus_interconnect">TORUS </a>, FAT_TREE, and DRAGONFLY attributes for this tag.
73 topo_parameters   | no      | string | Specific parameters to pass for the topology defined in the topology tag. For torus networks, comma-separated list of the number of nodes in each dimension of the torus. Please refer to the specific documentation for @ref simgrid::kernel::routing::FatTreeZone "FatTree NetZone", @ref simgrid::kernel::routing::DragonflyZone "Dragonfly NetZone".
74
75
76 the router name is defined as the resulting String in the following
77 java line of code:
78
79 @verbatim
80 router_name = prefix + clusterId + "_router" + suffix;
81 @endverbatim
82
83
84 #### Cluster example ####
85
86 Consider the following two (and independent) uses of the ``cluster`` tag:
87
88 @verbatim
89 <cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
90          speed="1e9" bw="125e6" lat="5E-5"/>
91
92 <cluster id="my_cluster_2" prefix="c-" suffix=".me" radical="0-99"
93          speed="1e9" bw="125e6" lat="5E-5"
94          bb_bw="2.25e9" bb_lat="5E-4"/>
95 @endverbatim
96
97 The second example creates one router and 100 machines with the following names:
98 @verbatim
99 c-my_cluster_2_router.me
100 c-0.me
101 c-1.me
102 c-2.me
103 ...
104 c-99.me
105 @endverbatim
106
107 @subsubsection pf_cabinet &lt;cabinet&gt;
108
109 @note
110     This tag is only available when the routing mode of the network zone
111     is set to ``Cluster``.
112
113 The ``&lt;cabinet /&gt;`` tag is, like the @ref pf_tag_cluster "&lt;cluster&gt;" tag,
114 a meta-tag. This means that it is simply a shortcut for creating a set of (homogeneous) hosts and links quickly;
115 unsurprisingly, this tag was introduced to setup cabinets in data centers quickly. Unlike
116 &lt;cluster&gt;, however, the &lt;cabinet&gt; assumes that you create the backbone
117 and routers yourself; see our examples below.
118
119 #### Attributes ####
120
121 Attribute name  | Mandatory | Values | Description
122 --------------- | --------- | ------ | -----------
123 id              | yes       | string | The identifier of the cabinet. Facilitates referring to this cluster.
124 prefix          | yes       | string | Each node of the cabinet has to have a name. This name will be prefixed with this prefix.
125 suffix          | yes       | string | Each node of the cabinet will be suffixed with this suffix
126 radical         | yes       | string | Regexp used to generate cabinet nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names.
127 speed           | yes       | int    | Same as the ``speed`` attribute of the @ref pf_tag_host "&lt;host&gt;" tag.
128 bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the @ref pf_tag_link "link section" for syntax/details.
129 lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See the @ref pf_tag_link "link section" for syntax/details.
130
131 @note
132     Please note that as of now, it is impossible to change attributes such as,
133     amount of cores (always set to 1), the sharing policy of the links (always set to @ref pf_sharing_policy_splitduplex "SPLITDUPLEX").
134
135 #### Example ####
136
137 The following example was taken from ``examples/platforms/meta_cluster.xml`` and
138 shows how to use the cabinet tag.
139
140 @verbatim
141   <zone  id="my_cluster1"  routing="Cluster">
142     <cabinet id="cabinet1" prefix="host-" suffix=".cluster1"
143       speed="1Gf" bw="125MBps" lat="100us" radical="1-10"/>
144     <cabinet id="cabinet2" prefix="host-" suffix=".cluster1"
145       speed="1Gf" bw="125MBps" lat="100us" radical="11-20"/>
146     <cabinet id="cabinet3" prefix="host-" suffix=".cluster1"
147       speed="1Gf" bw="125MBps" lat="100us" radical="21-30"/>
148
149     <backbone id="backbone1" bandwidth="2.25GBps" latency="500us"/>
150   </zone>
151 @endverbatim
152
153 @note
154    Please note that you must specify the @ref pf_backbone "&lt;backbone&gt;"
155    tag by yourself; this is not done automatically and there are no checks
156    that ensure this backbone was defined.
157
158 The hosts generated in the above example are named host-1.cluster, host-2.cluster1
159 etc.
160
161
162 @subsection pf_ne Network equipment
163
164 There are two tags at all times available to represent network entities and
165 several other tags that are available only in certain contexts.
166 1. ``<link>``: Represents an entity that has a limited bandwidth, a
167     latency, and that can be shared according to TCP way to share this
168     bandwidth.
169 @remark
170   The concept of links in SimGrid may not be intuitive, as links are not
171   limited to connecting (exactly) two entities; in fact, you can have more than
172   two equipments connected to it. (In graph theoretical terms: A link in
173   SimGrid is not an edge, but a hyperedge)
174
175 2. ``<router/>``: Represents an entity that a message can be routed
176     to, but that is unable to execute any code. In SimGrid, routers have also
177     no impact on the performance: Routers do not limit any bandwidth nor
178     do they increase latency. As a matter of fact, routers are (almost) ignored
179     by the simulator when the simulation has begun.
180
181 3. ``<backbone/>``: This tag is only available when the containing network zone is
182                     used as a cluster (i.e., mode="Cluster")
183
184 @remark
185     If you want to represent an entity like a switch, you must use ``<link>`` (see section). Routers are used
186     to run some routing algorithm and determine routes (see Section @ref pf_routing for details).
187
188 @subsubsection pf_backbone <backbone/>
189
190 @note
191   This tag is <b>only available</b> when the containing network zone uses the "Cluster" routing mode!
192
193 Using this tag, you can designate an already existing link to be a backbone.
194
195 Attribute name  | Mandatory | Values | Description
196 --------------- | --------- | ------ | -----------
197 id              | yes       | string | Name of the link that is supposed to act as a backbone.
198
199 @subsection pf_storage Storage
200
201 @note
202   This is a prototype version that should evolve quickly, hence this
203   is just some doc valuable only at the time of writing.
204   This section describes the storage management under SimGrid ; nowadays
205   it's only usable with MSG. It relies basically on linux-like concepts.
206   You also may want to have a look to its corresponding section in 
207   @ref msg_file ; access functions are organized as a POSIX-like
208   interface.
209
210
211 @section pf_routing Routing
212
213 To achieve high performance, the routing tables used within SimGrid are
214 static. This means that routing between two nodes is calculated once
215 and will not change during execution. The SimGrid team chose to use this
216 approach as it is rare to have a real deficiency of a resource;
217 most of the time, a communication fails because the links experience too much
218 congestion and hence, your connection stops before the timeout or
219 because the computer designated to be the destination of that message
220 is not responding.
221
222 We also chose to use shortest paths algorithms in order to emulate
223 routing. Doing so is consistent with the reality: [RIP](https://en.wikipedia.org/wiki/Routing_Information_Protocol),
224 [OSPF](https://en.wikipedia.org/wiki/Open_Shortest_Path_First), [BGP](https://en.wikipedia.org/wiki/Border_Gateway_Protocol)
225 are all calculating shortest paths. They do require some time to converge, but
226 eventually, when the routing tables have stabilized, your packets will follow
227 the shortest paths.
228
229 @subsection  pf_tag_zone &lt;zone&gt;
230
231 @subsection pf_rm Routing models
232
233 For each network zone, you must define explicitly which routing model will
234 be used. There are 3 different categories for routing models:
235
236 1. @ref pf_routing_model_shortest_path "Shortest-path" based models: SimGrid calculates shortest
237    paths and manages them. Behaves more or less like most real life
238    routing mechanisms.
239 2. @ref pf_routing_model_manual "Manually-entered" route models: you have to define all routes
240    manually in the platform description file; this can become
241    tedious very quickly, as it is very verbose.
242    Consistent with some manually managed real life routing.
243 3. @ref pf_routing_model_simple "Simple/fast models": those models offer fast, low memory routing
244    algorithms. You should consider to use this type of model if 
245    you can make some assumptions about your network zone.
246    Routing in this case is more or less ignored.
247
248 @subsubsection pf_raf The router affair
249
250 Using routers becomes mandatory when using shortest-path based
251 models or when using the bindings to the ns-3 packet-level
252 simulator instead of the native analytical network model implemented
253 in SimGrid.
254
255 For graph-based shortest path algorithms, routers are mandatory, because these
256 algorithms require a graph as input and so we need to have source and
257 destination for each edge.
258
259 Routers are naturally an important concept ns-3 since the
260 way routers run the packet routing algorithms is actually simulated.
261 SimGrid's analytical models however simply aggregate the routing time
262 with the transfer time. 
263
264 So why did we incorporate routers in SimGrid? Rebuilding a graph representation
265 only from the route information turns out to be a very difficult task, because
266 of the missing information about how routes intersect. That is why we
267 introduced routers, which are simply used to express these intersection points.
268 It is important to understand that routers are only used to provide topological
269 information.
270
271 To express this topological information, a <b>route</b> has to be
272 defined in order to declare which link is connected to a router. 
273
274
275 @subsubsection pf_routing_model_shortest_path Shortest-path based models
276
277 The following table shows all the models that compute routes using
278 shortest-paths algorithms are currently available in SimGrid. More detail on how
279 to choose the best routing model is given in the Section called @"@ref pf_routing_howto_choose_wisely@".
280
281 | Name                                                | Description                                                                |
282 | --------------------------------------------------- | -------------------------------------------------------------------------- |
283 | @ref pf_routing_model_floyd "Floyd"                 | Floyd routing data. Pre-calculates all routes once                         |
284 | @ref pf_routing_model_dijkstra "Dijkstra"           | Dijkstra routing data. Calculates routes only when needed                  |
285 | @ref pf_routing_model_dijkstracache "DijkstraCache" | Dijkstra routing data. Handles some cache for already calculated routes.   |
286
287 All those shortest-path models are instantiated in the same way and are
288 completely interchangeable. Here are some examples:
289
290 @anchor pf_routing_model_floyd
291 ### Floyd ###
292
293 Floyd example:
294 @verbatim
295 <zone  id="zone0"  routing="Floyd">
296
297   <cluster id="my_cluster_1" prefix="c-" suffix=""
298            radical="0-1" speed="1000000000" bw="125000000" lat="5E-5"
299            router_id="router1"/>
300
301   <zone id="zone1" routing="None">
302     <host id="host1" speed="1000000000"/>
303   </zone>
304
305   <link id="link1" bandwidth="100000" latency="0.01"/>
306
307   <zoneroute src="my_cluster_1" dst="zone1"
308     gw_src="router1"
309     gw_dst="host1">
310     <link_ctn id="link1"/>
311   </zoneroute>
312
313 </zone>
314 @endverbatim
315
316 zoneroute given at the end gives a topological information: link1 is
317 between router1 and host1.
318
319 #### Example platform files ####
320
321 This is an automatically generated list of example files that use the Floyd
322 routing model (the path is given relative to SimGrid's source directory)
323
324 @verbinclude example_filelist_routing_floyd
325
326 @anchor pf_routing_model_dijkstra
327 ### Dijkstra ###
328
329 #### Example platform files ####
330
331 This is an automatically generated list of example files that use the Dijkstra
332 routing model (the path is given relative to SimGrid's source directory)
333
334 @verbinclude example_filelist_routing_dijkstra
335
336 Dijkstra example:
337 @verbatim
338  <zone id="zone_2" routing="Dijkstra">
339      <host id="zone_2_host1" speed="1000000000"/>
340      <host id="zone_2_host2" speed="1000000000"/>
341      <host id="zone_2_host3" speed="1000000000"/>
342      <link id="zone_2_link1" bandwidth="1250000000" latency="5E-4"/>
343      <link id="zone_2_link2" bandwidth="1250000000" latency="5E-4"/>
344      <link id="zone_2_link3" bandwidth="1250000000" latency="5E-4"/>
345      <link id="zone_2_link4" bandwidth="1250000000" latency="5E-4"/>
346      <router id="central_router"/>
347      <router id="zone_2_gateway"/>
348      <!-- routes providing topological information -->
349      <route src="central_router" dst="zone_2_host1"><link_ctn id="zone_2_link1"/></route>
350      <route src="central_router" dst="zone_2_host2"><link_ctn id="zone_2_link2"/></route>
351      <route src="central_router" dst="zone_2_host3"><link_ctn id="zone_2_link3"/></route>
352      <route src="central_router" dst="zone_2_gateway"><link_ctn id="zone_2_link4"/></route>
353   </zone>
354 @endverbatim
355
356 @anchor pf_routing_model_dijkstracache
357 ### DijkstraCache ###
358
359 DijkstraCache example:
360 @verbatim
361 <zone id="zone_2" routing="DijkstraCache">
362      <host id="zone_2_host1" speed="1000000000"/>
363      ...
364 (platform unchanged compared to upper example)
365 @endverbatim
366
367 #### Example platform files ####
368
369 This is an automatically generated list of example files that use the DijkstraCache
370 routing model (the path is given relative to SimGrid's source directory):
371
372 Editor's note: At the time of writing, no platform file used this routing model - so
373 if there are no example files listed here, this is likely to be correct.
374
375 @verbinclude example_filelist_routing_dijkstra_cache
376
377 @subsubsection pf_routing_model_manual Manually-entered route models
378
379 | Name                               | Description                                                                    |
380 | ---------------------------------- | ------------------------------------------------------------------------------ |
381 | @ref pf_routing_model_full "Full"  | You have to enter all necessary routers manually; that is, every single route. This may consume a lot of memory when the XML is parsed and might be tedious to write; i.e., this is only recommended (if at all) for small platforms. |
382
383 @anchor pf_routing_model_full
384 ### Full ###
385
386 Full example:
387 @verbatim
388 <zone  id="zone0"  routing="Full">
389    <host id="host1" speed="1000000000"/>
390    <host id="host2" speed="1000000000"/>
391    <link id="link1" bandwidth="125000000" latency="0.000100"/>
392    <route src="host1" dst="host2"><link_ctn id="link1"/></route>
393  </zone>
394 @endverbatim
395
396 #### Example platform files ####
397
398 This is an automatically generated list of example files that use the Full
399 routing model (the path is given relative to SimGrid's source directory):
400
401 @verbinclude example_filelist_routing_full
402
403 @subsubsection pf_routing_model_simple Simple/fast models
404
405 | Name                                     | Description                                                                                                                         |
406 | ---------------------------------------- | ------------------------------------------------------------------------------                                                      |
407 | @ref pf_routing_model_cluster "Cluster"  | This is specific to the @ref pf_tag_cluster "&lt;cluster/&gt;" tag and should not be used by the user, as several assumptions are made. |
408 | @ref pf_routing_model_none    "None"     | No routing at all. Unless you know what you're doing, avoid using this mode in combination with a non-constant network model.       |
409 | @ref pf_routing_model_vivaldi "Vivaldi"  | Perfect when you want to use coordinates. Also see the corresponding @ref pf_P2P_tags "P2P section" below.                          |
410
411 @anchor pf_routing_model_cluster
412 ### Cluster ###
413
414 @note
415  In this mode, the @ref pf_cabinet "&lt;cabinet/&gt;" tag is available.
416
417 #### Example platform files ####
418
419 This is an automatically generated list of example files that use the Cluster
420 routing model (the path is given relative to SimGrid's source directory):
421
422 @verbinclude example_filelist_routing_cluster
423
424 @anchor pf_routing_model_none
425
426 ### None ###
427
428 This model does exactly what it's name advertises: Nothing. There is no routing
429 available within this model and if you try to communicate within the zone that
430 uses this model, SimGrid will fail unless you have explicitly activated the
431 @ref options_model_select_network_constant "Constant Network Model" (this model charges
432 the same for every single communication). It should
433 be noted, however, that you can still attach an @ref pf_tag_zoneroute "ZoneRoute",
434 as is demonstrated in the example below:
435
436 @verbinclude platforms/cluster_and_one_host.xml
437
438 #### Example platform files ####
439
440 This is an automatically generated list of example files that use the None
441 routing model (the path is given relative to SimGrid's source directory):
442
443 @verbinclude example_filelist_routing_none
444
445
446 @anchor pf_routing_model_vivaldi
447 ### Vivaldi ###
448
449 For more information on how to use the [Vivaldi Coordinates](https://en.wikipedia.org/wiki/Vivaldi_coordinates),
450 see also Section @ref pf_P2P_tags "P2P tags".
451
452 Note that it is possible to combine the Vivaldi routing model with other routing models;
453 an example can be found in the file @c examples/platforms/cloud.xml. This
454 examples models a NetZone using Vivaldi that contains other NetZones that use different
455 routing models.
456
457 #### Example platform files ####
458
459 This is an automatically generated list of example files that use the None
460 routing model (the path is given relative to SimGrid's source directory):
461
462 @verbinclude example_filelist_routing_vivaldi
463
464
465 @subsection ps_dec Defining routes
466
467 There are currently four different ways to define routes: 
468
469 | Name                                              | Description                                                                         |
470 | ------------------------------------------------- | ----------------------------------------------------------------------------------- |
471 | @ref pf_tag_route "route"                 | Used to define route between host/router                                            |
472 | @ref pf_tag_zoneroute "zoneRoute"             | Used to define route between different zones                                           |
473 | @ref pf_tag_bypassroute "bypassRoute"     | Used to supersede normal routes as calculated by the network model between host/router; e.g., can be used to use a route that is not the shortest path for any of the shortest-path routing models. |
474 | @ref pf_tag_bypassasroute "bypassZoneRoute"  | Used in the same way as bypassRoute, but for zones                                     |
475
476 Basically all those tags will contain an (ordered) list of references
477 to link that compose the route you want to define.
478
479 Consider the example below:
480
481 @verbatim
482 <route src="Alice" dst="Bob">
483         <link_ctn id="link1"/>
484         <link_ctn id="link2"/>
485         <link_ctn id="link3"/>
486 </route>
487 @endverbatim
488
489 The route here from host Alice to Bob will be first link1, then link2,
490 and finally link3. What about the reverse route? @ref pf_tag_route "Route" and
491 @ref pf_tag_zoneroute "zoneroute" have an optional attribute @c symmetrical, that can
492 be either @c YES or @c NO. @c YES means that the reverse route is the same
493 route in the inverse order, and is set to @c YES by default. Note that
494 this is not the case for bypass*Route, as it is more probable that you
495 want to bypass only one default route.
496
497 For an @ref pf_tag_zoneroute "zoneroute", things are just slightly more complicated, as you have
498 to give the id of the gateway which is inside the zone you want to access ... 
499 So it looks like this:
500
501 @verbatim
502 <zoneroute src="zone1" dst="zone2"
503   gw_src="router1" gw_dst="router2">
504   <link_ctn id="link1"/>
505 </zoneroute>
506 @endverbatim
507
508 gw == gateway, so when any message are trying to go from zone1 to zone2,
509 it means that it must pass through router1 to get out of the zone, then
510 pass through link1, and get into zone2 by being received by router2.
511 router1 must belong to zone1 and router2 must belong to zone2.
512
513 @subsubsection pf_tag_zoneroute &lt;zoneRoute&gt;
514
515 The purpose of this entity is to define a route between two
516 NetZones. Recall that all zones form a tree, so to connect two
517 sibling zones, you must give such a zoneRoute specifying the source
518 and destination zones, along with the gateway in each zone (ie, the
519 point to reach within that zone to reach the netzone), and the list of
520 links in the ancestor zone to go from one zone to another.
521
522 So, to go from a host @c src_host that is within zone @c src, to a
523 host @c dst_host that is within @c dst, you need to:
524
525  - move within zone @c src, from @c src_host to the specified @c gw_src;
526  - traverse all links specified by the zoneRoute (they are supposed to be within the common ancestor);
527  - move within zone @c dst, from @c gw_dst to @c dst_host.
528
529 #### Attributes ####
530
531 | Attribute name  | Mandatory | Values | Description                                                                                                                                |
532 | --------------- | --------- | ------ | -----------                                                                                                                                |
533 | src             | yes       | String | The identifier of the source zone                                                                                                            |
534 | dst             | yes       | String | See the @c src attribute                                                                                                                   |
535 | gw_src          | yes       | String | The gateway that will be used within the src zone; this can be any @ref pf_tag_host "Host" or @ref pf_router "Router" defined within the src zone. |
536 | gw_dst          | yes       | String | Same as @c gw_src, but with the dst zone instead.                                                                                            |
537 | symmetrical     | no        | YES@|NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly.               | 
538
539 #### Example ####
540
541 @verbatim
542 <zone  id="zone0"  routing="Full">
543   <cluster id="my_cluster_1" prefix="c-" suffix=".me"
544                 radical="0-149" speed="1000000000" bw="125000000" lat="5E-5"
545         bb_bw="2250000000" bb_lat="5E-4"/>
546
547   <cluster id="my_cluster_2" prefix="c-" suffix=".me"
548     radical="150-299" speed="1000000000" bw="125000000" lat="5E-5"
549     bb_bw="2250000000" bb_lat="5E-4"/>
550
551      <link id="backbone" bandwidth="1250000000" latency="5E-4"/>
552
553      <zoneroute src="my_cluster_1" dst="my_cluster_2"
554          gw_src="c-my_cluster_1_router.me"
555          gw_dst="c-my_cluster_2_router.me">
556                 <link_ctn id="backbone"/>
557      </zoneroute>
558      <zoneroute src="my_cluster_2" dst="my_cluster_1"
559          gw_src="c-my_cluster_2_router.me"
560          gw_dst="c-my_cluster_1_router.me">
561                 <link_ctn id="backbone"/>
562      </zoneroute>
563 </zone>
564 @endverbatim
565
566 @subsubsection pf_tag_route &lt;route&gt; 
567
568 The principle is the same as for 
569 @ref pf_tag_zoneroute "ZoneRoute": The route contains a list of links that
570 provide a path from @c src to @c dst. Here, @c src and @c dst can both be either a 
571 @ref pf_tag_host "host" or @ref pf_router "router".  This is mostly useful for the 
572 @ref pf_routing_model_full "Full routing model" as well as for the 
573 @ref pf_routing_model_shortest_path "shortest-paths" based models (as they require 
574 topological information).
575
576
577 | Attribute name  | Mandatory | Values                 | Description                                                                                        |
578 | --------------- | --------- | ---------------------- | -----------                                                                                        |
579 | src             | yes       | String                 | The value given to the source's "id" attribute                                                     |
580 | dst             | yes       | String                 | The value given to the destination's "id" attribute.                                               |
581 | symmetrical     | no        | YES@| NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly. |
582
583
584 #### Examples ####
585
586 A route in the @ref pf_routing_model_full "Full routing model" could look like this:
587 @verbatim
588  <route src="Tremblay" dst="Bourassa">
589      <link_ctn id="4"/><link_ctn id="3"/><link_ctn id="2"/><link_ctn id="0"/><link_ctn id="1"/><link_ctn id="6"/><link_ctn id="7"/>
590  </route>
591 @endverbatim
592
593 A route in the @ref pf_routing_model_shortest_path "Shortest-Path routing model" could look like this:
594 @verbatim
595 <route src="Tremblay" dst="Bourassa">
596   <link_ctn id="3"/>
597 </route>
598 @endverbatim
599 @note 
600     You must only have one link in your routes when you're using them to provide
601     topological information, as the routes here are simply the edges of the
602     (network-)graph and the employed algorithms need to know which edge connects
603     which pair of entities.
604
605 @subsubsection pf_tag_bypassasroute bypasszoneroute
606
607 As said before, once you choose
608 a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to
609 define some of your routes, which will be specific. You may also want
610 to bypass some routes defined in lower level zone at an upper stage:
611 <b>bypasszoneroute</b> is the tag you're looking for. It allows one to
612 bypass routes defined between already defined between zone (if you want
613 to bypass route for a specific host, you should just use byPassRoute).
614 The principle is the same as zoneroute: <b>bypasszoneroute</b> contains
615 list of links that are in the path between src and dst.
616
617 #### Attributes ####
618
619 | Attribute name  | Mandatory | Values                  | Description                                                                                                  |
620 | --------------- | --------- | ----------------------  | -----------                                                                                                  |
621 | src             | yes       | String                  | The value given to the source zone's "id" attribute                                                            |
622 | dst             | yes       | String                  | The value given to the destination zone's "id" attribute.                                                      |
623 | gw_src          | yes       | String                  | The value given to the source gateway's "id" attribute; this can be any host or router within the src zone     |
624 | gw_dst          | yes       | String                  | The value given to the destination gateway's "id" attribute; this can be any host or router within the dst zone|
625 | symmetrical     | no        | YES@| NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly. |
626
627 #### Example ####
628
629 @verbatim
630 <bypasszoneRoute src="my_cluster_1" dst="my_cluster_2"
631   gw_src="my_cluster_1_router"
632   gw_dst="my_cluster_2_router">
633     <link_ctn id="link_tmp"/>
634 </bypasszoneroute>
635 @endverbatim
636
637 This example shows that link @c link_tmp (definition not displayed here) directly
638 connects the router @c my_cluster_1_router in the source cluster to the router
639 @c my_cluster_2_router in the destination router. Additionally, as the @c symmetrical
640 attribute was not given, this route is presumed to be symmetrical.
641
642 @subsubsection pf_tag_bypassroute bypassRoute
643
644 As said before, once you choose
645 a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to
646 define some of your routes, which will be specific. You may also want
647 to bypass some routes defined in lower level zone at an upper stage:
648 <b>bypassRoute</b> is the tag you're looking for. It allows one to bypass
649 routes defined between <b>host/router</b>. The principle is the same
650 as route: <b>bypassRoute</b> contains list of links references of
651 links that are in the path between src and dst.
652
653 #### Attributes ####
654
655 | Attribute name  | Mandatory | Values                  | Description                                                                                                  |
656 | --------------- | --------- | ----------------------  | -----------                                                                                                  |
657 | src             | yes       | String                  | The value given to the source zone's "id" attribute                                                            |
658 | dst             | yes       | String                  | The value given to the destination zone's "id" attribute.                                                      |
659 | symmetrical     | no        | YES @| NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly. |
660
661 #### Examples ####
662
663 @verbatim
664 <bypassRoute src="host_1" dst="host_2">
665    <link_ctn id="link_tmp"/>
666 </bypassRoute>
667 @endverbatim
668
669 This example shows that link @c link_tmp (definition not displayed here) directly
670 connects host @c host_1 to host @c host_2. Additionally, as the @c symmetrical
671 attribute was not given, this route is presumed to be symmetrical.
672
673 @subsection pb_baroex Basic Routing Example
674
675 Let's say you have a zone named zone_Big that contains two other zones, zone_1
676 and zone_2. If you want to make a host (h1) from zone_1 with another one
677 (h2) from zone_2 then you'll have to proceed as follows:
678 @li First, you have to ensure that a route is defined from h1 to the
679     zone_1's exit gateway and from h2 to zone_2's exit gateway.
680 @li Then, you'll have to define a route between zone_1 to zone_2. As those
681     zone are both resources belonging to zone_Big, then it has to be done
682     at zone_big level. To define such a route, you have to give the
683     source zone (zone_1), the destination zone (zone_2), and their respective
684     gateway (as the route is effectively defined between those two
685     entry/exit points). Elements of this route can only be elements
686     belonging to zone_Big, so links and routers in this route should be
687     defined inside zone_Big. If you choose some shortest-path model,
688     this route will be computed automatically.
689
690 As said before, there are mainly 2 tags for routing:
691 @li <b>zoneroute</b>: to define routes between two  <b>zone</b>
692 @li <b>route</b>: to define routes between two <b>host/router</b>
693
694 As we are dealing with routes between zone, it means that those we'll
695 have some definition at zone_Big level. Let consider zone_1 contains 1
696 host, 1 link and one router and zone_2 3 hosts, 4 links and one router.
697 There will be a central router, and a cross-like topology. At the end
698 of the crosses arms, you'll find the 3 hosts and the router that will
699 act as a gateway. We have to define routes inside those two zone. Let
700 say that zone_1 contains full routes, and zone_2 contains some Floyd
701 routing (as we don't want to bother with defining all routes). As
702 we're using some shortest path algorithms to route into zone_2, we'll
703 then have to define some <b>route</b> to gives some topological
704 information to SimGrid. Here is a file doing it all:
705
706 @verbatim
707 <zone  id="zone_Big"  routing="Dijkstra">
708   <zone id="zone_1" routing="Full">
709      <host id="zone_1_host1" speed="1000000000"/>
710      <link id="zone_1_link" bandwidth="1250000000" latency="5E-4"/>
711      <router id="zone_1_gateway"/>
712      <route src="zone_1_host1" dst="zone_1_gateway">
713             <link_ctn id="zone_1_link"/>
714      </route>
715   </zone>
716   <zone id="zone_2" routing="Floyd">
717      <host id="zone_2_host1" speed="1000000000"/>
718      <host id="zone_2_host2" speed="1000000000"/>
719      <host id="zone_2_host3" speed="1000000000"/>
720      <link id="zone_2_link1" bandwidth="1250000000" latency="5E-4"/>
721      <link id="zone_2_link2" bandwidth="1250000000" latency="5E-4"/>
722      <link id="zone_2_link3" bandwidth="1250000000" latency="5E-4"/>
723      <link id="zone_2_link4" bandwidth="1250000000" latency="5E-4"/>
724      <router id="central_router"/>
725      <router id="zone_2_gateway"/>
726      <!-- routes providing topological information -->
727      <route src="central_router" dst="zone_2_host1"><link_ctn id="zone_2_link1"/></route>
728      <route src="central_router" dst="zone_2_host2"><link_ctn id="zone_2_link2"/></route>
729      <route src="central_router" dst="zone_2_host3"><link_ctn id="zone_2_link3"/></route>
730      <route src="central_router" dst="zone_2_gateway"><link_ctn id="zone_2_link4"/></route>
731   </zone>
732     <link id="backbone" bandwidth="1250000000" latency="5E-4"/>
733
734      <zoneroute src="zone_1" dst="zone_2"
735          gw_src="zone_1_gateway"
736          gw_dst="zone_2_gateway">
737                 <link_ctn id="backbone"/>
738      </zoneroute>
739 </zone>
740 @endverbatim
741
742 @section pf_other Other tags
743
744 The following tags can be used inside a @<platform@> tag even if they are not
745 directly describing the platform:
746
747   - @ref pf_tag_config passes configuration options, e.g. to change the network model;
748   - @ref pf_tag_prop gives user-defined properties to various elements
749
750 @subsection pf_trace trace and trace_connect
751
752 Both tags are an alternate way to pass files containing information on
753 availability, state etc. to an entity. (See also @ref howto_churn).
754 Instead of referring to the file directly in the host, link, or
755 cluster tag, you proceed by defining a trace with an id corresponding
756 to a file, later a host/link/cluster, and finally using trace_connect
757 you say that the file trace must be used by the entity.
758
759
760 #### Example #### 
761
762 @verbatim
763 <zone  id="zone0"  routing="Full">
764   <host id="bob" speed="1000000000"/>
765 </zone>
766 <trace id="myTrace" file="bob.trace" periodicity="1.0"/>
767 <trace_connect trace="myTrace" element="bob" kind="POWER"/>
768 @endverbatim
769
770 @note 
771     The order here is important.  @c trace_connect must come 
772     after the elements @c trace and @c host, as both the host
773     and the trace definition must be known when @c trace_connect
774     is parsed; the order of @c trace and @c host is arbitrary.
775
776
777 #### @c trace attributes ####
778
779
780 | Attribute name  | Mandatory | Values                 | Description                                                                                       |
781 | --------------- | --------- | ---------------------- | -----------                                                                                       |
782 | id              | yes       | String                 | Identifier of this trace; this is the name you pass on to @c trace_connect.                       |
783 | file            | no        | String                 | Filename of the file that contains the information - the path must follow the style of your OS. You can omit this, but then you must specify the values inside of &lt;trace&gt; and &lt;/trace&gt; - see the example below. |
784 | trace_periodicity | yes | String | This is the same as for @ref pf_tag_host "hosts" (see there for details) |
785
786 Here is an example  of trace when no file name is provided:
787
788 @verbatim
789  <trace id="myTrace" periodicity="1.0">
790     0.0 1.0
791     11.0 0.5
792     20.0 0.8
793  </trace>
794 @endverbatim
795
796 #### @c trace_connect attributes ####
797
798 | Attribute name  | Mandatory | Values                 | Description                                                                                       |
799 | --------------- | --------- | ---------------------- | -----------                                                                                       |
800 | kind            | no        | HOST_AVAIL@|POWER@|<br/>LINK_AVAIL@|BANDWIDTH@|LATENCY (Default: HOST_AVAIL)   | Describes the kind of trace.                   |
801 | trace           | yes       | String                 | Identifier of the referenced trace (specified of the trace's @c id attribute)                     |
802 | element         | yes       | String                 | The identifier of the referenced entity as given by its @c id attribute                           |
803
804 @section pf_hints Hints, tips and frequently requested features
805
806 Now you should know at least the syntax and be able to create a
807 platform by your own. However, after having ourselves wrote some platforms, there
808 are some best practices you should pay attention to in order to
809 produce good platform and some choices you can make in order to have
810 faster simulations. Here's some hints and tips, then.
811
812 @subsection pf_hints_search Finding the platform example that you need
813
814 Most platform files that we ship are in the @c examples/platforms
815 folder. The good old @c grep tool can find the examples you need when
816 wondering on a specific XML tag. Here is an example session searching
817 for @ref pf_trace "trace_connect":
818
819 @verbatim
820 % cd examples/platforms
821 % grep -R -i -n --include="*.xml" "trace_connect" .
822 ./two_hosts_platform_with_availability_included.xml:26:<trace_connect kind="SPEED" trace="A" element="Cpu A"/>
823 ./two_hosts_platform_with_availability_included.xml:27:<trace_connect kind="HOST_AVAIL" trace="A_failure" element="Cpu A"/>
824 ./two_hosts_platform_with_availability_included.xml:28:<trace_connect kind="SPEED" trace="B" element="Cpu B"/>
825 ./two_hosts.xml:17:  <trace_connect trace="Tremblay_power" element="Tremblay" kind="SPEED"/>
826 @endverbatim
827
828 @subsection pf_hint_generating How to generate different platform files?
829
830 This is actually a good idea to search for a better platform file,
831 that better fit the need of your study. To be honest, the provided
832 examples are not representative of anything. They exemplify our XML
833 syntax, but that's all. small_platform.xml for example was generated
834 without much thought beyond that.
835
836 The best thing to do when possible is to write your own platform file,
837 that model the platform on which you run your code. For that, you
838 could use <a href="https://gitlab.inria.fr/simgrid/platform-calibration">our
839 calibration scripts</a>. This leads to very good fits between the
840 platform, the model and the needs.  The g5k.xml example resulted of
841 such an effort, which also lead to <a href="https://github.com/lpouillo/topo5k/">an 
842 ongoing attempt</a> to automatically extract the SimGrid platform from
843 the <a href="http://grid5000.fr/">Grid'5000</a> experimental platform.
844 But it's hard to come up with generic models. Don't take these files
845 too seriously. Actually, you should always challenge our models and
846 your instantiation if the accuracy really matters to you (see <a
847 href="https://hal.inria.fr/hal-00907887">this discussion</a>).
848
849 But such advices only hold if you have a real platform and a real
850 application at hand. It's moot for more abstract studies working on
851 ideas and algorithms instead of technical artefacts. Well, in this
852 case, there unfortunately is nothing better than this old and rusty
853 <a href="http://pda.gforge.inria.fr/tools/download.html">simulacrum</a>.
854 This project is dormant since over 10 years (and you will have to
855 update the generated platforms with <tt>bin/simgrid_update_xml</tt> to
856 use them), but that's the best we have for this right now....
857
858 @subsection pf_zone_h Zone Hierarchy
859 The network zone design allows SimGrid to go fast, because computing route is
860 done only for the set of resources defined in the current zone. If you're using
861 only a big zone containing all resource with no zone into it and you're
862 using Full model, then ... you'll loose all interest into it. On the
863 other hand, designing a binary tree of zone with, at the lower level,
864 only one host, then you'll also loose all the good zone hierarchy can
865 give you. Remind you should always be "reasonable" in your platform
866 definition when choosing the hierarchy. A good choice if you try to
867 describe a real life platform is to follow the zone described in
868 reality, since this kind of trade-off works well for real life
869 platforms.
870
871 @subsection pf_exit_zone Exit Zone: why and how
872 Users that have looked at some of our platforms may have notice a
873 non-intuitive schema ... Something like that:
874
875
876 @verbatim
877 <zone id="zone_4"  routing="Full">
878 <zone id="exitzone_4"  routing="Full">
879         <router id="router_4"/>
880 </zone>
881 <cluster id="cl_4_1" prefix="c_4_1-" suffix="" radical="1-20" speed="1000000000" bw="125000000" lat="5E-5" bb_bw="2250000000" bb_lat="5E-4"/>
882 <cluster id="cl_4_2" prefix="c_4_2-" suffix="" radical="1-20" speed="1000000000" bw="125000000" lat="5E-5" bb_bw="2250000000" bb_lat="5E-4"/>
883 <link id="4_1" bandwidth="2250000000" latency="5E-5"/>
884 <link id="4_2" bandwidth="2250000000" latency="5E-5"/>
885 <link id="bb_4" bandwidth="2250000000" latency="5E-4"/>
886 <zoneroute src="cl_4_1"
887         dst="cl_4_2"
888         gw_src="c_4_1-cl_4_1_router"
889         gw_dst="c_4_2-cl_4_2_router">
890                 <link_ctn id="4_1"/>
891                 <link_ctn id="bb_4"/>
892                 <link_ctn id="4_2"/>
893 </zoneroute>
894 <zoneroute src="cl_4_1"
895         dst="exitzone_4"
896         gw_src="c_4_1-cl_4_1_router"
897         gw_dst="router_4">
898                 <link_ctn id="4_1"/>
899                 <link_ctn id="bb_4"/>
900 </zoneroute>
901 <zoneroute src="cl_4_2"
902         dst="exitzone_4"
903         gw_src="c_4_2-cl_4_2_router"
904         gw_dst="router_4">
905                 <link_ctn id="4_2"/>
906                 <link_ctn id="bb_4"/>
907 </zoneroute>
908 </zone>
909 @endverbatim
910
911 In the zone_4, you have an exitzone_4 defined, containing only one router,
912 and routes defined to that zone from all other zone (as cluster is only a
913 shortcut for a zone, see cluster description for details). If there was
914 an upper zone, it would define routes to and from zone_4 with the gateway
915 router_4. It's just because, as we did not allowed (for performances
916 issues) to have routes from a zone to a single host/router, you have to
917 enclose your gateway, when you have zone included in your zone, within a
918 zone to define routes to it.
919
920 @subsection pf_P2P_tags P2P or how to use coordinates
921 SimGrid allows you to use some coordinated-based system, like vivaldi,
922 to describe a platform. The main concept is that you have some peers
923 that are located somewhere: this is the function of the
924 <b>coordinates</b> of the @<peer@> or @<host@> tag. There's nothing
925 complicated in using it, here is an example:
926
927 @verbatim
928 <?xml version='1.0'?>
929 <!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
930 <platform version="4">
931
932  <zone  id="zone0"  routing="Vivaldi">
933         <host id="100030591" coordinates="25.5 9.4 1.4" speed="1.5Gf" />
934         <host id="100036570" coordinates="-12.7 -9.9 2.1" speed="7.3Gf" />
935         ...
936         <host id="100429957" coordinates="17.5 6.7 18.8" speed="8.3Gf" />
937  </zone>
938 </platform>
939 @endverbatim
940
941 Coordinates are then used to calculate latency (in microseconds)
942 between two hosts by calculating the distance between the two hosts
943 coordinates with the following formula: distance( (x1, y1, z1), (x2,
944 y2, z2) ) = euclidian( (x1,y1), (x2,y2) ) + abs(z1) + abs(z2)
945
946 In other words, we take the euclidian distance on the two first
947 dimensions, and then add the absolute values found on the third
948 dimension. This may seem strange, but it was found to allow better
949 approximations of the latency matrices (see the paper describing
950 Vivaldi).
951
952 Note that the previous example defines a routing directly between hosts but it could be also used to define a routing between zone.
953 That is for example what is commonly done when using peers (see Section @ref pf_peer).
954 @verbatim
955 <?xml version='1.0'?>
956 <!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
957 <platform version="4">
958
959  <zone  id="zone0"  routing="Vivaldi">
960    <peer id="peer-0" coordinates="173.0 96.8 0.1" speed="730Mf" bw_in="13.38MBps" bw_out="1.024MBps" lat="500us"/>
961    <peer id="peer-1" coordinates="247.0 57.3 0.6" speed="730Mf" bw_in="13.38MBps" bw_out="1.024MBps" lat="500us" />
962    <peer id="peer-2" coordinates="243.4 58.8 1.4" speed="730Mf" bw_in="13.38MBps" bw_out="1.024MBps" lat="500us" />
963 </zone>
964 </platform>
965 @endverbatim
966 In such a case though, we connect the zone created by the <b>peer</b> tag with the Vivaldi routing mechanism.
967 This means that to route between zone1 and zone2, it will use the coordinates of router_zone1 and router_zone2.
968 This is currently a convention and we may offer to change this convention in the DTD later if needed.
969 You may have noted that conveniently, a peer named FOO defines a zone named FOO and a router named router_FOO, which is why it works seamlessly with the <b>peer</b> tag.
970
971
972 @subsection pf_routing_howto_choose_wisely Choosing wisely the routing model to use
973
974
975 Choosing wisely the routing model to use can significantly fasten your
976 simulation/save your time when writing the platform/save tremendous
977 disk space. Here is the list of available model and their
978 characteristics (lookup: time to resolve a route):
979
980 @li <b>Full</b>: Full routing data (fast, large memory requirements,
981     fully expressive)
982 @li <b>Floyd</b>: Floyd routing data (slow initialization, fast
983     lookup, lesser memory requirements, shortest path routing only).
984     Calculates all routes at once at the beginning.
985 @li <b>Dijkstra</b>: Dijkstra routing data (fast initialization, slow
986     lookup, small memory requirements, shortest path routing only).
987     Calculates a route when necessary.
988 @li <b>DijkstraCache</b>: Dijkstra routing data (fast initialization,
989     fast lookup, small memory requirements, shortest path routing
990     only). Same as Dijkstra, except it handles a cache for latest used
991     routes.
992 @li <b>None</b>: No routing (usable with Constant network only).
993     Defines that there is no routes, so if you try to determine a
994     route without constant network within this zone, SimGrid will raise
995     an exception.
996 @li <b>Vivaldi</b>: Vivaldi routing, so when you want to use coordinates
997 @li <b>Cluster</b>: Cluster routing, specific to cluster tag, should
998     not be used.
999
1000 @subsection pf_loopback I want to specify the characteristics of the loopback link!
1001
1002 Each routing model automatically adds a loopback link for each declared host, i.e.,
1003 a network route from the host to itself, if no such route is declared in the XML
1004 file. This default link has a bandwidth of 498 Mb/s, a latency of 15 microseconds, 
1005 and is <b>not</b> shared among network flows. 
1006
1007 If you want to specify the characteristics of the loopback link for a given host, you
1008 just have to specify a route from this host to itself with the desired characteristics 
1009 in the XML file. This will prevent the routing model to add and use the default 
1010 loopback link.
1011
1012 @subsection pf_switch I want to describe a switch but there is no switch tag!
1013
1014 Actually we did not include switch tag. But when you're trying to
1015 simulate a switch, assuming 
1016 fluid bandwidth models are used (which SimGrid uses by default unless 
1017 ns-3 or constant network models are activated), the limiting factor is
1018 switch backplane bandwidth. So, essentially, at least from
1019 the simulation perspective, a switch is similar to a
1020 link: some device that is traversed by flows and with some latency and
1021 so,e maximum bandwidth. Thus, you can simply simulate a switch as a
1022 link. Many links
1023 can be connected to this "switch", which is then included in routes just
1024 as a normal link.
1025
1026
1027 @subsection pf_multicabinets I want to describe multi-cabinets clusters!
1028
1029 You have several possibilities, as usual when modeling things. If your
1030 cabinets are homogeneous and the intercabinet network negligible for
1031 your study, you should just create a larger cluster with all hosts at
1032 the same layer. 
1033
1034 In the rare case where your hosts are not homogeneous between the
1035 cabinets, you can create your cluster completely manually. For that,
1036 create an As using the Cluster routing, and then use one
1037 &lt;cabinet&gt; for each cabinet. This cabinet tag can only be used an
1038 As using the Cluster routing schema, and creating 
1039
1040 Be warned that creating a cluster manually from the XML with
1041 &lt;cabinet&gt;, &lt;backbone&gt; and friends is rather tedious. The
1042 easiest way to retrieve some control of your model without diving into
1043 the &lt;cluster&gt; internals is certainly to create one separate
1044 &lt;cluster&gt; per cabinet and interconnect them together. This is
1045 what we did in the G5K example platform for the Graphen cluster.
1046
1047 @subsection pf_platform_multipath I want to express multipath routing in platform files!
1048
1049 It is unfortunately impossible to express the fact that there is more
1050 than one routing path between two given hosts. Let's consider the
1051 following platform file:
1052
1053 @verbatim
1054 <route src="A" dst="B">
1055    <link_ctn id="1"/>
1056 </route>
1057 <route src="B" dst="C">
1058   <link_ctn id="2"/>
1059 </route>
1060 <route src="A" dst="C">
1061   <link_ctn id="3"/>
1062 </route>
1063 @endverbatim
1064
1065 Although it is perfectly valid, it does not mean that data traveling
1066 from A to C can either go directly (using link 3) or through B (using
1067 links 1 and 2). It simply means that the routing on the graph is not
1068 trivial, and that data do not following the shortest path in number of
1069 hops on this graph. Another way to say it is that there is no implicit
1070 in these routing descriptions. The system will only use the routes you
1071 declare (such as &lt;route src="A" dst="C"&gt;&lt;link_ctn
1072 id="3"/&gt;&lt;/route&gt;), without trying to build new routes by aggregating
1073 the provided ones.
1074
1075 You are also free to declare platform where the routing is not
1076 symmetrical. For example, add the following to the previous file:
1077
1078 @verbatim
1079 <route src="C" dst="A">
1080   <link_ctn id="2"/>
1081   <link_ctn id="1"/>
1082 </route>
1083 @endverbatim
1084
1085 This makes sure that data from C to A go through B where data from A
1086 to C go directly. Don't worry about realism of such settings since
1087 we've seen ways more weird situation in real settings (in fact, that's
1088 the realism of very regular platforms which is questionable, but
1089 that's another story).
1090
1091 */