33 #include "ns3/net-device.h"
34 #include "ns3/node-list.h"
36 #include "ns3/nstime.h"
37 #include "ns3/simulator-impl.h"
38 #include "ns3/simulator.h"
107 for (uint32_t i = 0; i <
GetSize(); ++i)
166 MPI_Init(pargc, pargv);
198 for (uint32_t i = 0; i <
GetSize(); ++i)
224 auto buffer =
new uint8_t[serializedSize + 16];
225 i->SetBuffer(buffer);
228 auto pTime =
reinterpret_cast<uint64_t*
>(buffer);
230 auto pData =
reinterpret_cast<uint32_t*
>(pTime);
234 p->
Serialize(
reinterpret_cast<uint8_t*
>(pData), serializedSize);
240 MPI_Isend(
reinterpret_cast<void*
>(i->GetBuffer()),
268 MPI_Get_count(&status, MPI_CHAR, &count);
272 auto pTime =
reinterpret_cast<uint64_t*
>(
g_pRxBuffers[index]);
273 uint64_t time = *pTime++;
274 auto pData =
reinterpret_cast<uint32_t*
>(pTime);
275 uint32_t node = *pData++;
276 uint32_t dev = *pData++;
280 count -=
sizeof(time) +
sizeof(node) +
sizeof(dev);
282 Ptr<Packet> p = Create<Packet>(
reinterpret_cast<uint8_t*
>(pData), count,
true);
288 for (uint32_t i = 0; i < nDevices; ++i)
291 if (pThisDev->GetIfIndex() == dev)
328 MPI_Test(i->GetRequest(), &flag, &status);
353 MPI_Initialized(&flag);
360 NS_FATAL_ERROR(
"Cannot disable MPI environment without Initializing it first");
static void ReceiveMessages()
Check for received messages complete.
MPI_Comm GetCommunicator() override
Return the communicator used to run ns-3.
static uint32_t GetRxCount()
static bool g_freeCommunicator
Did ns-3 create the communicator? Have to free it.
uint32_t GetSystemId() override
Get the id number of this rank.
void Disable() override
Clean up the ns-3 parallel communications interface.
static void TestSendComplete()
Check for completed sends.
static bool g_mpiInitCalled
Has MPI Init been called by this interface.
void SendPacket(Ptr< Packet > p, const Time &rxTime, uint32_t node, uint32_t dev) override
Send a packet to a remote node.
static uint32_t g_size
Size of the MPI COM_WORLD group.
static bool g_enabled
Has this interface been enabled.
static uint32_t GetTxCount()
static std::list< SentBuffer > g_pendingTx
List of pending non-blocking sends.
void Enable(int *pargc, char ***pargv) override
Setup the parallel communication interface.
bool IsEnabled() override
Returns enabled state of parallel environment.
static MPI_Request * g_requests
Pending non-blocking receives.
static uint32_t g_rxCount
Total packets received.
uint32_t GetSize() override
Get the number of ranks used by ns-3.
static char ** g_pRxBuffers
Data buffers for non-blocking reads.
void Destroy() override
Deletes storage used by the parallel environment.
static uint32_t g_txCount
Total packets sent.
static MPI_Comm g_communicator
MPI communicator being used for ns-3 tasks.
static TypeId GetTypeId()
Register this type.
static uint32_t g_sid
System ID (rank) for this task.
static uint32_t GetSize()
Get the number of ranks used by ns-3.
Class to aggregate to a NetDevice if it supports MPI capability.
void Receive(Ptr< Packet > p)
Direct an incoming packet to the device Receive() method.
uint32_t GetSystemId() const
uint32_t GetNDevices() const
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
static Ptr< Node > GetNode(uint32_t n)
A base class which provides memory management and object aggregation.
uint32_t GetSerializedSize() const
Returns number of bytes required for packet serialization.
uint32_t Serialize(uint8_t *buffer, uint32_t maxSize) const
Serialize a packet, tags, and metadata into a byte buffer.
Tracks non-blocking sends.
MPI_Request m_request
The MPI request handle.
uint8_t * m_buffer
The buffer.
void SetBuffer(uint8_t *buffer)
MPI_Request * GetRequest()
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
static Time Now()
Return the current simulation virtual time.
Simulation virtual time values and global simulation resolution.
int64_t GetInteger() const
Get the raw time value, in the current resolution unit.
int64_t GetTimeStep() const
Get the raw time value, in the current resolution unit.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Declaration of classes ns3::SentBuffer and ns3::GrantedTimeWindowMpiInterface.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Declaration of class ns3::MpiInterface.
ns3::MpiReceiver declaration, provides an interface to aggregate to MPI-compatible NetDevices.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
const uint32_t MAX_MPI_MSG_SIZE
maximum MPI message size for easy buffer creation