Skip to content

Merlin LinkControl initialization error in simple 2-router mesh (TrafficGen endpoints) #2661

Description

@gandhiomkar

Hi ,
I’m new to SST framework and trying to build a very simple setup: a peer-to-peer network with two routers directly connected, each with one merlin.trafficgen endpoint. I’ve run into a LinkControl initialization error

Setup

  • SST version: 14.1.0 (also reproduced on 15.x)
  • Topology: 2 routers using merlin.mesh (shape 2:1)
  • Each router has 1 local port connected to a trafficgen endpoint
  • Routers are directly connected to each other

here is the network graph created by sst with graphViz:
Image

Error

I consistently get the following fatal error during initialization:

Error during LinkControl protocol initialization. The most likely cause of this is connecting an endpoint to a router port expecting to be connected to another router.

full stack trace:
error:

FATAL: Rank: 0,0, time: 0 - called in file: interfaces/linkControl.cc, line: 224, function: init
Element name: endpoint1,  type: merlin.linkcontrol (full type tree: merlin.trafficgen.merlin.linkcontrol)
Error during LinkControl protocol initialization.  The most likely cause of this is connecting an endpoint to a router port expecting to be connnected to another router.

SST Fatal Backtrace Information:
    0 : sst(_ZNK3SST6Output5fatalEjPKcS2_iS2_z+0x38a) [0x5ea0085400a6]
    1 : sst(_ZNK3SST13BaseComponent6vfatalEjPKcS2_iS2_P13__va_list_tag+0x324) [0x5ea008461992]
    2 : sst(_ZNK3SST13BaseComponent10sst_assertEbjPKcS2_iS2_z+0xf2) [0x5ea008461d3a]
    3 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin11LinkControl17checkInitProtocolEPNS_5EventENS0_12RtrInitEvent8CommandsEjPKcS7_+0xaa) [0x7873b3e8a92a]
    4 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin11LinkControl4initEj+0x249) [0x7873b3e8ab7d]
    5 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin10TrafficGen4initEj+0x3d) [0x7873b3e74097]
    6 : sst(_ZN3SST15Simulation_impl10initializeEv+0xf1) [0x5ea0085791df]
    7 : sst(+0x5390c8) [0x5ea0084060c8]
    8 : sst(main+0x2237) [0x5ea008408943]
    9 : /lib/x86_64-linux-gnu/libc.so.6(+0x2a1ca) [0x7873bbe2a1ca]
   10 : /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x8b) [0x7873bbe2a28b]
   11 : sst(_start+0x25) [0x5ea008403bb5]
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 1.

Debugging details

I traced the issue into LinkControl::checkInitProtocol():

  • The code expects a RtrInitEvent::REPORT_FLIT_SIZE
  • However, the received event has command REPORT_ID
  • This causes the assertion to fail

Relevant snippet:

ev = rtr_link->recvUntimedData();
init_ev = checkInitProtocol(ev, RtrInitEvent::REPORT_FLIT_SIZE, CALL_INFO);

RtrInitEvent* LinkControl::checkInitProtocol(Event* ev, RtrInitEvent::Commands command, uint32_t line, const char* file, const char* func)
{
    bool good = true;
    RtrInitEvent* init_ev = nullptr;
    // Check to make sure the event isn't null and that it is an init event
    if ( nullptr == ev || static_cast<BaseRtrEvent*>(ev)->getType() != BaseRtrEvent::INITIALIZATION ) good = false;

    if ( good ) {
        init_ev = static_cast<RtrInitEvent*>(ev);

        // Now check to make sure this is the right protocol event
        if ( init_ev->command != command ) {
            good = false;
        }
    }

    sst_assert(good, line, file, func, 1, "Error during LinkControl protocol initialization.  The most likely cause of this is connecting an endpoint to a router port expecting to be connnected to another router.\n");
    return init_ev;
}

From what I understand, this suggests a mismatch in initialization protocol between components.

My current configuration

import sst

link_bw = "5GB/s"
flit_size = "72B"
lat = "1ns"
buf_size = "1440B"

router_params = {
    "link_bw": link_bw,
    "flit_size": flit_size,
    "xbar_bw": "5GB/s",
    "input_buf_size": buf_size,
    "output_buf_size": buf_size,
    "local_ports": 1,
    "num_ports": 3,
    "input_latency": "1ns",
    "output_latency": "1ns",
    "vn_remap": "linear",
    "topology": "topology"
}

topo_params = {
    "mesh.shape": "2:1",
    "mesh.width": "1:1",
    "mesh.local_ports": 1,
    "network_name": "main_net"
}

routers = {}
for i in range(2):
    rtr = sst.Component(f"router{i}", "merlin.hr_router")
    rtr.addParams(router_params)
    rtr.addParam("id", i)

    topo = rtr.setSubComponent("topology", "merlin.mesh")
    topo.addParams(topo_params)

    ep = sst.Component(f"endpoint{i}", "merlin.trafficgen")
    ep.addParams({
        "id": i,
        "num_peers": 2,
        "num_vns": 1,
        "link_bw": "5GB/s",
        "topology": "topology",
        "packet_size": "256B",
        "PacketDest.pattern": "Uniform",
        "PacketSize.pattern": "Uniform",
        "PacketDelay.pattern": "Uniform"
    })

    ep_topo = ep.setSubComponent("topology", "merlin.mesh")
    ep_topo.addParams(topo_params)

    link_host = sst.Link(f"link_host{i}")
    link_host.connect((ep, "rtr", lat), (rtr, "port0", lat))

    routers[i] = rtr

link_inter = sst.Link("inter_router_link")
link_inter.connect(
    (routers[0], "port1", lat),
    (routers[1], "port1", lat)
)

link_inter_back = sst.Link("inter_router_link_back")
link_inter_back.connect(
    (routers[1], "port2", lat),
    (routers[0], "port2", lat)
)

What I’ve tried

  • Verified parameters using sst-info
  • Tested on both SST 15.x (latest master branch from GitHub) and v14.1.0
  • Stepped through initialization to confirm the protocol mismatch (REPORT_ID vs REPORT_FLIT_SIZE)
  • Tried enabling/disabling explicit linkcontrol subcomponent (commented section in code)

Questions

  1. Is my component wiring correct?
    Specifically, is it valid to directly connect trafficgen → router port like this, or is an explicit merlin.linkcontrol subcomponent required?

  2. Are the router ports configured correctly?
    I’m unsure if ports 1 and 2 are being interpreted as router-to-router links correctly in this setup.

  3. Does this error indicate a topology mismatch?
    Could the merlin.mesh topology be expecting different connectivity than what I’ve manually wired?

  4. Is there any required initialization ordering or synchronization
    for LinkControl that I might be missing, or is this purely a configuration issue?

  5. Is there a minimal working example
    of a 2-node Merlin network with trafficgen endpoints that I can compare against?


I’d really appreciate any guidance on whether this is a configuration issue or a misunderstanding of how Merlin components should be connected. I’ve tried to debug the initialization path before posting, but I may be missing something fundamental.

Thanks in advance for your help!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions