For the complete documentation index, see llms.txt. Markdown versions of all pages are available by appending .md to any URL (e.g. /get-started.md).
Mojo struct
SplitCounterSync
struct SplitCounterSync[pipeline_stages: Int, block_rows: Int, warp_rows: Int, reads_per_warp_block: Int]
Split counter synchronization strategy.
Uses separate producer and consumer counters per tile to reduce atomic contention. Producers only write to producer counters, consumers only write to consumer counters.
Phase progression:
- Producer phase advances by reads_per_warp_block (waits for N consumers)
- Consumer phase advances by writes_per_warp_block (waits for 1 producer)
- This asymmetry reflects the 1-producer-to-N-consumers relationship
Parameters
- pipeline_stages (
Int): Number of pipeline stages in the ring buffer. - block_rows (
Int): Total number of rows in the work block. - warp_rows (
Int): Number of rows processed by a single warp. - reads_per_warp_block (
Int): Number of consumer read operations per warp block.
Fields
- producer_counters (
SplitCounterSync[pipeline_stages, block_rows, warp_rows, reads_per_warp_block].ProducerCounterArray): - consumer_counters (
SplitCounterSync[pipeline_stages, block_rows, warp_rows, reads_per_warp_block].ConsumerCounterArray):
Implemented traits
AnyType,
Copyable,
Deinitable,
ImplicitlyCopyable,
Movable,
RegisterPassable,
SyncStrategy,
TrivialRegisterPassable
comptime members
block_warps
comptime block_warps = (block_rows // warp_rows)
ConsumerCounterArray
comptime ConsumerCounterArray = SMemArray[Int32, SplitCounterSync[pipeline_stages, block_rows, warp_rows, reads_per_warp_block].total_tiles]
ProducerCounterArray
comptime ProducerCounterArray = SMemArray[Int32, SplitCounterSync[pipeline_stages, block_rows, warp_rows, reads_per_warp_block].total_tiles]
total_tiles
comptime total_tiles = (SplitCounterSync[pipeline_stages, block_rows, warp_rows, reads_per_warp_block].block_warps * pipeline_stages)
writes_per_warp_block
comptime writes_per_warp_block = 1
Methods
__init__
def __init__() -> Self
Initialize with internally allocated producer and consumer counters.
get_staged_idx
wait_producer_acquire
def wait_producer_acquire(self, tile_idx: Int, stage: Int, phase: Int32)
Producer waits on consumer counter.
Args:
signal_producer_release
def signal_producer_release(mut self, tile_idx: Int, stage: Int)
Producer increments producer counter.
Args:
wait_consumer_acquire
def wait_consumer_acquire(self, tile_idx: Int, stage: Int, phase: Int32)
Consumer waits on producer counter.
Args:
signal_consumer_release
def signal_consumer_release(mut self, tile_idx: Int, stage: Int)
Consumer increments consumer counter by 1.
Args:
get_producer_phase_increment
def get_producer_phase_increment(self) -> Int32
Producer phase advances by reads_per_warp_block.
Returns:
get_consumer_phase_increment
def get_consumer_phase_increment(self) -> Int32
Consumer phase advances by writes_per_warp_block.
Returns: