ATA Receiver
Receives ATA voltage packets and assembles output tensors.
The ATA Receiver is the ingest point of a Stelline pipeline. It captures Allen Telescope Array voltage packets from a ConnectX NIC and reassembles them into dense, time-aligned GPU tensors that downstream correlation, beamforming, or spectral blocks can consume directly. Packet reception is built on the Holoscan Advanced Network operator, so payloads land in GPU memory through kernel bypass without touching the host.
How it works
The ATA distributes voltage data as UDP multicast streams. Each packet carries a 16-byte application header with the antenna ID, the first channel number, the channel count, and a timestamp in F-engine sample units, followed by a fixed 6144-byte payload. One packet therefore holds a small fragment of the full antenna and channel space, described by the partialBlock shape.
The receiver joins the multicast groups listed in subscriptions on the configured interface and spreads reception across the worker cores. Incoming packets are validated against the header fields, filtered by offsetBlock, and slotted into an in-flight block keyed by their timestamp. Once every fragment of a block has arrived, or the block is forced out by newer data, a CUDA kernel gathers the fragments into a contiguous output tensor with the totalBlock shape. Finished tensors are recycled through a fixed-size output pool, so a slow consumer shows up as pool exhaustion instead of unbounded memory growth.
Packets older than the eviction cutoff are dropped and counted, which makes late or out-of-order network delivery visible in the metrics rather than silently corrupting blocks.
Configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
interfaceAddress |
string | Address of the network interface that joins the multicast groups. | |
gpuDeviceId |
integer | 0 |
CUDA device that receives the payloads and runs the gather kernel. |
masterCore |
integer | 0 |
CPU core pinned to the receiver control thread. |
workerCores |
list of integers | CPU cores pinned to the packet reception workers. At least one is required. | |
subscriptions |
string | Multicast subscriptions, one per line (see below). | |
totalBlock |
list of integers | [1, 1, 1024, 1] |
Output tensor shape as [antennas, channels, samples, polarizations]. |
partialBlock |
list of integers | [1, 1, 1024, 1] |
Fragment shape carried by a single packet. |
offsetBlock |
list of integers | [0, 0, 0, 0] |
Origin of the captured region within the full telescope output. |
dataType |
string | CF32 |
Output tensor data type, either CF32 or CI8. |
packetsPerBurst |
integer | Number of packets in one receive burst. | |
maxConcurrentBursts |
integer | Cap on bursts held by the receiver at once. | |
maxConcurrentBlocks |
integer | 4 |
Cap on partially filled blocks kept in flight. |
outputPoolSize |
integer | 2 |
Number of output tensors cycled through the pool. |
The interfaceAddress, workerCores, subscriptions, packetsPerBurst, and maxConcurrentBursts parameters have no usable defaults and must be set.
Subscription syntax
Each line selects one stream and must follow this form:
- source_ip:port -> destination_ip:port
Either side of a colon accepts * as a wildcard, so - * -> 239.1.2.3:50000 accepts any source sending to that multicast group and port. The destination groups are joined on interfaceAddress at startup.
Shape rules
- All three shape parameters have exactly four dimensions, ordered
[antennas, channels, samples, polarizations]. - Each
totalBlockaxis must be a multiple of the matchingpartialBlockaxis. - The sample and polarization entries of
offsetBlockmust be zero. - The antenna entry of
offsetBlockmust be a multiple of thepartialBlockantenna count.
Output
| Name | Description |
|---|---|
output |
Tensor shaped as totalBlock in the configured data type, carrying a timestamp attribute with the block start time in F-engine sample units. |
The timestamp attribute is the link between the data path and the metadata path. Sinks such as the UVH5 Writer use it to look up time-matched pointing and Earth orientation values.
Attributes
| Attribute | Type | Direction | Description |
|---|---|---|---|
timestamp |
U64 |
Written on output |
Start time of the block in F-engine sample units. |
Metrics
The node surfaces its runtime health as metrics, the most important being:
- Throughput in Gbps, averaged since start.
- Packets received, evicted (filtered or late), and lost (no block could be allocated).
- Blocks received, computed, and lost.
- Bursts in flight against
maxConcurrentBursts, with the average burst release time. - Queue depths for the idle, receive, and compute stages, plus output pool availability.
- Observed antennas and channels, both the full set seen on the wire and the subset accepted after filtering, which is the fastest way to diagnose a wrong
offsetBlock.
A healthy steady state shows zero lost packets, bursts in flight well below the cap, and the observed antenna and channel sets matching the configured capture window.
Telemetry
The metrics below are reported to Nexus.
| Metric | Description |
|---|---|
blocksReceived |
Total completed blocks submitted to the gather kernel. |
blocksComputed |
Total completed blocks emitted from compute submit. |
blocksLost |
Total stale or evicted blocks. |
blocksEmitted |
Total blocks successfully output from the module. |
packetsReceived |
Total received packets accepted into blocks. |
packetsEvicted |
Packets discarded by offset or cutoff filtering. |
packetsLost |
Packets dropped because no block could be allocated. |
idleQueue |
Current idle queue depth. |
receiveQueue |
Current receive queue depth. |
computeQueue |
Current compute queue depth. |
burstsInFlight |
Current number of in-flight bursts. |
avgBurstReleaseTimeUs |
Average burst release time in microseconds. |
memPoolAvailable |
Current reusable output tensor pool availability. |
memPoolReferenced |
Current reusable output tensor pool references. |
blockMapLatestTimeIndex |
Latest known block time index. |
blockMapUsed |
Current number of active block map entries. |
blockMapCapacity |
Maximum number of concurrent block map entries. |
payloadSizes |
Observed payload sizes. |
allAntennas |
All observed antenna identifiers. |
filteredAntennas |
Accepted antenna identifiers after filtering. |
allChannels |
All observed channel identifiers. |
filteredChannels |
Accepted channel identifiers after filtering. |
latestTimestamp |
Latest accepted packet timestamp. |
Requirements
Reception requires an NVIDIA ConnectX NIC with Mellanox OFED and hugepages configured on the host. See host dependencies for the setup and considerations for the hardware background.