Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
a0e0e8e
feat(ir): add P2P fast path for signal/counter delivery in unified IR
MC952-arch Aug 6, 2026
9776349
feat(device-api): add P2P signal fast path via IPC-mapped signalPeerPtrs
MC952-arch Aug 6, 2026
5b3900b
fix(ir): address code review findings for unified IR
MC952-arch Aug 6, 2026
1ecd482
Add grid-level cooperation for unified IR P2P operations
MC952-arch Aug 8, 2026
e947e87
Implement team-based dispatch validation for unified IR P2P operations
MC952-arch Aug 10, 2026
4205cfd
test: Update unified IR tests to validate all 12 cooperation×team com…
MC952-arch Aug 10, 2026
0fa3a71
Fix S17 signal contamination with relative waits and WORLD barrier
MC952-arch Aug 11, 2026
10d12fa
test: Reorder and renumber unified IR tests S16-S23 sequentially
MC952-arch Aug 11, 2026
4839fa0
Add debug logs
MC952-arch Aug 11, 2026
8b70d5e
Fix inter-node issues
MC952-arch Aug 11, 2026
7c6a0a7
Split device_ir_unified tests into intra and inter suites
MC952-arch Aug 11, 2026
8e03d8a
fix: use local rank index for ASYMMETRIC getPeerPointer with WORLD team
MC952-arch Aug 11, 2026
eb5b71c
Remove COOP_GRID
MC952-arch Aug 12, 2026
2ba2350
Remove debug logs
MC952-arch Aug 12, 2026
f58ec57
Add unified IR CI integration
MC952-arch Aug 12, 2026
5c09a4d
Align FlagCX Unified IR with NCCL GIN v2.31.2-1 completion pattern su…
MC952-arch Aug 12, 2026
182a7a5
device/ir: move memory order/scope enums to flagcx_device_enums.h
MC952-arch Aug 12, 2026
27c97d0
Fix several issues
MC952-arch Aug 12, 2026
49ba9b0
Add unified IR test scenarios for device API coverage
MC952-arch Aug 13, 2026
916d33e
Fix S20 multi-context deadlock: enable all blocks to participate in s…
MC952-arch Aug 13, 2026
e74699e
Fix S21 Intra issues
MC952-arch Aug 13, 2026
7bd4cb4
Fix S21-S25 reset races in unified IR tests
MC952-arch Aug 13, 2026
17da95d
Fix S23 Intra issues
MC952-arch Aug 13, 2026
2487b5b
Fix S25 Intra issues
MC952-arch Aug 13, 2026
7109565
Fix S20 Inter issues
MC952-arch Aug 13, 2026
164b761
Fix S23 Inter issues
MC952-arch Aug 13, 2026
dcc0dd3
Removed all temporary S23 debug output
MC952-arch Aug 13, 2026
edb9bc3
ci: add dedicated Device API Unified IR test suite
MC952-arch Aug 13, 2026
5cbe07d
fix(device-ir): correct team peer resolution on nonzero nodes
MC952-arch Aug 14, 2026
8489c07
fix(device-ir): honor coop semantics in P2P scalar operations
MC952-arch Aug 14, 2026
ec883db
fix(device-ir): complete one-sided IPC-to-Net fallback
MC952-arch Aug 14, 2026
b87ff8e
fix(device-ir): make P2P signal waits cooperative and memory-order safe
MC952-arch Aug 14, 2026
6555b50
refactor(device-ir): unify cooperative kind type naming
MC952-arch Aug 14, 2026
104b295
fix(device-ir): preserve legacy ABI and correct unified test allocations
MC952-arch Aug 14, 2026
d3bd6ed
test(device-api): harden unified IR MPI test runners
MC952-arch Aug 14, 2026
1fd4317
test(device-ir): remove obsolete unified IR test driver
MC952-arch Aug 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/scripts/ci/run_unit_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,18 @@ run_device_api() {
build/bin/test_device_ir_inter "${flags[@]}" \
: -np "$FLAGCX_CI_NODE_NP" "${common_env[@]}" "${FLAGCX_CI_NODE2_MPI_ARGS[@]}" \
build/bin/test_device_ir_inter "${flags[@]}"

# Unified IR tests (INTRA + WORLD teams, INTER + WORLD teams)
# Intra test: single-node, 8 ranks
mpirun -np "$FLAGCX_CI_INTRA_NP" --allow-run-as-root "${common_env[@]}" \
build/bin/test_device_ir_unified_intra "${flags[@]}"

# Inter test: multi-node simulation, 8 ranks split into 2 nodes
mpirun --allow-run-as-root \
-np "$FLAGCX_CI_NODE_NP" "${common_env[@]}" "${FLAGCX_CI_NODE1_MPI_ARGS[@]}" \
build/bin/test_device_ir_unified_inter "${flags[@]}" \
: -np "$FLAGCX_CI_NODE_NP" "${common_env[@]}" "${FLAGCX_CI_NODE2_MPI_ARGS[@]}" \
build/bin/test_device_ir_unified_inter "${flags[@]}"
}

