Skip to content

refactor: separate device and communication backend layout#48

Merged
Ziminli merged 2 commits into
masterfrom
refactor/ccl-backend-abstraction
Jul 14, 2026
Merged

refactor: separate device and communication backend layout#48
Ziminli merged 2 commits into
masterfrom
refactor/ccl-backend-abstraction

Conversation

@Ziminli

@Ziminli Ziminli commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Refactor the InfiniCCL internal source layout to separate device/platform code from communication backend code. Device-specific implementations now live under src/devices, MPI backend code lives under src/backends/mpi, and NCCL is moved into the new CCL backend hierarchy under src/backends/ccl.

This change is needed so CCL backends are no longer owned by a single platform directory. The PR introduces a common CCL layer plus an NCCL provider layout for NVIDIA, leaving future platforms/backends to add their own provider aliases or overrides under the backend hierarchy.

Changes

  • Source Layout

    • Move platform-specific code from src/{cpu,cuda,nvidia,iluvatar,metax,moore,cambricon} into src/devices/*.
    • Move OpenMPI code from src/ompi into src/backends/mpi/ompi.
    • Update include paths and header guards for the moved device and OpenMPI backend headers.
  • CCL Backend Abstraction

    • Add src/backends/ccl/common/ for common CCL APIs and communicator instances.
    • Add reusable CCL operation implementations under src/backends/ccl/common/impl.
    • Move NCCL-specific operation registration into src/backends/ccl/nccl/impl so common CCL code stays backend-agnostic.
  • NCCL provider structure

    • Add src/backends/ccl/nccl/api.h as the shared NCCL API wrapper.
    • Add src/backends/ccl/nccl/nvidia/api.h as the NVIDIA specialization that binds BackendType::kNccl to Device::Type::kNvidia.
    • Move NCCL checks and type mapping into src/backends/ccl/nccl.
  • Build and generation

    • Update src/CMakeLists.txt source discovery for the new src/devices and src/backends layout.
    • Update scripts/gen_bridge.py so generated manifests include moved device headers, MPI backend headers, NCCL provider headers, NCCL type maps, and NCCL operation registration headers from the new locations.
    • Keep MPICH mapped to the moved OpenMPI implementation path, matching the existing shared MPI implementation model.

Platform and Backend Affected

Platform

  • CPU
  • NVIDIA GPU
  • Iluvatar GPU
  • MetaX GPU
  • Moore Threads GPU
  • Cambricon MLU

Backend

  • OpenMPI
  • MPICH
  • NCCL

Performance Impact

  • No performance impact
  • Performance improved
  • Performance regression possible

N/A. This is a source-layout and backend-abstraction refactor.

Known Issues & Future Work

  • Future CCL providers can add provider-specific alias or override headers under src/backends/ccl/<backend>/<provider>/api.h.
  • Future MCCL and CNCL backend support can follow the same src/backends/ccl/<backend> structure introduced here.

Test Results

Test Involved Platform

  • CPU
  • NVIDIA GPU
  • Iluvatar GPU
  • MetaX GPU
  • Moore Threads GPU
  • Cambricon MLU

Test Involved Backend

  • OpenMPI
  • MPICH
  • NCCL

NV+MetaX+Iluvatar+Moore with OpenMPI:
mpi_all_gather.log
mpi_all_to_all.log
mpi_all_reduce.log
mpi_broadcast.log
mpi_gather.log
mpi_reduce.log
mpi_reduce_scatter.log
mpi_scatter.log
mpi_send_recv.log

NV with NCCL:
ccl_all_reduce.log

NV with NCCL+OpenMPI:
ccl_mpi_hybrid_all_reduce.log


Checklist

Every contributor must verify every item below before requesting
review. Tick each box only after the check has actually been performed —
do not tick speculatively. If an item truly does not apply, replace the
checkbox with N/A and briefly explain why in an inline comment.

Title, Branch, and Commits

  • PR title follows Conventional Commits (e.g. feat: …, fix(nccl): …).
  • Branch name follows <type>/xxx-yyyy-zzzz where <type> matches the PR title's Conventional Commits type and words are joined with hyphens (see CONTRIBUTING.md §Branches).
  • Each commit message follows Conventional Commits.
  • Small PR is a single squashable commit; or, for a large PR, every commit is meaningful, well-formed, and independently reviewable (see CONTRIBUTING.md §Pull Requests).
  • No stray merge commits from master — the branch is rebased cleanly on top of the current master.
  • No fixup! / squash! / wip commits remain.

Scope and Design

  • Changes are minimal — no unrelated modifications were introduced (CONTRIBUTING.md §Code/General).
  • No dead code, commented-out blocks, debug prints, printf/std::cout/print(...) left behind, or TODO without an owner and issue link.
  • No unrelated formatting churn that would obscure the diff.
  • N/A- Public API changes (if any) are intentional, documented, and reflected in affected callers/tests.

General Code Hygiene

  • The code is self-explanatory; comments were added only where the intent or rationale is non-obvious (CONTRIBUTING.md §Code/General).
  • Every modified or added file ends with a single trailing newline (CONTRIBUTING.md §Code/General).
  • No trailing whitespace, inconsistent indentation, or mixed formatting styles remain.
  • Identifiers referenced in comments or error messages are wrapped in Markdown backticks (e.g. the `AllReduce` implementation) (CONTRIBUTING.md §Code/General).
  • All comments and error messages are in English (CONTRIBUTING.md §Code/General).
  • Comments and error messages are complete sentences — capitalized first letter, terminal punctuation — unless the language/framework convention says otherwise (CONTRIBUTING.md §Code/General; §Python).

C++ Specific (if C++ files changed)

  • Code follows the Google C++ Style Guide strictly.
  • clang-format (version 16, per .github/workflows/clang-format.yml) has been run against all modified applicable files; the diff is clean.
  • No exceptions are thrown. Error paths use assert with messages that include at least __FILE__, __LINE__, and __func__ (CONTRIBUTING.md §C++).
  • Error and warning message wording follows the LLVM Coding Standards (CONTRIBUTING.md §C++).
  • Constructor initializer list order matches member declaration order (CONTRIBUTING.md §C++).
  • Exactly one blank line between classes, between classes and functions, and between functions (CONTRIBUTING.md §C++).
  • Exactly one blank line between members (functions and variables) within a class (CONTRIBUTING.md §C++).
  • Exactly one blank line before and after the contents of a namespace (CONTRIBUTING.md §C++).

Python Specific (if Python files changed)

  • Code is PEP 8 compliant; ruff check passes cleanly on CI (see .github/workflows/ruff.yml).
  • ruff format --check passes cleanly — if not, run ruff format and commit the result.
  • Comments are complete English sentences, starting with a capital letter and ending with punctuation; Markdown backticks are used for code references (CONTRIBUTING.md §Python).
  • Framework-specific conventions (e.g. lowercase pytest.skip messages without terminal period) are honored where applicable (CONTRIBUTING.md §Python).
  • No blank line between the function signature and the body when there is no docstring or comment (CONTRIBUTING.md §Python).
  • A blank line is present before and after if, for, and similar control-flow statements (CONTRIBUTING.md §Python).
  • A blank line appears before each return, except when it directly follows a control-flow statement (CONTRIBUTING.md §Python).
  • Docstrings (if any) follow PEP 257 (CONTRIBUTING.md §Python).
  • Type hints are added / kept consistent with the surrounding code.

Testing

  • All applicable example programs have been built and tested successfully on at least one supported heterogeneous cluster setup.

Build, CI, and Tooling

  • N/A- New backends or devices have been added to auto-detection in CMakeLists.txt under if(AUTO_DETECT_DEVICES) or to if(AUTO_DETECT_BACKENDS) if applicable.
  • Both CI workflows (clang-format.yml, ruff.yml) are green locally (or expected to be green on CI).

Documentation

  • README.md, CONTRIBUTING.md, or inline docs updated when behavior, build flags, or developer workflow changed.
  • Any user-visible breaking change is called out explicitly under "Summary" and in the commit/PR title with a ! or BREAKING CHANGE: footer.

Security and Safety

  • No secrets, access tokens, internal URLs, customer data, or personal hardware identifiers have been committed.
  • N/A- Third-party code is license-compatible and attributed.
  • No unsafe pointer arithmetic, uninitialized reads, or missing bounds checks were introduced.

- Move platform runtime code under `src/devices` and MPI backend code under
`src/backends/mpi`.

- Introduce a shared CCL abstraction under `src/backends/ccl/common` and move
NCCL provider code under `src/backends/ccl/nccl`.

- Update CMake source discovery and bridge generation for the new directory
layout.
@Ziminli Ziminli self-assigned this Jul 14, 2026
@Ziminli Ziminli merged commit ece7a9a into master Jul 14, 2026
2 checks passed
@Ziminli Ziminli deleted the refactor/ccl-backend-abstraction branch July 14, 2026 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant