ns3中mpi应用(3)

337 阅读2分钟

这是我参与更文挑战的第17天,活动详情查看: 更文挑战

Creating custom topologies(创建自定义拓扑)

src/mpi/examples中的示例程序很好地说明了如何为分布式模拟创建不同的拓扑。主要的要点是将系统id分配给各个节点,在应该划分模拟的地方创建点对点链接,以及只在与目标节点关联的LP上安装应用程序。

给节点分配系统id很简单,可以用两种不同的方法来处理。首先,NodeContainer可以用来创建节点并分配系统id:

NodeContainer nodes;
nodes.Create (5, 1); // Creates 5 nodes with system id 1.

或者,可以单独创建节点,分配系统id,并添加到NodeContainer中。如果NodeContainer保存着具有不同系统id的节点,这是有用的:

NodeContainer nodes;
Ptr<Node> node1 = CreateObject<Node> (0); // Create node1 with system id 0
Ptr<Node> node2 = CreateObject<Node> (1); // Create node2 with system id 1
nodes.Add (node1);
nodes.Add (node2);

接下来,模拟被划分的位置是由点对点链接的位置决定的。如果在两个具有不同系统id的节点之间创建了点对点链接,则创建了远程点对点链接.

最后,只在与目标节点关联的LP上安装应用程序非常重要。例如,如果要将流量生成器放置在LP0上的节点0上,那么只有LP0应该安装此应用程序。这很容易完成,首先检查模拟器系统id,并确保在安装应用程序之前它与目标节点的系统id匹配。

Tracing During Distributed Simulations(分布式仿真过程中的跟踪)

根据模拟器的系统id (rank)的不同,跟踪的信息会有所不同,因为在一个模拟器上发起的流量在到达特定于该模拟器的节点之前不会被另一个模拟器看到。跟踪不同跟踪的最简单方法是根据模拟器的系统id以不同的方式命名跟踪文件或pcaps。例如,假设所有这些局部变量都是预先定义的,类似这样的东西应该可以很好地工作:

if (MpiInterface::GetSystemId () == 0)
  {
    pointToPoint.EnablePcapAll ("distributed-rank0");
    phy.EnablePcap ("distributed-rank0", apDevices.Get (0));
    csma.EnablePcap ("distributed-rank0", csmaDevices.Get (0), true);
  }
else if (MpiInterface::GetSystemId () == 1)
  {
    pointToPoint.EnablePcapAll ("distributed-rank1");
    phy.EnablePcap ("distributed-rank1", apDevices.Get (0));
    csma.EnablePcap ("distributed-rank1", csmaDevices.Get (0), true);
  }