Repository navigation
Conversation
| // comm spans both hosts and drops Anvil SDMA. Splitting it by host gives each | ||
| // host a comm with topo->nHosts == 1, which must keep Anvil SDMA as the default | ||
| // and complete a put/signal between its two local ranks. This fails if the drop | ||
| // is keyed on the job or the world comm instead of the comm's own nHosts. |
Contributor
There was a problem hiding this comment.
Low
Two new comments repeat the code below them. The header here restates the asserts, and test_gin_rocshmem_backends_config.py:8-10 restates _EXPECTED_SHAPES. Could we keep only the reasoning?
Suggested change
| // is keyed on the job or the world comm instead of the comm's own nHosts. | |
| // 2 ranks per host, NCCL_GIN_TYPE unset (AICOMRCCL-3501): a per-host split keeps Anvil SDMA, | |
| // since the drop keys on the comm's own nHosts, not the job's. |
Contributor
There was a problem hiding this comment.
Resolved by dd30354b61.
dlamd1dai
force-pushed
the
users/dondai/aicomrccl-3450-unset-type-ci
branch
from
November 3, 2026 08:12
a2ce58d to
50ee913
Compare
Four ranks, two per host, NCCL_GIN_TYPE unset. The 2-host world comm drops Anvil SDMA; a non-shared ncclCommSplit by topo->hostIdx gives each host a comm with topo->nHosts == 1, which must report Anvil SDMA as the default GIN type and complete a put/signal between its two local ranks. Covers the nHosts > 1 gate in ncclGinSetDefaultBackend from the other side: it fails if the drop is keyed on the job or the world comm instead of the comm's own host count. JIRA ID: AICOMRCCL-3501 Co-authored-by: Cursor <cursoragent@cursor.com>
Add the per-host split case to the gin_devmpi_mixed_2node suite, which already leaves NCCL_GIN_TYPE unset, with its own launch shape of 4 ranks, 2 per host. Extend the CPU guard to lock both cases' shapes, since a wrong shape turns the run into a silent skip. JIRA ID: AICOMRCCL-3501 Co-authored-by: Cursor <cursoragent@cursor.com>
…dePerHostSplitKeepsAnvil Only the per-host comms use GIN. On a 2-host job without a GIN-capable NIC the world comm drops Anvil SDMA and is left with no GIN backend, so SKIP_IF_GIN_UNSUPPORTED on it skipped a test that could still run. The world comm checks that remain (nHosts == 2, Anvil SDMA unsupported) hold with or without the proxy. JIRA ID: AICOMRCCL-3501 Co-authored-by: Cursor <cursoragent@cursor.com>
The test header repeated its asserts and the config guard's docstring repeated _EXPECTED_SHAPES. Keep only the reasoning. JIRA ID: AICOMRCCL-3501 Co-authored-by: Cursor <cursoragent@cursor.com>
dlamd1dai
force-pushed
the
users/dondai/aicomrccl-3501-per-host-anvil
branch
from
November 3, 2026 08:20
19c48c8 to
dd30354
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Follow-up from #14216 (AICOMRCCL-3417), suggested by @abouteiller in review. #14216 makes
ncclGinSetDefaultBackenddrop Anvil SDMA whencomm->topo->nHosts > 1. Its tests cover the multi-host side. No end-to-end test covers the other side: in a 2-node job, a communicator that spans one host must keep Anvil SDMA.Stacked on #14506 (AICOMRCCL-3450), which adds the 2-node CI suite with
NCCL_GIN_TYPEunset. Merge after #14216 and #14506; only the last three commits belong to this PR.Technical Details
GinMPIDeviceTests.MixedBackends_TwoNodePerHostSplitKeepsAnvil(test/transport/GinDeviceMPITests.cpp). It needs 4 ranks, 2 on each of 2 hosts, andNCCL_GIN_TYPEunset. It reusesmixedBackendTwoNodeSkipReason(), so it skips unless rocSHMEM GIN is built and Anvil SDMA is probeable.topo->nHosts == 2and has already dropped Anvil SDMA (ginSupport[ANVIL_SDMA]clear). There is no GIN gate on the world comm: only the per-host comms use GIN, and without a GIN-capable NIC the world comm is left with no backend once Anvil SDMA is dropped.ncclCommSplitwithtopo->hostIdxas color.splitSharecomes from the parent, so the test asserts the child has its ownsharedRes. A shared child would reuse the world comm'sginState, which no longer holds Anvil SDMA.topo->nHosts == 1,props.ginType == NCCL_GIN_TYPE_ANVIL_SDMA,props.ginSupport[NCCL_GIN_TYPE_ANVIL_SDMA]set, andglobalGinSupport == FULL. Then a default DevComm completes a put + signal between the two local ranks (runPutWaitRoundTrip).nHosts: the per-host comm would lose Anvil SDMA and fail theginTypecheck.gin_devmpi_mixed_2nodesuite (gin_rocshmem_backends_mellanox.json) with its own shape:num_ranks: 4,num_gpus: 2(2 ranks per node),num_nodes: 2.test_gin_rocshmem_backends_config.pynow locks the shape of both cases in that suite, since a wrong shape becomes a silent skip.Issue Tracking
JIRA ID: AICOMRCCL-3501
Test Plan
ENABLE_ROCSHMEM_GIN=ON,ENABLE_MPI_TESTS=ON,NCCL_CUMEM_ENABLE=1,NCCL_GIN_TYPEunset:mpirun -np 4 --map-by ppr:2:node ... rccl-UnitTestsMPI --gtest_filter=GinMPIDeviceTests.MixedBackends_TwoNodePerHostSplitKeepsAnvilExpect
[ PASSED ], not[ SKIPPED ].ncclGinSetDefaultBackendjob-wide (drop on every comm once any comm in the process has spanned more than one host), then confirm the test fails onprops.ginType.gin_devmpi_mixed_2node).python3 -m unittest discover -s tests -t .intools/scripts/test_runner.GinDeviceMPITests.cppwith-Wall(ENABLE_ROCSHMEM_GIN,MPI_TESTS_ENABLED).Test Result
MixedBackendsTwoNodeSuiteTest.GinDeviceMPITests.cpp.2 × MI300X (gfx942, SPX),
ctr-cx65-mi300x-3+ctr-cx66-mi300x-3, 2 ranks per node, Release build withENABLE_ROCSHMEM_GIN=ONandENABLE_MPI_TESTS=ON,NCCL_CUMEM_ENABLE=1,NCCL_GIN_TYPEunset. The IB ports on both nodes were inINIT(no subnet manager), so NCCL usedNET/Socketovereth1and the world comm had no proxy GIN.Pass (rank 0 log;
mpirunexited 0 on all 4 ranks):Negative check, scratch job-wide gate (reverted afterwards; the pass above is from the clean source):
Before the world-comm GIN gate was dropped, the same run skipped with
GIN full connectivity is required; communicator is NONE or RAIL.Submission Checklist