Interface between ns-3 and MPI for the Null Message distributed simulation implementation. More...
#include "null-message-mpi-interface.h"
Public Member Functions | |
NullMessageMpiInterface () | |
~NullMessageMpiInterface () override | |
void | Destroy () override |
Deletes storage used by the parallel environment. | |
void | Disable () override |
Clean up the ns-3 parallel communications interface. | |
void | Enable (int *pargc, char ***pargv) override |
Setup the parallel communication interface. | |
void | Enable (MPI_Comm communicator) override |
Setup the parallel communication interface using the specified communicator. | |
MPI_Comm | GetCommunicator () override |
Return the communicator used to run ns-3. | |
uint32_t | GetSize () override |
Get the number of ranks used by ns-3. | |
uint32_t | GetSystemId () override |
Get the id number of this rank. | |
bool | IsEnabled () override |
Returns enabled state of parallel environment. | |
void | SendPacket (Ptr< Packet > p, const Time &rxTime, uint32_t node, uint32_t dev) override |
Send a packet to a remote node. | |
Public Member Functions inherited from ns3::ParallelCommunicationInterface | |
virtual | ~ParallelCommunicationInterface () |
Destructor. | |
Static Public Member Functions | |
static TypeId | GetTypeId () |
Register this type. | |
Static Private Member Functions | |
static void | InitializeSendReceiveBuffers () |
Initialize send and receive buffers. | |
static void | ReceiveMessages (bool blocking=false) |
Check for received messages complete. | |
static void | ReceiveMessagesBlocking () |
Blocking message receive. | |
static void | ReceiveMessagesNonBlocking () |
Non-blocking check for received messages complete. | |
static void | SendNullMessage (const Time &guaranteeUpdate, Ptr< RemoteChannelBundle > bundle) |
Send a Null Message to across the specified bundle. | |
static void | TestSendComplete () |
Check for completed sends. | |
Static Private Member Functions inherited from ns3::Object | |
static TypeId | GetTypeId () |
Register this type. | |
Static Private Member Functions inherited from ns3::ObjectBase | |
static TypeId | GetTypeId () |
Get the type ID. | |
Static Private Attributes | |
static MPI_Comm | g_communicator = MPI_COMM_WORLD |
MPI communicator being used for ns-3 tasks. | |
static bool | g_enabled = false |
Has this interface been enabled. | |
static bool | g_freeCommunicator = false |
Did we create the communicator? Have to free it. | |
static bool | g_mpiInitCalled = false |
Has MPI Init been called by this interface. | |
static uint32_t | g_numNeighbors = 0 |
Number of neighbor tasks, tasks that this task shares a link with. | |
static std::list< NullMessageSentBuffer > | g_pendingTx |
List of pending non-blocking sends. | |
static char ** | g_pRxBuffers |
Data buffers for non-blocking receives. | |
static MPI_Request * | g_requests |
Pending non-blocking receives. | |
static uint32_t | g_sid = 0 |
System ID (rank) for this task. | |
static uint32_t | g_size = 1 |
Size of the MPI COM_WORLD group. | |
Additional Inherited Members | |
Private Member Functions inherited from ns3::Object | |
Object () | |
Constructor. | |
~Object () override | |
Destructor. | |
void | AggregateObject (Ptr< Object > other) |
Aggregate two Objects together. | |
void | Dispose () |
Dispose of this Object. | |
AggregateIterator | GetAggregateIterator () const |
Get an iterator to the Objects aggregated to this one. | |
TypeId | GetInstanceTypeId () const override |
Get the most derived TypeId for this Object. | |
template<typename T > | |
Ptr< T > | GetObject () const |
Get a pointer to the requested aggregated Object. | |
template<> | |
Ptr< Object > | GetObject () const |
Specialization of () for objects of type ns3::Object. | |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
Get a pointer to the requested aggregated Object by TypeId. | |
template<> | |
Ptr< Object > | GetObject (TypeId tid) const |
Specialization of (TypeId tid) for objects of type ns3::Object. | |
void | Initialize () |
Invoke DoInitialize on all Objects aggregated to this one. | |
bool | IsInitialized () const |
Check if the object has been initialized. | |
void | UnidirectionalAggregateObject (Ptr< Object > other) |
Aggregate an Object to another Object. | |
Object (const Object &o) | |
Copy an Object. | |
virtual void | DoDispose () |
Destructor implementation. | |
virtual void | DoInitialize () |
Initialize() implementation. | |
virtual void | NotifyNewAggregate () |
Notify all Objects aggregated to this one of a new Object being aggregated. | |
Private Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
SimpleRefCount () | |
Default constructor. | |
SimpleRefCount (const SimpleRefCount &o) | |
Copy constructor. | |
uint32_t | GetReferenceCount () const |
Get the reference count of the object. | |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
Assignment operator. | |
void | Ref () const |
Increment the reference count. | |
void | Unref () const |
Decrement the reference count. | |
Private Member Functions inherited from ns3::ObjectBase | |
virtual | ~ObjectBase () |
Virtual destructor. | |
void | GetAttribute (std::string name, AttributeValue &value, bool permissive=false) const |
Get the value of an attribute, raising fatal errors if unsuccessful. | |
bool | GetAttributeFailSafe (std::string name, AttributeValue &value) const |
Get the value of an attribute without raising errors. | |
void | SetAttribute (std::string name, const AttributeValue &value) |
Set a single attribute, raising fatal errors if unsuccessful. | |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
Set a single attribute without raising errors. | |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
Connect a TraceSource to a Callback with a context. | |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
Connect a TraceSource to a Callback without a context. | |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected with a context. | |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected without a context. | |
void | ConstructSelf (const AttributeConstructionList &attributes) |
Complete construction of ObjectBase; invoked by derived classes. | |
virtual void | NotifyConstructionCompleted () |
Notifier called once the ObjectBase is fully constructed. | |
Related Symbols inherited from ns3::ObjectBase | |
static TypeId | GetObjectIid () |
Ensure the TypeId for ObjectBase gets fully configured to anchor the inheritance tree properly. | |
Interface between ns-3 and MPI for the Null Message distributed simulation implementation.
Definition at line 40 of file null-message-mpi-interface.h.
ns3::NullMessageMpiInterface::NullMessageMpiInterface | ( | ) |
Definition at line 136 of file null-message-mpi-interface.cc.
References NS_LOG_FUNCTION.
|
override |
Definition at line 141 of file null-message-mpi-interface.cc.
References NS_LOG_FUNCTION.
|
overridevirtual |
Deletes storage used by the parallel environment.
Implements ns3::ParallelCommunicationInterface.
Definition at line 147 of file null-message-mpi-interface.cc.
References NS_LOG_FUNCTION.
|
overridevirtual |
Clean up the ns-3 parallel communications interface.
MPI_Finalize will be called only if Enable (int* pargc, char*** pargv) was called.
Implements ns3::ParallelCommunicationInterface.
Definition at line 471 of file null-message-mpi-interface.cc.
References g_communicator, g_enabled, g_freeCommunicator, g_mpiInitCalled, g_numNeighbors, g_pendingTx, g_pRxBuffers, g_requests, NS_FATAL_ERROR, and NS_LOG_FUNCTION.
|
overridevirtual |
Setup the parallel communication interface.
There are two ways to setup the communications interface. This Enable method is the easiest method and should be used in most situations.
Disable() must be invoked at end of an ns-3 application to properly cleanup the parallel communication interface.
This method will call MPI_Init and configure ns-3 to use the MPI_COMM_WORLD communicator.
For more complex situations, such as embedding ns-3 with other MPI simulators or libraries, the Enable(MPI_Comm communcicator) may be used if MPI is initialized externally or if ns-3 needs to be run unique communicator. For example if there are two parallel simulators and the goal is to run each simulator on a different set of ranks.
pargc | number of command line arguments |
pargv | command line arguments |
Implements ns3::ParallelCommunicationInterface.
Definition at line 180 of file null-message-mpi-interface.cc.
References Enable(), g_enabled, g_mpiInitCalled, NS_ASSERT, and NS_LOG_FUNCTION.
Referenced by Enable().
|
overridevirtual |
Setup the parallel communication interface using the specified communicator.
See Enable (int* pargc, char*** pargv) for additional information.
communicator | MPI Communicator that should be used by ns-3 |
Implements ns3::ParallelCommunicationInterface.
Definition at line 193 of file null-message-mpi-interface.cc.
References g_communicator, g_enabled, g_freeCommunicator, g_sid, g_size, NS_ASSERT, and NS_LOG_FUNCTION.
|
overridevirtual |
Return the communicator used to run ns-3.
The communicator returned will be MPI_COMM_WORLD if Enable (int* pargc, char*** pargv) is used to enable or the user specified communicator if Enable (MPI_Comm communicator) is used.
Implements ns3::ParallelCommunicationInterface.
Definition at line 167 of file null-message-mpi-interface.cc.
References g_communicator, g_enabled, and NS_ASSERT.
|
overridevirtual |
Get the number of ranks used by ns-3.
Returns the size (number of MPI ranks) of the communicator used by ns-3. When running a sequential simulation this will return a size of 1.
Implements ns3::ParallelCommunicationInterface.
Definition at line 160 of file null-message-mpi-interface.cc.
|
overridevirtual |
Get the id number of this rank.
When running a sequential simulation this will return a systemID of 0.
Implements ns3::ParallelCommunicationInterface.
Definition at line 153 of file null-message-mpi-interface.cc.
|
static |
Register this type.
Definition at line 129 of file null-message-mpi-interface.cc.
References ns3::TypeId::SetParent().
|
staticprivate |
Initialize send and receive buffers.
This method should be called after all links have been added to the RemoteChannelBundle manager to setup any required send and receive buffers.
Definition at line 220 of file null-message-mpi-interface.cc.
References ns3::RemoteChannelBundleManager::Find(), g_communicator, g_enabled, g_numNeighbors, g_pRxBuffers, g_requests, g_size, NS_ASSERT, NS_LOG_FUNCTION_NOARGS, ns3::NULL_MESSAGE_MAX_MPI_MSG_SIZE, and ns3::RemoteChannelBundleManager::Size().
Referenced by ns3::NullMessageSimulatorImpl::CalculateLookAhead().
|
overridevirtual |
Returns enabled state of parallel environment.
Implements ns3::ParallelCommunicationInterface.
Definition at line 174 of file null-message-mpi-interface.cc.
References g_enabled.
|
staticprivate |
Check for received messages complete.
Will block until message has been received if blocking flag is true. When blocking will return after the first message is received. Non-blocking mode will only check for received messages complete, and return all messages that are queued up locally.
[in] | blocking | Whether this call should block. |
Definition at line 346 of file null-message-mpi-interface.cc.
References ns3::Create(), ns3::RemoteChannelBundleManager::Find(), g_communicator, g_enabled, g_numNeighbors, g_pRxBuffers, g_requests, ns3::NodeList::GetNode(), ns3::Time::IsStrictlyPositive(), ns3::Simulator::Now(), NS_ASSERT, NS_LOG_FUNCTION, ns3::NULL_MESSAGE_MAX_MPI_MSG_SIZE, ns3::MpiReceiver::Receive(), and ns3::Simulator::ScheduleWithContext().
Referenced by ReceiveMessagesBlocking(), and ReceiveMessagesNonBlocking().
|
staticprivate |
Blocking message receive.
Will block until at least one message has been received.
Definition at line 330 of file null-message-mpi-interface.cc.
References NS_LOG_FUNCTION_NOARGS, and ReceiveMessages().
Referenced by ns3::NullMessageSimulatorImpl::HandleArrivingMessagesBlocking().
|
staticprivate |
Non-blocking check for received messages complete.
Will receive all messages that are queued up locally.
Definition at line 338 of file null-message-mpi-interface.cc.
References NS_LOG_FUNCTION_NOARGS, and ReceiveMessages().
Referenced by ns3::NullMessageSimulatorImpl::HandleArrivingMessagesNonBlocking().
|
staticprivate |
Send a Null Message to across the specified bundle.
Null Messages are sent when a packet has not been sent across this bundle in order to allow time advancement on the remote MPI task.
[in] | guaranteeUpdate | Lower bound time on the next possible event from this MPI task to the remote MPI task across the bundle. Remote task may execute events up to this time. |
[in] | bundle | The bundle of links between two ranks. |
Definition at line 295 of file null-message-mpi-interface.cc.
References g_communicator, g_enabled, g_pendingTx, ns3::Time::GetInteger(), ns3::Time::GetTimeStep(), NS_ASSERT, and NS_LOG_FUNCTION.
Referenced by ns3::NullMessageSimulatorImpl::NullMessageEventHandler(), and ns3::RemoteChannelBundle::Send().
|
overridevirtual |
Send a packet to a remote node.
p | packet to send |
rxTime | received time at destination node |
node | destination node |
dev | destination device |
Serialize and send a packet to the specified node and net device
Implements ns3::ParallelCommunicationInterface.
Definition at line 250 of file null-message-mpi-interface.cc.
References ns3::NullMessageSimulatorImpl::CalculateGuaranteeTime(), g_communicator, g_enabled, g_pendingTx, ns3::NullMessageSimulatorImpl::GetInstance(), ns3::Time::GetInteger(), ns3::NodeList::GetNode(), ns3::Time::GetTimeStep(), NS_ASSERT, NS_LOG_FUNCTION, and ns3::NullMessageSimulatorImpl::RescheduleNullMessageEvent().
|
staticprivate |
Check for completed sends.
Definition at line 449 of file null-message-mpi-interface.cc.
References g_enabled, g_pendingTx, NS_ASSERT, and NS_LOG_FUNCTION_NOARGS.
Referenced by ns3::NullMessageSimulatorImpl::HandleArrivingMessagesBlocking(), and ns3::NullMessageSimulatorImpl::HandleArrivingMessagesNonBlocking().
|
staticprivate |
MPI communicator being used for ns-3 tasks.
Definition at line 154 of file null-message-mpi-interface.h.
Referenced by Disable(), Enable(), GetCommunicator(), InitializeSendReceiveBuffers(), ReceiveMessages(), SendNullMessage(), and SendPacket().
|
staticprivate |
Has this interface been enabled.
Definition at line 136 of file null-message-mpi-interface.h.
Referenced by Disable(), Enable(), Enable(), GetCommunicator(), GetSize(), GetSystemId(), InitializeSendReceiveBuffers(), IsEnabled(), ReceiveMessages(), SendNullMessage(), SendPacket(), and TestSendComplete().
|
staticprivate |
Did we create the communicator? Have to free it.
Definition at line 157 of file null-message-mpi-interface.h.
|
staticprivate |
Has MPI Init been called by this interface.
Alternatively user supplies a communicator.
Definition at line 142 of file null-message-mpi-interface.h.
|
staticprivate |
Number of neighbor tasks, tasks that this task shares a link with.
Definition at line 133 of file null-message-mpi-interface.h.
Referenced by Disable(), InitializeSendReceiveBuffers(), and ReceiveMessages().
|
staticprivate |
List of pending non-blocking sends.
Definition at line 151 of file null-message-mpi-interface.h.
Referenced by Disable(), SendNullMessage(), SendPacket(), and TestSendComplete().
|
staticprivate |
Data buffers for non-blocking receives.
Definition at line 148 of file null-message-mpi-interface.h.
Referenced by Disable(), InitializeSendReceiveBuffers(), and ReceiveMessages().
|
staticprivate |
Pending non-blocking receives.
Definition at line 145 of file null-message-mpi-interface.h.
Referenced by Disable(), InitializeSendReceiveBuffers(), and ReceiveMessages().
|
staticprivate |
System ID (rank) for this task.
Definition at line 127 of file null-message-mpi-interface.h.
Referenced by Enable(), and GetSystemId().
|
staticprivate |
Size of the MPI COM_WORLD group.
Definition at line 130 of file null-message-mpi-interface.h.
Referenced by Enable(), GetSize(), and InitializeSendReceiveBuffers().