Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(243)

Unified Diff: src/mpi/model/null-message-simulator-impl.h

Issue 14234043: Null Message Parallel Scheduler
Patch Set: Null message scheduler with code changes based on review comments. Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/mpi/model/null-message-mpi-interface.cc ('k') | src/mpi/model/null-message-simulator-impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mpi/model/null-message-simulator-impl.h
===================================================================
new file mode 100644
--- /dev/null
+++ b/src/mpi/model/null-message-simulator-impl.h
@@ -0,0 +1,212 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NULLMESSAGE_SIMULATOR_IMPL_H
+#define NULLMESSAGE_SIMULATOR_IMPL_H
+
+#include <ns3/simulator-impl.h>
+#include <ns3/scheduler.h>
+#include <ns3/event-impl.h>
+#include <ns3/ptr.h>
+
+#include <list>
+#include <iostream>
+#include <fstream>
+
+namespace ns3 {
+
+class NullMessageEvent;
+class NullMessageMpiInterface;
+class RemoteChannelBundle;
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Simulator implementation using MPI and a Null Message algorithm.
+ */
+class NullMessageSimulatorImpl : public SimulatorImpl
+{
+public:
+ static TypeId GetTypeId (void);
+
+ NullMessageSimulatorImpl ();
+
+ ~NullMessageSimulatorImpl ();
+
+ // virtual from SimulatorImpl
+ virtual void Destroy ();
+ virtual bool IsFinished (void) const;
+ virtual void Stop (void);
+ virtual void Stop (Time const &time);
+ virtual EventId Schedule (Time const &time, EventImpl *event);
+ virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+ virtual EventId ScheduleNow (EventImpl *event);
+ virtual EventId ScheduleDestroy (EventImpl *event);
+ virtual void Remove (const EventId &ev);
+ virtual void Cancel (const EventId &ev);
+ virtual bool IsExpired (const EventId &ev) const;
+ virtual void Run (void);
+ virtual void RunOneEvent (void);
+ virtual Time Now (void) const;
+ virtual Time GetDelayLeft (const EventId &id) const;
+ virtual Time GetMaximumSimulationTime (void) const;
+ virtual void SetScheduler (ObjectFactory schedulerFactory);
+ virtual uint32_t GetSystemId (void) const;
+ virtual uint32_t GetContext (void) const;
+
+ /**
+ * \return singleton instance
+ *
+ * Singleton accessor.
+ */
+ static NullMessageSimulatorImpl * GetInstance (void);
+
+private:
+ friend class NullMessageEvent;
+ friend class NullMessageMpiInterface;
+ friend class RemoteChannelBundleManager;
+
+ /**
+ * Non blocking receive of pending messages.
+ */
+ void HandleArrivingMessagesNonBlocking (void);
+
+ /**
+ * Blocking receive of arriving messages.
+ */
+ void HandleArrivingMessagesBlocking (void);
+
+ virtual void DoDispose (void);
+
+ /**
+ * Calculate the look ahead allowable for this MPI task. Basically
+ * the minimum latency on links to neighbor MPI tasks.
+ */
+ void CalculateLookAhead (void);
+
+ /**
+ * Process the next event on the queue.
+ */
+ void ProcessOneEvent (void);
+
+ /**
+ * \return next local event time.
+ */
+ Time Next (void) const;
+
+ /**
+ * Calculate the SafeTime. Should be called after message receives.
+ */
+ void CalculateSafeTime (void);
+
+ /**
+ * Get the current SafeTime; the maximum time that events can
+ * be processed based on information received from neighboring
+ * MPI tasks.
+ */
+ Time GetSafeTime (void);
+
+ /**
+ * \param bundle Bundle to schedule Null Message event for
+ *
+ * Schedule Null Message event for the specified RemoteChannelBundle.
+ */
+ void ScheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle);
+
+ /**
+ * \param bundle Bundle to reschedule Null Message event for
+ *
+ * Reschedule Null Message event for the specified
+ * RemoteChannelBundel. Existing event will be canceled.
+ */
+ void RescheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle);
+
+ /**
+ * \param nodeSysId SystemID to reschedule null event for
+ *
+ * Reschedule Null Message event for the RemoteChannelBundel to the
+ * task nodeSysId. Existing event will be canceled.
+ */
+ void RescheduleNullMessageEvent (uint32_t nodeSysId);
+
+ /**
+ * \param systemId SystemID to compute guarentee time for
+ *
+ * \return Guarentee time
+ *
+ * Calculate the guarantee time for incoming RemoteChannelBundel
+ * from task nodeSysId. No message should arrive from task
+ * nodeSysId with a receive time less than the guarantee time.
+ */
+ Time CalculateGuaranteeTime (uint32_t systemId);
+
+ /**
+ * \param bundle remote channel bundle to schedule an event for.
+ *
+ * Null message event handler. Scheduled to send a null message
+ * for the specified bundle at regular intervals. Will canceled
+ * and rescheduled when packets are sent.
+ */
+ void NullMessageEventHandler(RemoteChannelBundle* bundle);
+
+ typedef std::list<EventId> DestroyEvents;
+
+ DestroyEvents m_destroyEvents;
+ bool m_stop;
+ Ptr<Scheduler> m_events;
+ uint32_t m_uid;
+ uint32_t m_currentUid;
+ uint64_t m_currentTs;
+ uint32_t m_currentContext;
+ // number of events that have been inserted but not yet scheduled,
+ // not counting the "destroy" events; this is used for validation
+ int m_unscheduledEvents;
+
+ uint32_t m_myId; // MPI Rank
+ uint32_t m_systemCount; // MPI Size
+
+ /*
+ * The time for which it is safe for this task to execute events
+ * without danger of out-of-order events.
+ */
+ Time m_safeTime;
+
+ /*
+ * Null Message performance tuning parameter. Controls when Null
+ * messages are sent. When value is 1 the minimum number of Null
+ * messages are sent conserving bandwidth. The delay in arrival of
+ * lookahead information is the greatest resulting in maximum
+ * unnecessary blocking of the receiver. When the value is near 0
+ * Null Messages are sent with high frequency, costing more
+ * bandwidth and Null Message processing time, but there is minimum
+ * unnecessary block of the receiver.
+ */
+ double m_schedulerTune;
+
+ /*
+ * Singleton instance.
+ */
+ static NullMessageSimulatorImpl* g_instance;
+};
+
+} // namespace ns3
+
+#endif /* NULLMESSAGE_SIMULATOR_IMPL_H */
« no previous file with comments | « src/mpi/model/null-message-mpi-interface.cc ('k') | src/mpi/model/null-message-simulator-impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b