From 1577393008e2bfc87c4c46b9f9a486bee3641806 Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Fri, 14 Mar 2025 09:22:59 -0500 Subject: [PATCH 1/6] Add igrid example of break to interactive console from event handler --- sstcomp/CMakeLists.txt | 13 +- sstcomp/igrid/CMakeLists.txt | 20 ++ sstcomp/igrid/igridnode.cc | 296 +++++++++++++++++++++++ sstcomp/igrid/igridnode.h | 209 ++++++++++++++++ sstcomp/igrid/kgdbg.h | 39 +++ test/igrid/igrid2d.py | 101 ++++++++ test/igrid/test.igrid.ref | 130 ++++++++++ test/igrid/test.interactive.ref | 98 ++++++++ test/igrid/test_igrid.bash | 174 +++++++++++++ test/igrid/test_interactive_console.bash | 81 +++++++ 10 files changed, 1153 insertions(+), 8 deletions(-) create mode 100644 sstcomp/igrid/CMakeLists.txt create mode 100644 sstcomp/igrid/igridnode.cc create mode 100644 sstcomp/igrid/igridnode.h create mode 100644 sstcomp/igrid/kgdbg.h create mode 100644 test/igrid/igrid2d.py create mode 100644 test/igrid/test.igrid.ref create mode 100644 test/igrid/test.interactive.ref create mode 100755 test/igrid/test_igrid.bash create mode 100755 test/igrid/test_interactive_console.bash diff --git a/sstcomp/CMakeLists.txt b/sstcomp/CMakeLists.txt index 2de002a..6d41ca7 100644 --- a/sstcomp/CMakeLists.txt +++ b/sstcomp/CMakeLists.txt @@ -8,17 +8,14 @@ # #-- Include Paths -include_directories( - "${CMAKE_CURRENT_SOURCE_DIR}/include" -) - -#-- SST Compile Options -set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SST_LDFLAGS}" ) +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") #-- Components message(STATUS "[SST-TOOLS] Enabling dbgcli") add_subdirectory(dbgcli) -message(STATUS "[SST-TOOLS] Enabling grid") -add_subdirectory(grid) + +#-- Components +message(STATUS "[SST-TOOLS] Enabling igrid") +add_subdirectory(igrid) # EOF diff --git a/sstcomp/igrid/CMakeLists.txt b/sstcomp/igrid/CMakeLists.txt new file mode 100644 index 0000000..75396ce --- /dev/null +++ b/sstcomp/igrid/CMakeLists.txt @@ -0,0 +1,20 @@ +# +# sst-tools/sstcomp/igrid CMake +# +# Copyright (C) 2017-2025 Tactical Computing Laboratories, LLC +# All Rights Reserved +# contact@tactcomplabs.com +# See LICENSE in the top level directory for licensing details +# + +set(IGridSrcs + igridnode.cc + igridnode.h +) + +add_library(igrid SHARED ${IGridSrcs}) +target_include_directories(igrid PUBLIC ${SST_INSTALL_DIR}/include) +install(TARGETS igrid DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}) +install(CODE "execute_process(COMMAND sst-register igrid igrid_LIBDIR=${CMAKE_CURRENT_SOURCE_DIR})") + +# EOF diff --git a/sstcomp/igrid/igridnode.cc b/sstcomp/igrid/igridnode.cc new file mode 100644 index 0000000..23d69ec --- /dev/null +++ b/sstcomp/igrid/igridnode.cc @@ -0,0 +1,296 @@ +// +// _igridnode_cc_ +// +// Copyright (C) 2017-2024 Tactical Computing Laboratories, LLC +// All Rights Reserved +// contact@tactcomplabs.com +// +// See LICENSE in the top level directory for licensing details +// + +#include "igridnode.h" +#include "kgdbg.h" + +namespace SST::IGridNode{ + +//------------------------------------------ +// IGridNode +//------------------------------------------ +IGridNode::IGridNode(SST::ComponentId_t id, const SST::Params& params ) : + SST::Component( id ), timeConverter(nullptr), clockHandler(nullptr), + numPorts(8), minData(10), maxData(256), minDelay(20), maxDelay(100), clocks(1000), + curCycle(0), demoBug(0), dataMask(0x1ffffff), dataMax(0x1ffffff) { + + kgdbg::spinner("GRIDSPINNER"); + + const int Verbosity = params.find< int >( "verbose", 0 ); + output.init( + "IGridNode[" + getName() + ":@p:@t]: ", + Verbosity, 0, SST::Output::STDOUT ); + const std::string cpuClock = params.find< std::string >("clockFreq", "1GHz"); + clockHandler = new SST::Clock::Handler2(this); + timeConverter = registerClock(cpuClock, clockHandler); + registerAsPrimaryComponent(); + primaryComponentDoNotEndSim(); + + // read the rest of the parameters + numBytes = params.find("numBytes", 16384); + numPorts = params.find("numPorts", 8); + minData = params.find("minData", 10); + maxData = params.find("maxData", 256); + minDelay = params.find("minDelay", 50); + maxDelay = params.find("maxDelay", 100); + clocks = params.find("clocks", 1000); + rngSeed = params.find("rngSeed", 1223); + demoBug = params.find("demoBug", 0); + breakEnable = params.find("breakEnable", 0); + // bug injection + dataMax += demoBug; + + // sanity check the params + if (minData < 10) { + output.verbose(CALL_INFO, 1, 0, + "Warning: User specified minData < 10. Setting to 10\n"); + minData = 10; + } + if( maxData < minData ){ + output.fatal(CALL_INFO, -1, + "%s : maxData < minData\n", + getName().c_str()); + } + if( maxDelay < minDelay ){ + output.fatal(CALL_INFO, -1, + "%s : maxDelay < minDelay\n", + getName().c_str()); + } + + // setup the port links and their random generators + assert(numPorts==8); // TODO generalize this + portname.resize(numPorts); + for( unsigned i=0; i(this))); + + // The sending link and receiving links must have the same seed for the checking to work + // send: up=0, down=1, left=2, right=3 + // rcv: up=4, down=5, left=6, right=7 + #if 0 + // Keep same random sequence for all ports + rng.insert( {portname[i], new SST::RNG::MersenneRNG(params.find("rngSeed",rngSeed))} ); + #else + // Each port has unique random sequence. + // However, across components the data for each corresponding port will be the same. + // To add the complimentary port's component info to the seed could be a future enhancement. + int n = i<4 ? i : neighbor(i); + rng.insert( {portname[i], new SST::RNG::MersenneRNG(n + rngSeed)} ); + #endif + } + + // local random number generator. These can run independently for each component. + localRNG = new SST::RNG::MersenneRNG(id + rngSeed); + clkDelay = localRNG->generateNextUInt32() % (maxDelay-minDelay+1) + minDelay; + + // constructor complete + output.verbose( CALL_INFO, 5, 0, "Constructor complete\n" ); +} + +IGridNode::~IGridNode(){ + if (localRNG) delete localRNG; + for (unsigned i=0;i(ev); + auto data = cev->getData(); + output.verbose(CALL_INFO, 5, 0, + "%s: received %zu unsigned values\n", + getName().c_str(), + data.size()); + // Inbound data sequence + // [0] sending port number + // [1] r + // [2:(r-1)] random data + // Check the incoming data + + + unsigned send_port = data[0]; + assert(send_port < (portname.size()/2)); // TODO unrestrict bidirectional links + unsigned rcv_port = neighbor(send_port); + auto portRNG = rng[portname[rcv_port]]; + unsigned range = maxData - minData + 1; + unsigned r = portRNG->generateNextUInt32() % range + minData; + if (r != data.size()) { + output.fatal(CALL_INFO, -1, + "%s expected data size %" PRIu32 " does not match actual size %" PRIu64 "\n", + getName().c_str(), r, data.size()); + } + if (r != data[1]) { + output.fatal(CALL_INFO, -1, + "%s expected data[0] %" PRIu32 " does not match actual %" PRIu32 "\n", + getName().c_str(), r, data[0]); + } + for (unsigned i=2; igenerateNextUInt32() & dataMask; + if ( d != data[i] ) { + output.fatal(CALL_INFO, -1, + "%s expected data[%" PRIu32 "] %" PRIu32 " does not match actual %" PRIu32 "\n", + getName().c_str(), i, d, data[i]); + } + } + + // Interactive Console Debug Example + // breakEnable can be set from interactive console to enable/disable as long it is serialized + // Could also add triggers etc to control when to break + if (breakEnable == true) { + std::string message = "\tBreak to interactive console from event handler\n"; + SST::BaseComponent::initiateInteractive(message.c_str()); + } + + delete ev; +} + +void IGridNode::sendData(){ + // Iterate over sending ports. + // Treating links as unidirectional so the recieve port RNG tracks the send port. + // TODO: create 2 RNG's per port, one for send, one for recieve + for( unsigned port=0; port<(numPorts/2); port++ ){ + // generate a new payload + std::vector data; + unsigned range = maxData - minData + 1; + unsigned r = rng[portname[port]]->generateNextUInt32() % range + minData; + // Outbound data sequence + // [0] sending port number + // [1] number of ints + // [2:r-1] random data + data.push_back(port); + data.push_back(r); + for( unsigned i=2; igenerateNextUInt32()); + // This is to introduce an infrequent mismatch between sender and receiver + d = d & ( 0xfULL | (dataMask<<4) ); + if (d > dataMax) d = d & dataMask; + data.push_back(d); + } + output.verbose(CALL_INFO, 5, 0, + "%s: sending %zu unsigned values on link %d\n", + getName().c_str(), + data.size(), port); + IGridNodeEvent *ev = new IGridNodeEvent(data); + linkHandlers[port]->send(ev); + } +} + +unsigned IGridNode::neighbor(unsigned n) +{ + // send: up=0, down=1, left=2, right=3 + // rcv: up=4, down=5, left=6, right=7 + switch (n) { + case 0: + return 5; + case 1: + return 4; + case 2: + return 7; + case 3: + return 6; + case 4: + return 1; + case 5: + return 0; + case 6: + return 3; + case 7: + return 2; + default: + output.fatal(CALL_INFO, -1, "invalid port number\n"); + } + assert(false); + return 8; // invalid +} + +bool IGridNode::clockTick( SST::Cycle_t currentCycle ){ + + // sanity check the array + for( uint64_t i = 0; i < (numBytes/4ull); i++ ){ + if( state[i] != ((unsigned)(i) + rngSeed) ){ + // found a mismatch + output.fatal( CALL_INFO, -1, + "Error : found a mismatch data element: element %" PRIu64 " was %d and should have been %d\n", + i, state[i], ((unsigned)(i) + rngSeed)); + } + } + + // check to see whether we need to send data over the links + curCycle++; + if( curCycle >= clkDelay ){ + sendData(); + curCycle = 0; + clkDelay = localRNG->generateNextUInt32() % (maxDelay-minDelay+1) + minData; + } + + // check to see if we've reached the completion state + if( (uint64_t)(currentCycle) >= clocks ){ + output.verbose(CALL_INFO, 1, 0, + "%s ready to end simulation\n", + getName().c_str()); + primaryComponentOKToEndSim(); + return true; + } + + return false; +} + +} // namespace SST::IGridNode + +// EOF diff --git a/sstcomp/igrid/igridnode.h b/sstcomp/igrid/igridnode.h new file mode 100644 index 0000000..578f955 --- /dev/null +++ b/sstcomp/igrid/igridnode.h @@ -0,0 +1,209 @@ +// +// _igridnode_h_ +// +// Copyright (C) 2017-2024 Tactical Computing Laboratories, LLC +// All Rights Reserved +// contact@tactcomplabs.com +// +// See LICENSE in the top level directory for licensing details +// + +#ifndef _SST_IGRIDNODE_H_ +#define _SST_IGRIDNODE_H_ + +// -- Standard Headers +#include +#include +#include +#include +#include +#include +#include +#include + +// -- SST Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//SKK +//#include +//#include + +namespace SST::IGridNode{ + +// ------------------------------------------------------- +// IGridNodeEvent +// ------------------------------------------------------- +class IGridNodeEvent : public SST::Event{ +public: + /// IGridNodeEvent : standard constructor + IGridNodeEvent() : SST::Event() {} + + /// IGridNodeEvent: constructor + IGridNodeEvent(std::vector d) : SST::Event(), data(d) {} + + /// IGridNodeEvent: destructor + ~IGridNodeEvent() {} + + /// IGridNodeEvent: retrieve the data + std::vector const getData() { return data; } + +private: + std::vector data; ///< IGridNodeEvent: data payload + + /// IGridNodeEvent: serialization method + void serialize_order(SST::Core::Serialization::serializer& ser) override{ + Event::serialize_order(ser); + SST_SER(data) + } + + /// IGridNodeEvent: serialization implementor + ImplementSerializable(SST::IGridNode::IGridNodeEvent); + +}; // class IGridNodeEvent + +// ------------------------------------------------------- +// IGridNode +// ------------------------------------------------------- +class IGridNode : public SST::Component{ +public: + /// IGridNode: top-level SST component constructor + IGridNode( SST::ComponentId_t id, const SST::Params& params ); + + /// IGridNode: top-level SST component destructor + ~IGridNode(); + + /// IGridNode: standard SST component 'setup' function + void setup() override; + + /// IGridNode: standard SST component 'finish' function + void finish() override; + + /// IGridNode: standard SST component init function + void init( unsigned int phase ) override; + + /// IGridNode: standard SST component printStatus + void printStatus(Output& out) override; + + /// IGridNode: standard SST component clock function + bool clockTick( SST::Cycle_t currentCycle ); + + // ------------------------------------------------------- + // IGridNode Component Registration Data + // ------------------------------------------------------- + /// IGridNode: Register the component with the SST core + SST_ELI_REGISTER_COMPONENT( IGridNode, // component class + "igrid", // component library + "IGridNode", // component name + SST_ELI_ELEMENT_VERSION( 1, 0, 0 ), + "INTERACTIVE GRIDNODE SST COMPONENT", + COMPONENT_CATEGORY_UNCATEGORIZED ) + + SST_ELI_DOCUMENT_PARAMS( + {"verbose", "Sets the verbosity level of output", "0" }, + {"numBytes", "Internal state size (4 byte increments)", "16384"}, + {"numPorts", "Number of external ports", "8" }, + {"minData", "Minimum number of unsigned values", "10" }, + {"maxData", "Maximum number of unsigned values", "8192" }, + {"minDelay", "Minumum clock delay between sends", "50" }, + {"maxDelay", "Maximum clock delay between sends", "100" }, + {"clocks", "Clock cycles to execute", "1000"}, + {"clockFreq", "Clock frequency", "1GHz"}, + {"rngSeed", "Mersenne RNG Seed", "1223"}, + {"demoBug", "Induce bug for debug demo", "0"}, + {"breakEnable", "Enables break to interactive console from code", "False"}, + + ) + + // ------------------------------------------------------- + // IGridNode Component Port Data + // ------------------------------------------------------- + SST_ELI_DOCUMENT_PORTS( + {"port%(num_ports)d", + "Ports which connect to endpoints.", + {"chkpnt.IGridNodeEvent", ""} + } + ) + + // ------------------------------------------------------- + // IGridNode SubComponent Parameter Data + // ------------------------------------------------------- + SST_ELI_DOCUMENT_SUBCOMPONENT_SLOTS() + + // ------------------------------------------------------- + // IGridNode Component Statistics Data + // ------------------------------------------------------- + SST_ELI_DOCUMENT_STATISTICS() + + // ------------------------------------------------------- + // IGridNode Component Checkpoint Methods + // ------------------------------------------------------- + /// IGridNode: serialization constructor + IGridNode() : SST::Component() {} + + /// IGridNode: serialization + void serialize_order(SST::Core::Serialization::serializer& ser) override; + + /// IGridNode: serialization implementations + ImplementSerializable(SST::IGridNode::IGridNode) + +private: + // -- internal handlers + SST::Output output; ///< SST output handler + TimeConverter* timeConverter; ///< SST time conversion handler + SST::Clock::HandlerBase* clockHandler; ///< Clock Handler + + // -- parameters + uint64_t numBytes; ///< number of bytes of internal state + unsigned numPorts; ///< number of ports to configure + uint64_t minData; ///< minimum number of data elements + uint64_t maxData; ///< maxmium number of data elements + uint64_t minDelay; ///< minimum clock delay between sends + uint64_t maxDelay; ///< maximum clock delay between sends + uint64_t clocks; ///< number of clocks to execute + unsigned rngSeed; ///< base seed for random number generator + uint64_t curCycle; ///< current cycle delay + + // Bug injection + unsigned demoBug; ///< induce bug for debug demonstration + uint64_t dataMask; ///< send only 16 bits of data + uint64_t dataMax; ///< change to inject illegal values + + // -- internal state + uint64_t clkDelay = 0; ///< current clock delay + std::vector portname; ///< port 0 to numPorts names + std::vector linkHandlers; ///< LinkHandler objects + std::vector state; ///< internal data structure + std::map< std::string, SST::RNG::Random* > rng; ///< per port mersenne twister objects + SST::RNG::Random* localRNG = 0; ///< component local random number generator + + // Interactive Console Debug Example + // Break into interactive console for debug + // Can be enabled with cmd line parameter or modified from interactive console + volatile bool breakEnable; + + // -- private methods + /// event handler + void handleEvent(SST::Event *ev); + /// sends data to adjacent links + void sendData(); + /// calculates the port number for the receiver + unsigned neighbor(unsigned n); + +}; // class IGridNode +} // namespace SST::IGridNode + +#endif // _SST_IGRIDNODE_H_ + +// EOF diff --git a/sstcomp/igrid/kgdbg.h b/sstcomp/igrid/kgdbg.h new file mode 100644 index 0000000..fa6650c --- /dev/null +++ b/sstcomp/igrid/kgdbg.h @@ -0,0 +1,39 @@ +// +// Copyright (C) 2017-2024 Tactical Computing Laboratories, LLC +// All Rights Reserved +// contact@tactcomplabs.com +// See LICENSE in the top level directory for licensing details +// + +#ifndef _KGDBG_H +#define _KGDBG_H + +#include +#include + +namespace kgdbg { + +static inline void spin(const char* id = "") { + std::cout << id << " spinning" << std::endl; + unsigned long spinner = 1; + while( spinner > 0 ) { + spinner++; + usleep(100000); + if( spinner % 10 == 0 ) // breakpoint here + std::cout << "." << std::flush; + } + std::cout << std::endl; +} + +static inline void spinner( const char* id, bool cond = true ) { + if( !std::getenv( id ) ) + return; + if( !cond ) + return; + spin(id); +} + + +} //namespace kgdbg + +#endif //_KGDBG_H diff --git a/test/igrid/igrid2d.py b/test/igrid/igrid2d.py new file mode 100644 index 0000000..c7308d2 --- /dev/null +++ b/test/igrid/igrid2d.py @@ -0,0 +1,101 @@ +# +# Copyright (C) 2017-2025 Tactical Computing Laboratories, LLC +# All Rights Reserved +# contact@tactcomplabs.com +# +# See LICENSE in the top level directory for licensing details +# +# 2d.py +# + +import argparse +import os +import sst + +parser = argparse.ArgumentParser(description="2d grid network test 1 with checkpoint/restart checks") +parser.add_argument("--x", type=int, help="number of horizonal components", default=2) +parser.add_argument("--y", type=int, help="number of vertical components", default=1) +parser.add_argument("--numBytes", type=int, help="Internal state size (4 byte increments)", default=16384) +parser.add_argument("--minData", type=int, help="Minimum number of dwords transmitted per link", default=10) +parser.add_argument("--maxData", type=int, help="Maximum number of dwords transmitted per link", default=256) +parser.add_argument("--clocks", type=int, help="number of clocks to run sim", default=10000) +parser.add_argument("--minDelay", type=int, help="min number of clocks between transmissions", default=50) +parser.add_argument("--maxDelay", type=int, help="max number of clocks between transmissions", default=100) +parser.add_argument("--rngSeed", type=int, help="seed for random number generator", default=1223) +parser.add_argument("--demoBug", type=int, help="induce bug for debug demonstration", default=0) +parser.add_argument("--breakEnable", help="Enables breaks to interactive console from code (requires --interactive-console)", action='store_true', default=False) +parser.add_argument("--verbose", type=int, help="verbosity level", default=1) +args = parser.parse_args() + +print("Interactive 2d grid test SST Simulation Configuration:") +for arg in vars(args): + print("\t", arg, " = ", getattr(args, arg)) + +# the number of ports must always be 8 but may change this later +PORTS = 8 +comp_params = { + "verbose" : args.verbose, + "numBytes" : args.numBytes, + "numPorts" : PORTS, + "minData" : args.minData, + "maxData" : args.maxData, + "minDelay" : args.minDelay, + "maxDelay" : args.maxDelay, + "clocks" : args.clocks, + "rngSeed" : args.rngSeed, + "clockFreq" : "1Ghz", + "demoBug" : args.demoBug, + "breakEnable" : args.breakEnable, +} + +class IGRIDNODE(): + def __init__(self, x, y): + id = f"cp_{x}_{y}" + self.id = id + self.comp = sst.Component(id, "igrid.IGridNode" ) + self.comp.addParams(comp_params) + # everyone gets 8 links, up/down/left/right, send/rcv + # links here are associated with this component's send ports + self.upLink = sst.Link(f"upLink_{x}_{y}") + self.downLink = sst.Link(f"downLink_{x}_{y}") + self.leftLink = sst.Link(f"leftLink_{x}_{y}") + self.rightLink = sst.Link(f"rightLink_{x}_{y}") + # identify neighborhood + self.neighbor = {} + self.neighbor['u'] = f"cp_{x}_{(y+1)%args.y}" + self.neighbor['d'] = f"cp_{x}_{(y-1)%args.y}" + self.neighbor['l'] = f"cp_{(x-1)%args.x}_{y}" + self.neighbor['r'] = f"cp_{(x+1)%args.x}_{y}" + +if args.x==2 and args.y==1: + # for known good check + cp0 = sst.Component("cp0", "igrid.IGridNode") + cp0.addParams(comp_params) + cp1 = sst.Component("cp1", "igrid.IGridNode") + cp1.addParams(comp_params) + link = [None] * PORTS + for i in range(0, PORTS): + print(f"Creating link {i}") + link[i] = sst.Link(f"link{i}") + link[i].connect( (cp0, f"port{i}", "1us"), (cp1, f"port{i}", "1us") ) +else: + # create grid components + grid = {} + for x in range(args.x): + for y in range(args.y): + comp = IGRIDNODE(x,y) + grid[comp.id] = comp + + # connect send ports to adjacent rcv ports. Edge nodes wrap around + # send: up=0, down=1, left=2, right=3 + # rcv: up=4, down=5, left=6, right=7 + for node in grid: + print(f"Connecting {node}") + tile = igrid[node] + comp=tile.comp + tile.upLink.connect( (comp, f"port{0}", "1us"), (igrid[tile.neighbor['u']].comp, f"port{5}", "1us") ) + tile.downLink.connect( (comp, f"port{1}", "1us"), (igrid[tile.neighbor['d']].comp, f"port{4}", "1us") ) + tile.leftLink.connect( (comp, f"port{2}", "1us"), (igrid[tile.neighbor['l']].comp, f"port{7}", "1us") ) + tile.rightLink.connect( (comp, f"port{3}", "1us"), (grid[tile.neighbor['r']].comp, f"port{6}", "1us") ) + +# EOF diff --git a/test/igrid/test.igrid.ref b/test/igrid/test.igrid.ref new file mode 100644 index 0000000..968ccb7 --- /dev/null +++ b/test/igrid/test.igrid.ref @@ -0,0 +1,130 @@ +-- Test 1 -- +sst --add-lib-path=../../sstcomp/igrid --interactive-console=sst.interactive.simpledebug igrid2d.py -- --clock 1060 --breakEnable + +Interactive 2d grid test SST Simulation Configuration: + x = 2 + y = 1 + numBytes = 16384 + minData = 10 + maxData = 256 + clocks = 1060 + minDelay = 50 + maxDelay = 100 + rngSeed = 1223 + demoBug = 0 + breakEnable = True + verbose = 1 +Creating link 0 +Creating link 1 +Creating link 2 +Creating link 3 +Creating link 4 +Creating link 5 +Creating link 6 +Creating link 7 +Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> IGridNode[cp0:clockTick:1060000]: cp0 ready to end simulation +IGridNode[cp1:clockTick:1060000]: cp1 ready to end simulation +Simulation is complete, simulated time: 1.06 us + +-- Test 2 -- +sst --add-lib-path=../../sstcomp/igrid --interactive-console=sst.interactive.simpledebug igrid2d.py -- --clock 1060 --breakEnable + +Interactive 2d grid test SST Simulation Configuration: + x = 2 + y = 1 + numBytes = 16384 + minData = 10 + maxData = 256 + clocks = 1060 + minDelay = 50 + maxDelay = 100 + rngSeed = 1223 + demoBug = 0 + breakEnable = True + verbose = 1 +Creating link 0 +Creating link 1 +Creating link 2 +Creating link 3 +Creating link 4 +Creating link 5 +Creating link 6 +Creating link 7 +Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> Entering interactive mode at time 1054000 + Break to interactive console from event handler + +> > > > > > IGridNode[cp0:clockTick:1060000]: cp0 ready to end simulation +IGridNode[cp1:clockTick:1060000]: cp1 ready to end simulation +Simulation is complete, simulated time: 1.06 us + +-- Test 3 -- +sst --add-lib-path=../../sstcomp/igrid igrid2d.py -- --clock 1060 --breakEnable + +Interactive 2d grid test SST Simulation Configuration: + x = 2 + y = 1 + numBytes = 16384 + minData = 10 + maxData = 256 + clocks = 1060 + minDelay = 50 + maxDelay = 100 + rngSeed = 1223 + demoBug = 0 + breakEnable = True + verbose = 1 +Creating link 0 +Creating link 1 +Creating link 2 +Creating link 3 +Creating link 4 +Creating link 5 +Creating link 6 +Creating link 7 +IGridNode[cp0:clockTick:1060000]: cp0 ready to end simulation +IGridNode[cp1:clockTick:1060000]: cp1 ready to end simulation +Simulation is complete, simulated time: 1.06 us + +-- Test 4 -- +sst --add-lib-path=../../sstcomp/igrid igrid2d.py -- --clock 1060 + +Interactive 2d grid test SST Simulation Configuration: + x = 2 + y = 1 + numBytes = 16384 + minData = 10 + maxData = 256 + clocks = 1060 + minDelay = 50 + maxDelay = 100 + rngSeed = 1223 + demoBug = 0 + breakEnable = False + verbose = 1 +Creating link 0 +Creating link 1 +Creating link 2 +Creating link 3 +Creating link 4 +Creating link 5 +Creating link 6 +Creating link 7 +IGridNode[cp0:clockTick:1060000]: cp0 ready to end simulation +IGridNode[cp1:clockTick:1060000]: cp1 ready to end simulation +Simulation is complete, simulated time: 1.06 us + diff --git a/test/igrid/test.interactive.ref b/test/igrid/test.interactive.ref new file mode 100644 index 0000000..cefe513 --- /dev/null +++ b/test/igrid/test.interactive.ref @@ -0,0 +1,98 @@ +Interactive 2d grid test SST Simulation Configuration: + x = 2 + y = 1 + numBytes = 16384 + minData = 10 + maxData = 256 + clocks = 400000 + minDelay = 50 + maxDelay = 100 + rngSeed = 1223 + demoBug = 0 + breakEnable = False + verbose = 1 +Creating link 0 +Creating link 1 +Creating link 2 +Creating link 3 +Creating link 4 +Creating link 5 +Creating link 6 +Creating link 7 +1 us +Entering interactive mode at time 1000000 +Interactive start at 1000000 +> () +> cp1/ (SST::IGridNode::IGridNode) +cp0/ (SST::IGridNode::IGridNode) +> > my_info/ () +clockHandler/ (SST::SSTHandler2) +numBytes = 16384 (unsigned long) +numPorts = 8 (unsigned int) +minData = 10 (unsigned long) +maxData = 256 (unsigned long) +minDelay = 50 (unsigned long) +maxDelay = 100 (unsigned long) +clkDelay = 10 (unsigned long) +clocks = 400000 (unsigned long) +rngSeed = 1223 (unsigned int) +state/ (std::vector >) +curCycle = 7 (unsigned long) +portname/ (std::vector, std::allocator >, std::allocator, std::allocator > > >) +localRNG/ (SST::RNG::MersenneRNG) +linkHandlers/ (std::vector >) +demoBug = 0 (unsigned int) +dataMask = 33554431 (unsigned long) +dataMax = 33554431 (unsigned long) +breakEnable = 0 (bool) +> cp0 (SST::IGridNode::IGridNode) +> my_info () + id = 0 (unsigned long) + type = igrid.IGridNode (std::string) + defaultTimeBase = 1 ns (SST::TimeConverter) +> current time = 1000000 +> > my_info/ () +clockHandler/ (SST::SSTHandler2) +numBytes = 16384 (unsigned long) +numPorts = 8 (unsigned int) +minData = 10 (unsigned long) +maxData = 100 (unsigned long) +minDelay = 50 (unsigned long) +maxDelay = 100 (unsigned long) +clkDelay = 10 (unsigned long) +clocks = 400000 (unsigned long) +rngSeed = 1223 (unsigned int) +state/ (std::vector >) +curCycle = 7 (unsigned long) +portname/ (std::vector, std::allocator >, std::allocator, std::allocator > > >) +localRNG/ (SST::RNG::MersenneRNG) +linkHandlers/ (std::vector >) +demoBug = 0 (unsigned int) +dataMask = 33554431 (unsigned long) +dataMax = 33554431 (unsigned long) +breakEnable = 0 (bool) +> > my_info/ () +clockHandler/ (SST::SSTHandler2) +numBytes = 16384 (unsigned long) +numPorts = 8 (unsigned int) +minData = 10 (unsigned long) +maxData = 256 (unsigned long) +minDelay = 50 (unsigned long) +maxDelay = 100 (unsigned long) +clkDelay = 10 (unsigned long) +clocks = 400000 (unsigned long) +rngSeed = 1223 (unsigned int) +state/ (std::vector >) +curCycle = 7 (unsigned long) +portname/ (std::vector, std::allocator >, std::allocator, std::allocator > > >) +localRNG/ (SST::RNG::MersenneRNG) +linkHandlers/ (std::vector >) +demoBug = 0 (unsigned int) +dataMask = 33554431 (unsigned long) +dataMax = 33554431 (unsigned long) +breakEnable = 0 (bool) +> Entering interactive mode at time 2000000 +Running clock 1000000 sim cycles +> IGridNode[cp0:clockTick:400000000]: cp0 ready to end simulation +IGridNode[cp1:clockTick:400000000]: cp1 ready to end simulation +Simulation is complete, simulated time: 400 us diff --git a/test/igrid/test_igrid.bash b/test/igrid/test_igrid.bash new file mode 100755 index 0000000..a954cd3 --- /dev/null +++ b/test/igrid/test_igrid.bash @@ -0,0 +1,174 @@ +#!/bin/bash + +# Test break from code into interactive console via real time actions +# +# 0) Set up pipe +# 1) launch the program in the background +# 4) run commands in interactive consols +# 5) wait for completion +# 6) check results + +# Settings +CLOCK=1060 +LIBPATH="../../sstcomp/igrid" + + +# 0) Set up the pipe +pipe=/tmp/testpipe +if [[ ! -p $pipe ]]; then + echo "Creating pipe: $pipe" + mkfifo $pipe +fi + +# 1) Launch the program in the background, running long enough to send signal +if [[ -f test.igrid.out ]]; then + rm test.igrid.out +fi + +# -------------------------------------------------------------------------- +# TEST 1: repeat run until simulation complete +# --------------------------------------------------------------------------- +echo "-- Test 1 --" >> test.igrid.out +LAUNCH="sst --add-lib-path=$LIBPATH --interactive-console=sst.interactive.simpledebug igrid2d.py -- --clock $CLOCK --breakEnable" + +echo $LAUNCH +echo $LAUNCH >> test.igrid.out +echo >> test.igrid.out + +$LAUNCH < $pipe >> test.igrid.out & +exec 3>$pipe # Opens pipe for writing +sleep 2 + + +# 2) Send commands in interactive console +sleep 2 +echo run > $pipe +echo run > $pipe +echo run > $pipe +echo run > $pipe + +# 3) Wait for completion +wait +exec 3>&- # close pipe +echo InteractiveConsole Break Test 1 Complete +echo >> test.igrid.out + +# 4) Check results +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR $sigusr=$action return code" + exit $retVal +fi + +# -------------------------------------------------------------------------- +# TEST 2: clear breakEnable after first run +# --------------------------------------------------------------------------- +echo "-- Test 2 --" >> test.igrid.out +LAUNCH="sst --add-lib-path=$LIBPATH --interactive-console=sst.interactive.simpledebug igrid2d.py -- --clock $CLOCK --breakEnable" + +echo $LAUNCH +echo $LAUNCH >> test.igrid.out +echo >> test.igrid.out + +$LAUNCH < $pipe >> test.igrid.out & +exec 3>$pipe # Opens pipe for writing +sleep 2 + + +# 2) Send commands in interactive console +sleep 2 +echo run > $pipe +echo cd cp0 > $pipe +echo set breakEnable 0 > $pipe +echo cd .. > $pipe +echo cd cp1 > $pipe +echo set breakEnable 0 > $pipe +echo run > $pipe + +# 3) Wait for completion +wait +exec 3>&- # close pipe +echo InteractiveConsole Break Test 2 Complete +echo >> test.igrid.out + +# 4) Check results +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR $sigusr=$action return code" + exit $retVal +fi + +# -------------------------------------------------------------------------- +# TEST 3: Check that it disables break if interactive-console not specified i +# ---------------------------------------------------------------------------i +echo "-- Test 3 --" >> test.igrid.out +LAUNCH="sst --add-lib-path=$LIBPATH igrid2d.py -- --clock $CLOCK --breakEnable" + +echo $LAUNCH +echo $LAUNCH >> test.igrid.out +echo >> test.igrid.out + +$LAUNCH < $pipe >> test.igrid.out & +exec 3>$pipe # Opens pipe for writing +sleep 2 + + +# 2) Send commands in interactive console +sleep 2 + +# 3) Wait for completion +wait +exec 3>&- # close pipe +echo InteractiveConsole Break Test 3 Complete +echo >> test.igrid.out + +# 4) Check results +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR $sigusr=$action return code" + exit $retVal +fi + +# -------------------------------------------------------------------------- +# TEST 4: Check that it completes with no breakEnable +# --------------------------------------------------------------------------- +echo "-- Test 4 --" >> test.igrid.out +LAUNCH="sst --add-lib-path=$LIBPATH igrid2d.py -- --clock $CLOCK" + +echo $LAUNCH +echo $LAUNCH >> test.igrid.out +echo >> test.igrid.out + +$LAUNCH < $pipe >> test.igrid.out & +exec 3>$pipe # Opens pipe for writing +sleep 2 + + +# 2) Send commands in interactive console +sleep 2 + +# 3) Wait for completion +wait +exec 3>&- # close pipe +echo InteractiveConsole Break Test 4 Complete +echo >> test.igrid.out + +# 4) Check results +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR $sigusr=$action return code" + exit $retVal +fi + +# Diff results with reference file +$(diff test.igrid.ref test.igrid.out) +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR Output does not match reference" + exit $retVal +fi +echo + +echo "PASS" +exit $retVal + diff --git a/test/igrid/test_interactive_console.bash b/test/igrid/test_interactive_console.bash new file mode 100755 index 0000000..58df8a3 --- /dev/null +++ b/test/igrid/test_interactive_console.bash @@ -0,0 +1,81 @@ +#!/bin/bash + +# Test sigusr1/2 real with interactive console real time actions +# +# 0) Set up pipe +# 1) launch the program in the background +# 4) run commands in interactive consols +# 5) wait for completion +# 6) check results + +# Settings +CLOCK=400000 +LIBPATH="../../sst-bench/igrid" +CONFIG="igrid2d.py" + +# 0) Set up the pipe +pipe=/tmp/testpipe +#mkfifo $pipe +if [[ ! -p $pipe ]]; then + echo "Creating pipe: $pipe" + mkfifo $pipe +fi + +# 1) Launch the program in the background, running long enough to send signal +if [[ -f test.interactive.out ]]; then + rm test.interactive.out +fi + +LAUNCH="sst --add-lib-path=$LIBPATH --interactive-console=sst.interactive.simpledebug --interactive-start=1us $CONFIG -- --clock $CLOCK" +echo $LAUNCH +$LAUNCH < $pipe > test.interactive.out & +exec 3>$pipe # Opens pipe for writing +sleep 2 + + +# 2) Send commands in interactive console +sleep 2 +echo pwd > $pipe +echo ls > $pipe +echo cd cp0 > $pipe +echo ls > $pipe +echo pwd > $pipe +echo print my_info > $pipe +echo time > $pipe +echo set maxData 100 > $pipe +echo ls > $pipe +echo set maxData 256 > $pipe +echo ls > $pipe +echo run 1us > $pipe +echo run > $pipe + +# 3) Wait for completion +wait +exec 3>&- # close pipe +echo InteractiveConsole Test Complete + +# 4) Check results +retVal=$? +if [ $retVal -ne 0 ]; then + echo "ERROR $sigusr=$action return code" + exit $retVal +fi + +# Diff results with reference file +$(diff test.interactive.ref test.interactive.out) +retVal=$? +if [[ $retVal -ne 0 ]]; then + echo "ERROR Output does not match reference" + exit $retVal +fi +echo + +echo "PASS" +exit $retVal + + + + + + + From a3bb16a9d7f4e685701ecc1b67938d72e81da658 Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Fri, 14 Mar 2025 12:13:09 -0500 Subject: [PATCH 2/6] Clean up compiler warnings --- sstcomp/igrid/igridnode.cc | 30 +++++++++++++++--------------- sstcomp/igrid/igridnode.h | 8 ++------ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/sstcomp/igrid/igridnode.cc b/sstcomp/igrid/igridnode.cc index 23d69ec..07d246c 100644 --- a/sstcomp/igrid/igridnode.cc +++ b/sstcomp/igrid/igridnode.cc @@ -23,7 +23,7 @@ IGridNode::IGridNode(SST::ComponentId_t id, const SST::Params& params ) : kgdbg::spinner("GRIDSPINNER"); - const int Verbosity = params.find< int >( "verbose", 0 ); + const unsigned Verbosity = params.find< unsigned >( "verbose", 0 ); output.init( "IGridNode[" + getName() + ":@p:@t]: ", Verbosity, 0, SST::Output::STDOUT ); @@ -43,7 +43,7 @@ IGridNode::IGridNode(SST::ComponentId_t id, const SST::Params& params ) : clocks = params.find("clocks", 1000); rngSeed = params.find("rngSeed", 1223); demoBug = params.find("demoBug", 0); - breakEnable = params.find("breakEnable", 0); + breakEnable = (int) params.find("breakEnable", 0); // bug injection dataMax += demoBug; @@ -83,13 +83,13 @@ IGridNode::IGridNode(SST::ComponentId_t id, const SST::Params& params ) : // Each port has unique random sequence. // However, across components the data for each corresponding port will be the same. // To add the complimentary port's component info to the seed could be a future enhancement. - int n = i<4 ? i : neighbor(i); + unsigned n = i<4 ? i : neighbor(i); rng.insert( {portname[i], new SST::RNG::MersenneRNG(n + rngSeed)} ); #endif } // local random number generator. These can run independently for each component. - localRNG = new SST::RNG::MersenneRNG(id + rngSeed); + localRNG = new SST::RNG::MersenneRNG((uint32_t) (id + rngSeed)); clkDelay = localRNG->generateNextUInt32() % (maxDelay-minDelay+1) + minDelay; // constructor complete @@ -167,24 +167,24 @@ void IGridNode::handleEvent(SST::Event *ev){ assert(send_port < (portname.size()/2)); // TODO unrestrict bidirectional links unsigned rcv_port = neighbor(send_port); auto portRNG = rng[portname[rcv_port]]; - unsigned range = maxData - minData + 1; - unsigned r = portRNG->generateNextUInt32() % range + minData; + uint64_t range = maxData - minData + 1; + uint64_t r = portRNG->generateNextUInt32() % range + minData; if (r != data.size()) { output.fatal(CALL_INFO, -1, - "%s expected data size %" PRIu32 " does not match actual size %" PRIu64 "\n", + "%s expected data size %" PRIu64 " does not match actual size %" PRIu64 "\n", getName().c_str(), r, data.size()); } if (r != data[1]) { output.fatal(CALL_INFO, -1, - "%s expected data[0] %" PRIu32 " does not match actual %" PRIu32 "\n", + "%s expected data[0] %" PRIu64 " does not match actual %" PRIu32 "\n", getName().c_str(), r, data[0]); } for (unsigned i=2; igenerateNextUInt32() & dataMask; + uint64_t d = (unsigned)portRNG->generateNextUInt32() & dataMask; if ( d != data[i] ) { output.fatal(CALL_INFO, -1, - "%s expected data[%" PRIu32 "] %" PRIu32 " does not match actual %" PRIu32 "\n", + "%s expected data[%" PRIu32 "] %" PRIu64 " does not match actual %" PRIu32 "\n", getName().c_str(), i, d, data[i]); } } @@ -192,7 +192,7 @@ void IGridNode::handleEvent(SST::Event *ev){ // Interactive Console Debug Example // breakEnable can be set from interactive console to enable/disable as long it is serialized // Could also add triggers etc to control when to break - if (breakEnable == true) { + if (breakEnable) { std::string message = "\tBreak to interactive console from event handler\n"; SST::BaseComponent::initiateInteractive(message.c_str()); } @@ -207,20 +207,20 @@ void IGridNode::sendData(){ for( unsigned port=0; port<(numPorts/2); port++ ){ // generate a new payload std::vector data; - unsigned range = maxData - minData + 1; - unsigned r = rng[portname[port]]->generateNextUInt32() % range + minData; + uint64_t range = maxData - minData + 1; + uint64_t r = rng[portname[port]]->generateNextUInt32() % range + minData; // Outbound data sequence // [0] sending port number // [1] number of ints // [2:r-1] random data data.push_back(port); - data.push_back(r); + data.push_back((uint32_t) r); for( unsigned i=2; igenerateNextUInt32()); // This is to introduce an infrequent mismatch between sender and receiver d = d & ( 0xfULL | (dataMask<<4) ); if (d > dataMax) d = d & dataMask; - data.push_back(d); + data.push_back((uint32_t) d); } output.verbose(CALL_INFO, 5, 0, "%s: sending %zu unsigned values on link %d\n", diff --git a/sstcomp/igrid/igridnode.h b/sstcomp/igrid/igridnode.h index 578f955..5546359 100644 --- a/sstcomp/igrid/igridnode.h +++ b/sstcomp/igrid/igridnode.h @@ -36,10 +36,6 @@ #include #include -//SKK -//#include -//#include - namespace SST::IGridNode{ // ------------------------------------------------------- @@ -122,7 +118,7 @@ class IGridNode : public SST::Component{ {"clockFreq", "Clock frequency", "1GHz"}, {"rngSeed", "Mersenne RNG Seed", "1223"}, {"demoBug", "Induce bug for debug demo", "0"}, - {"breakEnable", "Enables break to interactive console from code", "False"}, + {"breakEnable", "Enables break to interactive console from code", "0"}, ) @@ -191,7 +187,7 @@ class IGridNode : public SST::Component{ // Interactive Console Debug Example // Break into interactive console for debug // Can be enabled with cmd line parameter or modified from interactive console - volatile bool breakEnable; + volatile int breakEnable; // -- private methods /// event handler From 44a01287f1d8bee00a403c4ab84f6eb353b63e53 Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Fri, 14 Mar 2025 13:26:36 -0500 Subject: [PATCH 3/6] Add README for igrid --- sstcomp/igrid/README | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 sstcomp/igrid/README diff --git a/sstcomp/igrid/README b/sstcomp/igrid/README new file mode 100644 index 0000000..5386379 --- /dev/null +++ b/sstcomp/igrid/README @@ -0,0 +1,19 @@ +Interactive Console Break Example + +This code provides an example of breaking into an interactive console from +a component (in this case in the event handler). It defines a breakEnable +variable that can be set from the command line. It can also be set from +the interactive console to turn the break capability on/off during execution. +Note that setting breakEnable from the command line enables it for all +components. However, modifying it from the interactive console must be done +for each component. So, for example, you could "set breakEnable 0" for the +instance in component 0 but it would still be enabled in other components. + +This version uses the BaseComponent::initiateInteractive() functionality +to break into the interactive console. This is different from the +interactive_rt branch which used the realtime action directly. (This is an +invalid use of realtime actions per Sandia.) + +This example could be expanded to support more complex debugging funtionality. + + From 2234fbdbbdd27ea7669612b756effd1cdb37f2a4 Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Fri, 14 Mar 2025 14:12:00 -0500 Subject: [PATCH 4/6] Update sstcomp CMakeLists --- sstcomp/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sstcomp/CMakeLists.txt b/sstcomp/CMakeLists.txt index 6d41ca7..8cac9ae 100644 --- a/sstcomp/CMakeLists.txt +++ b/sstcomp/CMakeLists.txt @@ -8,13 +8,18 @@ # #-- Include Paths -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") +include_directories( + "${CMAKE_CURRENT_SOURCE_DIR}/include" +) + +#-- SST Compile Options +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SST_LDFLAGS}" ) #-- Components message(STATUS "[SST-TOOLS] Enabling dbgcli") add_subdirectory(dbgcli) - -#-- Components +message(STATUS "[SST-TOOLS] Enabling grid") +add_subdirectory(grid) message(STATUS "[SST-TOOLS] Enabling igrid") add_subdirectory(igrid) From a283381f7452cc69fcab3d667c15f2ef904401ec Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Fri, 14 Mar 2025 14:45:59 -0500 Subject: [PATCH 5/6] Update reference output --- test/igrid/test.interactive.ref | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/igrid/test.interactive.ref b/test/igrid/test.interactive.ref index cefe513..b858fbf 100644 --- a/test/igrid/test.interactive.ref +++ b/test/igrid/test.interactive.ref @@ -44,7 +44,7 @@ linkHandlers/ (std::vector >) demoBug = 0 (unsigned int) dataMask = 33554431 (unsigned long) dataMax = 33554431 (unsigned long) -breakEnable = 0 (bool) +breakEnable = 0 (int) > cp0 (SST::IGridNode::IGridNode) > my_info () id = 0 (unsigned long) @@ -70,7 +70,7 @@ linkHandlers/ (std::vector >) demoBug = 0 (unsigned int) dataMask = 33554431 (unsigned long) dataMax = 33554431 (unsigned long) -breakEnable = 0 (bool) +breakEnable = 0 (int) > > my_info/ () clockHandler/ (SST::SSTHandler2) numBytes = 16384 (unsigned long) @@ -90,7 +90,7 @@ linkHandlers/ (std::vector >) demoBug = 0 (unsigned int) dataMask = 33554431 (unsigned long) dataMax = 33554431 (unsigned long) -breakEnable = 0 (bool) +breakEnable = 0 (int) > Entering interactive mode at time 2000000 Running clock 1000000 sim cycles > IGridNode[cp0:clockTick:400000000]: cp0 ready to end simulation From 7079a4fff9398a002b3112895d7cc2fb2a8a120e Mon Sep 17 00:00:00 2001 From: Shannon Kuntz Date: Tue, 18 Mar 2025 16:50:07 -0500 Subject: [PATCH 6/6] Use SST.h to resolve compiler warnings. Clean up. --- sstcomp/igrid/igridnode.h | 14 +------------- test/igrid/test_interactive_console.bash | 2 +- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/sstcomp/igrid/igridnode.h b/sstcomp/igrid/igridnode.h index 5546359..a53d50b 100644 --- a/sstcomp/igrid/igridnode.h +++ b/sstcomp/igrid/igridnode.h @@ -22,19 +22,7 @@ #include // -- SST Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "SST.h" namespace SST::IGridNode{ diff --git a/test/igrid/test_interactive_console.bash b/test/igrid/test_interactive_console.bash index 58df8a3..c16053d 100755 --- a/test/igrid/test_interactive_console.bash +++ b/test/igrid/test_interactive_console.bash @@ -1,6 +1,6 @@ #!/bin/bash -# Test sigusr1/2 real with interactive console real time actions +# Test interactive console real time actions # # 0) Set up pipe # 1) launch the program in the background