Multi-Threading SST

Development work is taking place in the multithread branch.

Concepts

SST Thread-safe datatypes

SST::Core::ThreadSage::Barrier;
SST::Core::ThreadSafe::SpinLock;
SST::Core::ThreadSafe::BoundedQueue;
SST::Core::ThreadSafe::UnboundedQueue;

To Do

Sync Object threading

Off-Rank Concept (Sync-inter)

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