run_suite() {
Expand Down
190 changes: 65 additions & 125 deletions bindings/ir/flagcx_device_scalar_ir.h

Large diffs are not rendered by default.

276 changes: 28 additions & 248 deletions bindings/ir/flagcx_device_scalar_ir_impl.h

Large diffs are not rendered by default.

315 changes: 315 additions & 0 deletions bindings/ir/flagcx_device_unified_ir.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,315 @@
/*************************************************************************
* Copyright (c) 2026 BAAI. All rights reserved.
*
* FlagCX Unified One-Sided IR — Transport-Transparent Device API.
*
* These functions auto-dispatch between P2P (NVLink/IPC direct stores)
* and Net (FIFO/GIN/RDMA) paths based on peer reachability.
*
* All functions are extern "C", using only void* and scalar parameters.
* Naming: flagcxDev* (no "Net" — transport-transparent).
*
* Design:
* - Transport dispatch: flagcxGetPeerPointer() != null → P2P, else → Net
* - Scope/Order: mapped to PTX fences for P2P, implicit for Net
* - Signal/Wait: managed through net layer (signal buffers)
* - Barrier: teamKind dispatch (INTRA→IPC, INTER→Net, WORLD→combined)
************************************************************************/
#ifndef FLAGCX_DEVICE_UNIFIED_IR_H_
#define FLAGCX_DEVICE_UNIFIED_IR_H_

#include "comm_traits.h"
#include "device_utils.h"
#include "flagcx_device_enums.h"

/* ================================================================
* Category U1: Unified Put (6)
*
* Transport-transparent put. Checks peer reachability via P2P;
* falls back to Net path if unreachable.
*
* @param comm Opaque pointer to flagcxDevComm.
* @param dst Opaque pointer to destination flagcxDevMem.
* @param dstOffset Byte offset into destination.
* @param src Opaque pointer to source flagcxDevMem.
* @param srcOffset Byte offset into source.
* @param bytes Number of bytes to transfer.
* @param teamKind Team topology: INTRA, INTER, or WORLD.
* @param peer Destination rank within the team.
* @param contextId Context identifier.
* @param coopKind Cooperation level (THREAD/WARP/BLOCK).
* @param scope Memory fence scope for P2P path.
* @param order Memory ordering semantics.
* ================================================================ */

/** @brief Basic put (no completion action). */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevPut(const void *comm, const void *dst, size_t dstOffset,
const void *src, size_t srcOffset, size_t bytes,
flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order);

/** @brief Put + remote signal increment on completion. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevPut_RSigInc(const void *comm, const void *dst, size_t dstOffset,
const void *src, size_t srcOffset, size_t bytes,
flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order,
flagcxDevSignal_t remoteSignal);

/** @brief Put + remote signal add on completion. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevPut_RSigAdd(const void *comm, const void *dst, size_t dstOffset,
const void *src, size_t srcOffset, size_t bytes,
flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order,
flagcxDevSignal_t remoteSignal, uint64_t signalValue);

/** @brief Put + local counter increment on completion (sender-side tracking).
*/
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevPut_LCtrInc(const void *comm, const void *dst, size_t dstOffset,
const void *src, size_t srcOffset, size_t bytes,
flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order,
flagcxDevCounter_t localCounter);

/** @brief Put + remote signal increment + local counter increment. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevPut_RSigInc_LCtrInc(
const void *comm, const void *dst, size_t dstOffset, const void *src,
size_t srcOffset, size_t bytes, flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order,
flagcxDevSignal_t remoteSignal, flagcxDevCounter_t localCounter);

/** @brief Put + remote signal add + local counter increment. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevPut_RSigAdd_LCtrInc(
const void *comm, const void *dst, size_t dstOffset, const void *src,
size_t srcOffset, size_t bytes, flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order,
flagcxDevSignal_t remoteSignal, uint64_t signalValue,
flagcxDevCounter_t localCounter);

/* ================================================================
* Category U2: Unified Get (1)
*
* @param comm Opaque pointer to flagcxDevComm.
* @param src Opaque pointer to remote source flagcxDevMem.
* @param srcOffset Byte offset into remote source.
* @param dst Opaque pointer to local destination flagcxDevMem.
* @param dstOffset Byte offset into local destination.
* @param bytes Number of bytes to transfer.
* @param teamKind Team topology selector.
* @param peer Source rank within the team.
* @param contextId Context identifier.
* @param coopKind Cooperation level.
* @param scope Memory fence scope for P2P path.
* @param order Memory ordering semantics.
* ================================================================ */

/** @brief Transport-transparent get from remote peer. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevGet(const void *comm, const void *src, size_t srcOffset,
const void *dst, size_t dstOffset, size_t bytes,
flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order);

/* ================================================================
* Category U3: Unified PutValue (3)
*
* Scalar value write to remote peer.
*
* @param comm Opaque pointer to flagcxDevComm.
* @param dst Opaque pointer to destination flagcxDevMem.
* @param dstOffset Byte offset into destination.
* @param value 64-bit scalar value to write.
* @param teamKind Team topology selector.
* @param peer Destination rank within the team.
* @param contextId Context identifier.
* @param coopKind Cooperation level.
* @param scope Memory fence scope for P2P path.
* @param order Memory ordering semantics.
* ================================================================ */

/** @brief Write a scalar value to remote peer. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevPutValue(const void *comm, const void *dst, size_t dstOffset,
uint64_t value, flagcxDevTeamKind_t teamKind, int peer,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope, flagcxDevMemoryOrder_t order);

/** @brief Write a scalar value + remote signal increment. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevPutValue_RSigInc(
const void *comm, const void *dst, size_t dstOffset, uint64_t value,
flagcxDevTeamKind_t teamKind, int peer, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryScope_t scope,
flagcxDevMemoryOrder_t order, flagcxDevSignal_t remoteSignal);

/** @brief Write a scalar value + remote signal add. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevPutValue_RSigAdd(
const void *comm, const void *dst, size_t dstOffset, uint64_t value,
flagcxDevTeamKind_t teamKind, int peer, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryScope_t scope,
flagcxDevMemoryOrder_t order, flagcxDevSignal_t remoteSignal,
uint64_t signalValue);

/* ================================================================
* Category U4: Unified Signal (2)
*
* Send signal notifications to remote peers.
*
* @param comm Opaque pointer to flagcxDevComm.
* @param teamKind Team topology selector.
* @param peer Target rank within the team.
* @param signal Signal slot identifier.
* @param value Value to add (SignalAdd only).
* @param contextId Context identifier.
* @param coopKind Cooperation level.
* @param scope Memory fence scope.
* ================================================================ */

/** @brief Increment remote signal by 1. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevSignalInc(const void *comm, flagcxDevTeamKind_t teamKind, int peer,
flagcxDevSignal_t signal, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryScope_t scope);

/** @brief Add value to remote signal. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevSignalAdd(const void *comm, flagcxDevTeamKind_t teamKind, int peer,
flagcxDevSignal_t signal, uint64_t value,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryScope_t scope);

/* ================================================================
* Category U5: Unified Wait (2)
*
* Spin-wait for local signal/counter to reach threshold.
*
* @param comm Opaque pointer to flagcxDevComm.
* @param signal Signal slot to wait on.
* @param counter Counter slot to wait on.
* @param least Minimum value (inclusive) to wait for.
* @param bits Bit width for comparison (32 or 64).
* @param contextId Context identifier.
* @param coopKind Cooperation level.
* @param order Memory ordering on completion.
* ================================================================ */

/** @brief Wait until signal >= least. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevWaitSignal(const void *comm, flagcxDevSignal_t signal, uint64_t least,
int bits, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryOrder_t order);

/** @brief Wait until counter >= least. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevWaitCounter(const void *comm, flagcxDevCounter_t counter,
uint64_t least, int bits, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind,
flagcxDevMemoryOrder_t order);

/* ================================================================
* Category U6: Unified Read (2)
*
* Non-blocking read of signal/counter value.
*
* @param comm Opaque pointer to flagcxDevComm.
* @param signal Signal slot to read.
* @param counter Counter slot to read.
* @param bits Bit width (32 or 64).
* @param contextId Context identifier.
* @param order Memory ordering for the load.
* @return Current value of the signal/counter.
* ================================================================ */

/** @brief Read signal value (non-blocking). */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR uint64_t
flagcxDevReadSignal(const void *comm, flagcxDevSignal_t signal, int bits,
flagcxDevContext_t contextId, flagcxDevMemoryOrder_t order);

/** @brief Read counter value (non-blocking). */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR uint64_t flagcxDevReadCounter(
const void *comm, flagcxDevCounter_t counter, int bits,
flagcxDevContext_t contextId, flagcxDevMemoryOrder_t order);

/* ================================================================
* Category U7: Unified Flush / Reset / Shadow (4)
*
* @param comm Opaque pointer to flagcxDevComm.
* @param contextId Context identifier.
* @param coopKind Cooperation level (Flush only).
* @param order Memory ordering (Flush only).
* @param slot Signal/counter slot identifier.
* @param delta Value to add to shadow.
* ================================================================ */

/** @brief Flush pending network writes. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevFlush(const void *comm, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryOrder_t order);

/** @brief Reset a signal slot and its local shadow to zero. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevResetSignal(const void *comm, flagcxDevContext_t contextId,
flagcxDevSignal_t slot);

/** @brief Reset a counter slot to zero. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevResetCounter(const void *comm, flagcxDevContext_t contextId,
flagcxDevCounter_t slot);

/** @brief Increase the local shadow for a signal. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevIncreaseSignalShadow(const void *comm, flagcxDevContext_t contextId,
flagcxDevSignal_t slot, uint64_t delta);

/** @brief Spin-wait until signal meets its local shadow value. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevWaitSignalMeetShadow(
const void *comm, flagcxDevContext_t contextId, flagcxDevSignal_t slot,
int bits, flagcxDevCoopKind_t coopKind, flagcxDevMemoryOrder_t order);

/* ================================================================
* Category U8: Unified Barrier (3)
*
* Transport-transparent barrier. Dispatches based on teamKind:
* INTRA → P2P IPC atomic barrier
* INTER → Net signal barrier
* WORLD → Intra arrive → Inter arrive → Inter wait → Intra wait
*
* @param comm Opaque pointer to flagcxDevComm.
* @param teamKind Barrier scope (INTRA/INTER/WORLD).
* @param index Barrier channel index (typically blockIdx.x).
* @param contextId Context identifier.
* @param coopKind Cooperation level.
* @param order Memory ordering semantics.
* @param scope Memory fence scope.
* ================================================================ */

/** @brief Signal arrival at barrier. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void flagcxDevBarrierArrive(
const void *comm, flagcxDevTeamKind_t teamKind, uint32_t index,
flagcxDevContext_t contextId, flagcxDevCoopKind_t coopKind,
flagcxDevMemoryOrder_t order, flagcxDevMemoryScope_t scope);

/** @brief Wait for all peers at barrier. */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevBarrierWait(const void *comm, flagcxDevTeamKind_t teamKind,
uint32_t index, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryOrder_t order,
flagcxDevMemoryScope_t scope);

/** @brief Arrive + wait (full synchronization). */
FLAGCX_IR_EXTERN_C FLAGCX_DEVICE_DECORATOR void
flagcxDevBarrierSync(const void *comm, flagcxDevTeamKind_t teamKind,
uint32_t index, flagcxDevContext_t contextId,
flagcxDevCoopKind_t coopKind, flagcxDevMemoryOrder_t order,
flagcxDevMemoryScope_t scope);

#endif // FLAGCX_DEVICE_UNIFIED_IR_H_
Loading
Loading