This single HTML file is intended to be self contained but has links to external resources. External sites have a trailing icon
This file is not intended to be read linearly. Follow the links from a given question to other related questions.
Response: SST as a framework for DES is not focused on a specific problem or domain.
SST supports distributed computation using MPI.
Response:
Response: A Python script that specifies components, subComponents, and links. Also can specify parameters per component and subComponent.
Reference: https://sst-simulator.org/SSTPages/SSTUserPythonFileFormat/
Response: a collection of components in a single .so file. Example from sst-info:
sst-info
ELEMENT 1 = switch () Num Components = 1 Component 0: SwitchComponent CATEGORY: UNCATEGORIZED COMPONENT
Response: A Python class that connects two SST components. Each component has a port.
#!/usr/bin/env python3 import sst compA = sst.Component("Comp A", "dummy.Component") compB = sst.Component("Comp B", "dummy.Component") link = sst.Link("mylink") link.connect((compA, "myPort", "10ns"), (compB, "myPort", "10ns"))
In a C++ component, poll or interrupt with EventHandler
Reference: https://sst-simulator.org/SSTPages/SSTUserPythonFileFormat/#links
Response: A C++ file and .h header that performs the simulation. SST Components have ports and send events over links to communicate with other components. SST Components can load SubComponents and Modules for additional functionality.
Related questions
Response: A C++ file and .h header that can be used for supplemental functionality.
Why use a subComponent?:
Example:
#!/usr/bin/env python3 import sst core = sst.Component(“core”, “miranda.BaseCPU”) core.addParams({ “clock” : “2.4GHz” }) gen = core.setSubComponent(“generator”, “miranda.STREAMBenchGenerator”) cache = sst.Component(“L1”, “memHierarchy.Cache”) mctrl = sst.Component(“memctrl”, “memHierarchy.MemController”) memory = mctrl.setSubComponent(“backend”, “memHierarchy.simpleMem”)
Response: A C++ file and .h header that can be used for supplemental functionality. Modules don't access base class API. Statistics are not available. Ports are not available. Modules are considered user facing. Can be specified in Python as a parameter.
Why use a Module:
Response: Purpose is to enable decomposition of complicated components. Component extensions cannot be run independently. Status: stable but not official; may have bugs. Component extensions are in Beta and will eventually be made official; intent is for long-term support.
Response: A unit of communication sent between two SST components over a link.
Examples of standardized interfaces: https://github.com/sstsimulator/sst-core/tree/master/src/sst/core/interfaces
Response: SST Core maintains a database of registered libraries. The list of registered elements can be queried using sst-info
Abbreviation: ELI = Element Library Information
Response: sst-register
Description from slide 19; see also slide 20
Response: (from slide 20, also slide 13)
Response: the component-link graph from the Python driver file is partitioned and sent to MPI nodes
See slides 21-23
Response: By default SST tries to partition to load balance and cut long-latency links
General Partitioners
Special Partitioners
Response: Partitioning can be specified in the python input file Use setRank(mpi_rank, thread) on a component. User must set rank/thread pairs for all components in system, partial partitions not supported
setRank(mpi_rank, thread)
Must set the partitioner to be ”self”. Can be done on command-line: --partitioner=self or can be done in python file: sst.setProgramOption(”partitioner", ”self")
--partitioner=self
sst.setProgramOption(”partitioner", ”self")
sst driver_config.py
Related questions:
Response: Components distributed among MPI ranks/threads. Link latency controls synchronization rate Two ranks:
mpirun –np 2 sst demo1.py
sst –n 2 demo1.py
mpirun –np 2 sst –n 2 demo1.py
Response: Components and SubComponents define statistics
sst.setStatisticOutput(“sst.statoutputcsv”) sst.setStatisticOutputOptions({ “filepath” : “stats.csv” }) sst.setStatisticLoadLevel(5) sst.enableAllStatisticsForAllComponents()
Response: according to ELI guide the elementinfo.h lists the macros. However, there are many more.
The full list can be grep'd in the sst-core directory using
grep -R "#define SST_ELI" * | cut -d" " -f2 | sed 's/(.*//'g | sort | uniq
{ “name”, “description”, vector of supported events }
{ “name”, “description”, “units”, enable level }
{ “slotname”, “description”, “name of superclass” }
SST::ElementLibrary::SubComponentClass
{ “name”, “description”, “default value” }
Definitions of arguments:
Event::Handler SST::Component SST::Link - sst/core/link.h; Standard mechanism to send/receive data from another component. Created via SST::Component::configureLink() SST::Param - sst/core/param.h; Holds parameters from ConfigGraph. Handed to Component in constructor SST::Output - sst/core/output.h; Utility class to bundle output from SST SST::UnitAlgebra SST::RNG::SSTRandom
SST::Component SST::Link - sst/core/link.h; Standard mechanism to send/receive data from another component. Created via SST::Component::configureLink() SST::Param - sst/core/param.h; Holds parameters from ConfigGraph. Handed to Component in constructor SST::Output - sst/core/output.h; Utility class to bundle output from SST SST::UnitAlgebra SST::RNG::SSTRandom
SST::Component::configureLink() SST::Param - sst/core/param.h; Holds parameters from ConfigGraph. Handed to Component in constructor SST::Output - sst/core/output.h; Utility class to bundle output from SST SST::UnitAlgebra SST::RNG::SSTRandom
SST::Param - sst/core/param.h; Holds parameters from ConfigGraph. Handed to Component in constructor SST::Output - sst/core/output.h; Utility class to bundle output from SST SST::UnitAlgebra SST::RNG::SSTRandom
Response: Time in the core is represented by a uint64_t, which counts the number of atomic ticks since simulation start. Tick unit can be specified, default is 1 picosecond, which allows nearly 2/3 year of simulated time
Response: SubComponents have to be coupled to a component. They aren’t able to run independently since they interact with a Component via an API rather than the Link interface.
Context: The events being serialized between components are small.
Response: yes, but this is not documented because it's not exposed to users or developers. Specifically, every MPI rank has a queue per remote thread. Then each queue is serialized at clock sync.
Response: "time core" is needed for causality, so probably can't revert to functional simulation. Could send messages without sync, but that would violate causality and is not supported.
Response: Arbitration is clocked. When clocks return nothing, then switching to event-based would be faster. If there are many elements or lots of activity, then unclocked would be slower.
Response: There's no limit imposed by SST.
Response: The value of SST Subcomponents is dynamic loading at runtime. Subcomponents have unique ports and unique statistics. Parent component does not need to be aware of subcomponent's ports. Subcomponents can be specified directly in Python or as parameters. Statically-linked C++ libraries are viable alternative to subcomponents.
Response: Graph construction takes place in Python and is serial on rank=0. Partitioner can be parallelized using Zoltan.
Response: sst --output-dot=pic.gv --run-mode=init config.py
sst --output-dot=pic.gv --run-mode=init config.py
There are two graphs generated, "connections" and "sst_simulation". The "connections" graph is the pre-partitioned graph, the "sst_simulation" graph shows which MPI rank and which thread hosts each node in the graph. See https://github.com/sstsimulator/sst-core/blob/master/src/sst/core/cfgoutput/dotConfigOutput.cc