Parcourir la source

pdevs/mpi: add no distributed model

Eric Ramat il y a 8 ans
Parent
commit
b790def632
3 fichiers modifiés avec 198 ajouts et 10 suppressions
  1. 160 7
      src/tests/mpi/graph_manager.hpp
  2. 36 1
      src/tests/mpi/main.cpp
  3. 2 2
      src/tests/pdevs/models.hpp

+ 160 - 7
src/tests/mpi/graph_manager.hpp

@@ -80,8 +80,8 @@ public:
     { }
 
 private:
-    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A  > a;
-    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B  > b;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
 };
 
 class S2GraphManager :
@@ -101,10 +101,13 @@ public:
         a.add_in_port("in");
         a.add_out_port("out");
         b.add_in_port("in");
+        b.add_out_port("out");
         coordinator->add_in_port("in");
+        coordinator->add_out_port("out");
 
         add_link(&a, "out", &b, "in");
         add_link(coordinator, "in", &a, "in");
+        add_link(&b, "out", coordinator, "out");
     }
 
     void init()
@@ -122,8 +125,8 @@ public:
     { }
 
 private:
-    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A  > a;
-    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B  > b;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
 };
 
 struct RootGraphManagerParameters
@@ -131,9 +134,6 @@ struct RootGraphManagerParameters
     std::vector < int > ranks;
 };
 
-typedef paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > ModelProxy;
-typedef std::vector < ModelProxy* > ModelProxies;
-
 class RootGraphManager :
         public paradevs::pdevs::GraphManager < common::DoubleTime,
                                                RootGraphManagerParameters >
@@ -173,9 +173,159 @@ public:
     }
 
 private:
+    typedef paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > ModelProxy;
+    typedef std::vector < ModelProxy* > ModelProxies;
+
     ModelProxies models;
 };
 
+/******************************************************************************/
+
+class S1LocalGraphManager :
+        public paradevs::pdevs::GraphManager < common::DoubleTime >
+{
+public:
+    S1LocalGraphManager(common::Coordinator < common::DoubleTime >* coordinator,
+                        const paradevs::common::NoParameters& parameters) :
+        paradevs::pdevs::GraphManager < common::DoubleTime >(coordinator,
+                                                             parameters),
+        a("a1", common::NoParameters()),
+        b("b1", common::NoParameters())
+    {
+        add_child(&a);
+        add_child(&b);
+
+        a.add_out_port("out");
+        b.add_in_port("in");
+        b.add_out_port("out");
+        coordinator->add_out_port("out");
+
+        add_link(&a, "out", &b, "in");
+        add_link(&b, "out", coordinator, "out");
+    }
+
+    void init()
+    { }
+
+    void start(common::DoubleTime::type /* t */)
+    { }
+
+    void transition(
+        const common::Models < common::DoubleTime >& /* receivers */,
+        common::DoubleTime::type /* t */)
+    { }
+
+    virtual ~S1LocalGraphManager()
+    { }
+
+private:
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
+};
+
+class S2LocalGraphManager :
+        public paradevs::pdevs::GraphManager < common::DoubleTime >
+{
+public:
+    S2LocalGraphManager(common::Coordinator < common::DoubleTime >* coordinator,
+                        const paradevs::common::NoParameters& parameters) :
+        paradevs::pdevs::GraphManager < common::DoubleTime >(coordinator,
+                                                             parameters),
+        a("a2", common::NoParameters()),
+        b("b2", common::NoParameters())
+    {
+        add_child(&a);
+        add_child(&b);
+
+        a.add_in_port("in");
+        a.add_out_port("out");
+        b.add_in_port("in");
+        b.add_out_port("out");
+        coordinator->add_in_port("in");
+        coordinator->add_out_port("out");
+
+        add_link(&a, "out", &b, "in");
+        add_link(coordinator, "in", &a, "in");
+        add_link(&b, "out", coordinator, "out");
+    }
+
+    void init()
+    { }
+
+    void start(common::DoubleTime::type /* t */)
+    { }
+
+    void transition(
+        const common::Models < common::DoubleTime >& /* receivers */,
+        common::DoubleTime::type /* t */)
+    { }
+
+    virtual ~S2LocalGraphManager()
+    { }
+
+private:
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
+    paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
+};
+
+struct RootLocalGraphManagerParameters
+{
+    std::vector < int > ranks;
+};
+
+class RootLocalGraphManager :
+        public paradevs::pdevs::GraphManager < common::DoubleTime,
+                                               RootLocalGraphManagerParameters >
+{
+public:
+    RootLocalGraphManager(
+        common::Coordinator < common::DoubleTime >* coordinator,
+        const RootLocalGraphManagerParameters& parameters) :
+        paradevs::pdevs::GraphManager < common::DoubleTime,
+                                        RootLocalGraphManagerParameters >(
+                                            coordinator, parameters),
+        first("S0", paradevs::common::NoParameters(),
+              paradevs::common::NoParameters())
+    {
+        Next* previous = 0;
+
+        for (std::vector < int >::const_iterator it = parameters.ranks.begin();
+             it != parameters.ranks.end(); ++it) {
+            std::stringstream ss;
+            Next* model = 0;
+
+            ss << "S" << *it;
+            model = new Next(ss.str(), paradevs::common::NoParameters(),
+                             paradevs::common::NoParameters());
+            nexts.push_back(model);
+            add_child(model);
+            if (it != parameters.ranks.begin()) {
+                add_link(previous, "out", model, "in");
+            }
+            previous = model;
+        }
+        add_link(&first, "out", nexts[0], "in");
+    }
+
+    virtual ~RootLocalGraphManager()
+    {
+        std::for_each(nexts.begin(), nexts.end(),
+                      std::default_delete < Next >());
+    }
+
+private:
+    typedef paradevs::pdevs::Coordinator < common::DoubleTime,
+                                           S1LocalGraphManager > First;
+    typedef paradevs::pdevs::Coordinator < common::DoubleTime,
+                                           S2LocalGraphManager > Next;
+    typedef std::vector < Next* > Nexts;
+
+    First first;
+    Nexts nexts;
+};
+
+/******************************************************************************/
+
 struct GridGraphManagerParameters
 {
     unsigned int global_size;
@@ -465,6 +615,9 @@ public:
     }
 
 private:
+    typedef paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > ModelProxy;
+    typedef std::vector < ModelProxy* > ModelProxies;
+
     ModelProxies models;
 };
 

+ 36 - 1
src/tests/mpi/main.cpp

@@ -113,6 +113,40 @@ void example_simple(int argc, char *argv[])
     }
 }
 
+void example_simple_local()
+{
+    paradevs::tests::mpi::RootLocalGraphManagerParameters parameters;
+
+    parameters.ranks.push_back(1);
+    parameters.ranks.push_back(2);
+    parameters.ranks.push_back(3);
+    parameters.ranks.push_back(4);
+    parameters.ranks.push_back(5);
+    parameters.ranks.push_back(6);
+    parameters.ranks.push_back(7);
+    parameters.ranks.push_back(8);
+
+    paradevs::common::RootCoordinator <
+        DoubleTime,
+        paradevs::pdevs::Coordinator <
+            DoubleTime,
+            paradevs::tests::mpi::RootLocalGraphManager,
+            paradevs::common::NoParameters,
+            paradevs::tests::mpi::RootLocalGraphManagerParameters >
+        > rc(0, 20, "root", paradevs::common::NoParameters(), parameters);
+
+    steady_clock::time_point t1 = steady_clock::now();
+
+    rc.run();
+
+    steady_clock::time_point t2 = steady_clock::now();
+
+    duration < double > time_span = duration_cast <
+        duration < double > >(t2 - t1);
+
+    std::cout << "CHAIN = " << time_span.count() << std::endl;
+}
+
 #define SUB_GRID_SIZE 32
 #define SUB_GRID_NUMBER 8
 
@@ -214,7 +248,8 @@ void example_grid(int argc, char *argv[])
 
 int main(int argc, char *argv[])
 {
-    example_simple(argc, argv);
+    // example_simple(argc, argv);
+    example_simple_local();
 //    example_grid(argc, argv);
     return 0;
 }

+ 2 - 2
src/tests/pdevs/models.hpp

@@ -87,7 +87,7 @@ public:
         common::Trace < common::DoubleTime >::trace().flush();
 #endif
 
-        delay();
+        // delay();
         ++_value.x;
         --_value.y;
 
@@ -256,7 +256,7 @@ public:
         common::Trace < common::DoubleTime >::trace().flush();
 #endif
 
-        delay();
+        // delay();
 
         // std::cout << t << ": " << get_name() << " => dint -> "
         //           << _value << std::endl;