Navigation: Home | Downloads | Getting SST | Documentation | Support
Development work is taking place in the multithread
branch.
Simulation
objects
Simulation::getSimulation()
will handle per-thread objectsstatOutput
might also get shared.SST::Core::ThreadSage::Barrier;
SST::Core::ThreadSafe::SpinLock;
SST::Core::ThreadSafe::BoundedQueue;
SST::Core::ThreadSafe::UnboundedQueue;
main
Event
unique IDParam
keyMap
/ keyMapReverse
Factory
StatOutput
UnitAlgebra
MemPools
Each Thread in a Rank will participate by pulling Serialization / Deserialization tasks out of a work queue. The “Master” thread (thread 0) will perform MPI I/O, and parcel work out to the work queues.
When an Event
is sent to an off-Rank target, it gets put into a queue that represents events for that particular off-Rank target’s Thread. These queues will get serialized in parallel into buffers for target ranks. Each serialized queue will be sent on its own MPI message.
On the Receive side, the messages will be placed into a work queue for deserialization. Each message will deserialize into a set of Events, destined for a particular thread. After all messages are deserialized, each thread will query the other thread’s per-thread event lists for the events which this thread owns. Those will then be placed into the proper Links.
T(Master) | T(Other) |
---|---|
* BEGIN SEND PHASE * | |
Fill Work Q with target-thread queues to serialize | |
Barrier | |
(If only 1 thread, perform T(Other) work) | Pull Serialization Work |
Pull from Send Q | * Serialize |
* Send | * Place buffer into Send Q |
* Count Sends to Stop | * Exit loop when Work Q Empty |
* SWITCH TO RECEIVE PHASE * | |
Loop on wait_any(recv) | |
* Fill Work Q or Resize | Pull from Work Q |
* When done, insert NULLs into Work Q (#threads) | * Look for Completion (NULL) |
wait_all(sends) | * Deserialize |
Post Receives (next round) | * Place into own Per-Target-Thread queue |
Barrier | |
Query all other-thread's per-target-thread queue for Events | |
Link::send each events |