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.

 


Question: What makes SST distinct from other DES options?

Response:
SST as a framework for DES is not focused on a specific problem or domain.

SST supports distributed computation using MPI.


Question: what are the major concepts in SST?

Response:


Question: what is a project driver file?

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/


Question: what is an SST element?

Response: a collection of components in a single .so file. Example from sst-info:

ELEMENT 1 = switch ()
Num Components = 1
      Component 0: SwitchComponent
      CATEGORY: UNCATEGORIZED COMPONENT


Question: what is an SST link?

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


Question: what is an SST component?

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


Question: what is an SST subComponent?

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”)​
      


Question: what is an SST Module?

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:


Question: What are SST extensions?

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.


Question: what is an SST Event?

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


Question: what files are required for a simulation?

Response:


Question: what elements are registered in SST?

Response: SST Core maintains a database of registered libraries.
The list of registered elements can be queried using
sst-info


Question: how do events appear in a component?

Response:

source: slide 15


Question: What does ELI stand for?

Abbreviation: ELI = Element Library Information


Question: how to register a component in SST?

Response: sst-register


Question: what is the simulation lifecycle in SST?

Description from slide 19; see also slide 20

  1. Birth
  2. Life
  3. Death


Question: what is the component lifecycle in SST?

Response: (from slide 20, also slide 13)

  1. Graph construction:
    • define components and links
    • partition components to MPI ranks
  2. Construction: call component constructors and parse parameters. See slide 14
  3. initialize. See slide 15
    • Components send “init” events to each other over links. Discover neighbors, negotiate parameters, initialize data structures, etc.
    • Multiple rounds of communication until no more “init” events are sent
  4. setup ("pre-time")
    • Each component does its final setup and schedules initial events
  5. run
    • Actual simulation (time begins)
    • Continues until a set time, or all components agree to finish
  6. Complete
  7. finalize


Question: how does SST parallelize simulations?

Response: the component-link graph from the Python driver file is partitioned and sent to MPI nodes

See slides 21-23


Question: how does SST partition a simulation?

Response: By default SST tries to partition to load balance and cut long-latency links​

General Partitioners​

Special Partitioners​


Question: what is self partitioning?

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

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")​


Question: how to launch an SST simulation?

Response:

  1. install SST Core
  2. register one or more components
  3. sst driver_config.py

Related questions:


Question: how to launch a parallel SST simulation?

Response: Components distributed among MPI ranks/threads.
Link latency controls synchronization rate​ Two ranks​:

mpirun –np 2 sst demo1.py​
Two threads​:
sst –n 2 demo1.py​
      
Two ranks with two threads each​. This will give a warning since we only​ have 3 components across 4 ranks/threads​
mpirun –np 2 sst –n 2 demo1.py
      


Question: how to configure statistics for SST simulation?

Response: Components and SubComponents define statistics​

sst.setStatisticOutput(“sst.statoutputcsv”)​
sst.setStatisticOutputOptions({ “filepath” : “stats.csv” })​
sst.setStatisticLoadLevel(5)​
sst.enableAllStatisticsForAllComponents()​
      
source: slide 55


Question: what are all the SST macros?

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
      

A partial list is

source: slides 4-11

Definitions of arguments:​

source: slide 4


Question: what are the core APIs in SST?

Response:

source: slide 25


Question: what is the default time increment in SST?

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


Question: Can SST SubComponents be run independently?

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.


Question: Does SST coalesce MPI messages between components?

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.


Question: Can SST be run without being clocked?; Can SST be run as a functional simulation?

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.


Question: If SST were event-driven rather than clocked, would that be faster to execute?

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.


Question: Is there any limit to the nesting of subcomponents??

Response: There's no limit imposed by SST.


Question: What is the advantage of Subcomponents over libraries?

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.


Question: where does SST graph construction take place in an MPI simulation?

Response: Graph construction takes place in Python and is serial on rank=0. Partitioner can be parallelized using Zoltan.


Question: how does SST generate graphviz plots?

Response: 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