Firefly Element Library

A library that contains related modules that run/test Hermes

Firefly Introduction

Firefly is a collection of modules that implement a state machine based data movement stack. The top of the stack is functionally similar to MPI. The purpose of Firefly is to provide a way to test network topologies at a scale much larger than “full simulation” of a network stack would allow, yet providing high fidelity network traffic.

Firefly is not a stand alone model it provides support for network simulations that at a minimum should have two types of SST components: a network component ( e.g. Merlin ) and a driver component ( e.g. Zodiac). The data movement stack functionality in Firefly is accessed by the driver component via the Firefly module Hades. The use pattern for the driver component would be to load the Hades module, do some work, call a Hades data movement function (e.g. send(), recv(), barrier(). etc.), wait for the function to complete, repeat. It should be noted that the driver doesn’t wait in the serial sense (given it must return to the SST core) it must save state, return to the SST core and wait for notification that the Hades data movement function has completed. Firefly contains a simple trace file based driver component, !TestDriver, that was used for development of Firefly. It can be used as reference when developing a driver but it should be noted that the trace files used by !TestDriver must be carefully crafted.


Hermes is an abstract class that defines the interface to the data movement stack and is located in sst/elements/hermes/msgapi.h. Hades is derived from Hermes.

Hades Parameters

numRanks - the number of ranks, in the application that “drives” the simulation.

<hermesParams.numRanks> 2 </hermesParams.numRanks>

nidListFile - file that maps the application ranks to physical nodes.

<hermesParams.nidListFile> nidlist.txt </hermesParams.nidListFile>

policy - sets the application load policy. This parameter specifies how application ranks are distributed on multi-core systems. “adjacent” specifies that adjacent ranks are loaded on the same socket. “roundRobin” specifies that adjacent ranks are loaded on different sockets.

<hermesParams.policy> adjacent </hermesParams.policy>

ioModule - the name of the I/O module to use. The I/O module is the point where

<hermesParams.ioModule> firefly.merlinIO </hermesParams.ioModule>