X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/237fd22b56db7d1c67360c37559ce3aab16a002d..08248ff3fd5d0af80e6e5890ee2890a88057b744:/examples/python/clusters-multicpu/clusters-multicpu.py diff --git a/examples/python/clusters-multicpu/clusters-multicpu.py b/examples/python/clusters-multicpu/clusters-multicpu.py index 8184228620..b48cb38dd1 100644 --- a/examples/python/clusters-multicpu/clusters-multicpu.py +++ b/examples/python/clusters-multicpu/clusters-multicpu.py @@ -1,17 +1,19 @@ -# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved. +# Copyright (c) 2006-2023. The SimGrid Team. All rights 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. -# This example shows how to build a torus cluster with multi-core hosts. -# -# However, each leaf in the torus is a StarZone, composed of several CPUs -# -# Each actor runs in a specific CPU. One sender broadcasts a message to all receivers. +""" +This example shows how to build a torus cluster with multi-core hosts. + +However, each leaf in the torus is a StarZone, composed of several CPUs + +Each actor runs in a specific CPU. One sender broadcasts a message to all receivers. +""" -import simgrid import sys import typing +import simgrid class Sender: @@ -26,19 +28,19 @@ class Sender: # Actors that are created as object will execute their __call__ method. # So, the following constitutes the main function of the Sender actor. def __call__(self): - pending_comms = [] + pending_comms = simgrid.ActivitySet() mboxes = [] for host in self.hosts: msg = "Hello, I'm alive and running on " + simgrid.this_actor.get_host().name mbox = simgrid.Mailbox.by_name(host.name) mboxes.append(mbox) - pending_comms.append(mbox.put_async(msg, self.msg_size)) + pending_comms.push(mbox.put_async(msg, self.msg_size)) simgrid.this_actor.info("Done dispatching all messages") # Now that all message exchanges were initiated, wait for their completion in one single call - simgrid.Comm.wait_all(pending_comms) + pending_comms.wait_all() simgrid.this_actor.info("Goodbye now!") @@ -56,8 +58,9 @@ class Receiver: ##################################################################################################### -def create_hostzone(zone: simgrid.NetZone, coord: typing.List[int], ident: int) -> typing.Tuple[simgrid.NetPoint, simgrid.NetPoint]: - """ +def create_hostzone(zone: simgrid.NetZone, coord: typing.List[int], ident: int) -> typing.Tuple[simgrid.NetPoint, + simgrid.NetPoint]: + r""" Callback to set a cluster leaf/element In our example, each leaf if a StarZone, composed of 8 CPUs. @@ -98,17 +101,17 @@ def create_hostzone(zone: simgrid.NetZone, coord: typing.List[int], ident: int) host = host_zone.create_host(cpu_name, speed).seal() # the first CPU is the gateway if i == 0: - gateway = host + gateway = host.netpoint # create split-duplex link link = host_zone.create_split_duplex_link("link-" + cpu_name, link_bw) link.set_latency(link_lat).seal() # connecting CPU to outer world - host_zone.add_route(host.get_netpoint(), None, None, None, [ - simgrid.LinkInRoute(link, simgrid.LinkInRoute.Direction.UP)], True) + host_zone.add_route(host.netpoint, None, None, None, + [simgrid.LinkInRoute(link, simgrid.LinkInRoute.Direction.UP)], True) # seal newly created netzone host_zone.seal() - return host_zone.get_netpoint(), gateway.get_netpoint() + return host_zone.netpoint, gateway ##################################################################################################### @@ -119,8 +122,8 @@ def create_limiter(zone: simgrid.NetZone, coord: typing.List[int], ident: int) - The coord parameter depends on the cluster being created: - Torus: Direct translation of the Torus' dimensions, e.g. (0, 0, 0) for a 3-D Torus - - Fat-Tree: A pair (level in the tree, ident), e.g. (0, 0) for first leaf in the tree and (1,0) for the first switch at - level 1. + - Fat-Tree: A pair (level in the tree, ident), e.g. (0, 0) for first leaf in the tree and (1,0) for the first switch + at level 1. - Dragonfly: a tuple (group, chassis, blades/routers, nodes), e.g. (0, 0, 0, 0) for first node in the cluster. To identify the router inside a (group, chassis, blade), we use MAX_UINT in the last parameter (e.g. 0, 0, 0, 4294967295). @@ -169,14 +172,15 @@ def create_torus_cluster(): Cluster """ # create the torus cluster, 10Gbs link between elements in the cluster - simgrid.NetZone.create_torus_zone("cluster", None, [2, 2, 2], simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, 10e-6, + simgrid.NetZone.create_torus_zone("cluster", None, [2, 2, 2], + simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, 10e-6, simgrid.Link.SharingPolicy.SPLITDUPLEX).seal() ##################################################################################################### def create_fat_tree_cluster(): - """ + r""" Creates a Fat-Tree cluster Creates a Fat-Tree cluster with 2 levels and 6 nodes @@ -224,14 +228,15 @@ def create_fat_tree_cluster(): Cluster """ # create the fat tree cluster, 10Gbs link between elements in the cluster - simgrid.NetZone.create_fatTree_zone("cluster", None, simgrid.FatTreeParams(2, [2, 3], [1, 2], [1, 1]), simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, - 10e-6, simgrid.Link.SharingPolicy.SPLITDUPLEX).seal() + simgrid.NetZone.create_fatTree_zone("cluster", None, simgrid.FatTreeParams(2, [2, 3], [1, 2], [1, 1]), + simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, 10e-6, + simgrid.Link.SharingPolicy.SPLITDUPLEX).seal() ##################################################################################################### def create_dragonfly_cluster(): - """ + r""" Creates a Dragonfly cluster Creates a Dragonfly cluster with 2 groups and 16 nodes @@ -269,13 +274,14 @@ def create_dragonfly_cluster(): Cluster """ # create the dragonfly cluster, 10Gbs link between elements in the cluster - simgrid.NetZone.create_dragonfly_zone("cluster", None, simgrid.DragonflyParams([2, 2], [2, 1], [2, 2], 2), simgrid.ClusterCallbacks( - create_hostzone, None, create_limiter), 10e9, 10e-6, simgrid.Link.SharingPolicy.SPLITDUPLEX).seal() + simgrid.NetZone.create_dragonfly_zone("cluster", None, simgrid.DragonflyParams([2, 2], [2, 1], [2, 2], 2), + simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, 10e-6, + simgrid.Link.SharingPolicy.SPLITDUPLEX).seal() ################################################################################################### -if __name__ == '__main__': +def main(): e = simgrid.Engine(sys.argv) platform = sys.argv[1] @@ -289,7 +295,7 @@ if __name__ == '__main__': else: sys.exit("invalid param") - host_list = e.get_all_hosts() + host_list = e.all_hosts # create the sender actor running on first host simgrid.Actor.create("sender", host_list[0], Sender(host_list)) # create receiver in every host @@ -298,3 +304,6 @@ if __name__ == '__main__': # runs the simulation e.run() + +if __name__ == '__main__': + main()