Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

145 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MOAT: Migration Orchestration via Automated Translation

MOAT ports popular CUDA GitHub projects to ROCm/HIP, one repo at a time. Coverage is expressed as gates -- wave64, wave32, windows -- so a port is proven once each gate has an architecture that validated it on real hardware. It is driven by AI coding agents running through either Claude Code or Codex: intake screens a candidate, a planner analyses it, a porter applies the change on a fork in the AMD-Ecosystem org, a reviewer checks it, and a validator runs the real tests on AMD GPUs. Submitting the result upstream, and everything that follows with a maintainer, stays with a person. This repo is the control plane; it tracks progress and holds the porting knowledge in the cuda-to-rocm skill.

Prefer pictures? VISUAL.md walks through all of this in twelve diagrams.

If you maintain a project we might send a pull request to

Read this section and skip the rest; it is what concerns you.

Every pull request from this effort is written by an AI agent and read by a person before it is opened. It says so in its own body, along with a link back here. The person who approves it is approving the diff, the title and the body together, on one page, before any of it is visible on your repository.

You get at most one pull request per project. It is opened from a fork under the AMD-Ecosystem organisation against your default branch. There is no bot that follows up on a schedule -- every reply to you is a separate decision by a person, in a session they are sitting in front of.

We do not open it until the port has been built and its real test suite has been run on AMD hardware, on both wavefront widths (see the table below) -- that is where a CUDA port most often breaks. A compile is not evidence and does not count.

You can tell us to stop, and that is the end of it. No reason needed. Either:

  • comment on any pull request of ours saying so, or
  • open an opt-out issue naming your username, your organisation, or one repository.

An owner-level opt-out covers everything you own, including repositories nobody here has looked at yet. It is recorded in data/optout.json, and it is not a promise to remember: the record is enforced in three places in the tooling -- your repositories drop out of the candidate list, no project can be adopted from them, and nothing can be submitted to them even if the port is already finished and approved. Closing anything of ours still open and deleting the fork are done by a person, because anything that touches your repository always is. Withdrawing an opt-out needs a person on our side and someone asking on yours; an agent may carry that decision into the record but never make it.

If a pull request is not how you would like to receive this, say that instead. Filing an issue with the findings and no code, or waiting for a release window, is a smaller ask than stopping and we would rather do it.

How it works

Five agents run in sequence, and each hands over through a state file rather than a conversation, so either supported agent harness on any host can pick up where the last one stopped: intake screens a candidate for licence and viability, planner analyses the build system and the CUDA surface, porter writes the port on the fork, reviewer reads the diff, and validator builds it and runs the project's own tests on a real AMD GPU. The reviewer and the validator can both send it back to the porter. What happens after approval -- submitting the pull request, maintainer rounds, merge -- is not a pipeline stage, because every step of it ends at a person. The submission itself runs only in an attended session; an agent may run that one command, since what it publishes was already approved wholesale on the review PR.

Each project gets a folder under projects/ holding its plan, notes, and a per-platform status file. A fresh Claude Code or Codex run in this repo detects its AMD architecture, finds the next actionable project, and continues the pipeline. No platform leads: whichever host picks the project up first does the porting, and the rest validate the same fork branch independently and in parallel, since the AMD targets share one unified ROCm port.

A platform is an architecture on an operating system, and it carries the gates implied by both -- its wavefront size, which is fixed by the architecture, and its OS. The same GPU on a different OS is a different platform covering different gates. A gate is satisfied once any one platform carrying that attribute has validated, so the gates can be covered by as few as two hosts.

What a person decides, and what agents may never do

Four decisions are held by a person. Each is enforced by the tooling rather than by an instruction an agent is asked to remember, and none of them is a checkbox an agent can tick on its own.

the decision how it is made what an agent may do
Is this project's licence one we may contribute to? Two tiers are cleared in advance (config/licenses.toml): permissive licences, and the copyleft licences approved for contributing to third-party projects; anything else waits for a named person, one project at a time Read the licence and record which one it is. That is a fact. The clearance is not, and a record without a name satisfies nothing
Do we take this project up at all? Someone creates the fork in the AMD-Ecosystem org. Agents have no permission to create one, so its existence is the decision and nothing else has to record it Write the case for and against, and recommend
Do we decline it? Screens collect into one issue, a person answers in prose, and merging a small pull request recording the declines is the record -- approving is impossible on a self-authored pull request, and the merge carries the same actor and timestamp Write the case. Never the verdict
Does this port go upstream, exactly as written? A review pull request on our own fork carries the diff, the title and the body together. A person approves it there, and their approval is bound to that commit and that text Open the review pull request and read the answer. It may never write the approval line

The last one is the gate that matters to a maintainer receiving this. An approval covers what was on screen when it was given: a commit pushed afterwards, or an edit to the title or body, voids it and the submission step refuses. That check compares GitHub against GitHub -- the commit the review was attached to against the branch tip now -- because the local record is a file agents can write and the approval is not.

Opening the upstream pull request is one command run by a person in their own session, never by an unattended job.

Suggest a project to port

Anyone can ask for a CUDA project to be ported: file a port request. It lands in the same queue our own discovery feeds, and a person decides whether to take it up before any work starts.

Licence

MIT, matching the ROCm projects this work targets. See LICENSE. The ports themselves live on forks and stay under each upstream project's own licence; nothing in this repository changes that.

Scope and honesty

The project list below is a best-effort ranked union of targeted GitHub searches, not a census of every CUDA repo (GitHub search caps results per query and misses repos whose dominant language is not Cuda). Ports aim to be minimally invasive: for pure CMake projects we prefer enable_language(HIP) plus a single cuda-to-hip compat header; for pytorch extensions we rely on torch's build-time hipify. A CPU-only build smoketest proves compilation only; correctness is gated on real-GPU test runs. See the cuda-to-rocm skill.

Projects we will not port (already ported, already supported, can't be ported, or not a real target) are recorded with reasons in data/dispositions.json and kept out of the actionable list; utils/triage.py manages those decisions.

Projects

Coverage is proven per gate, not per machine. A gate is met once any AMD GPU with that property has run the project's real test suite. Which specific card did it is recorded in each project's status file.

gate what it covers
wave64 data-center cards -- Instinct MI200/MI300 class (CDNA), 64 threads per wavefront
wave32 desktop and workstation cards -- Radeon RX / PRO (RDNA), 32 threads per wavefront
windows the port builds and runs on Windows, not only Linux

A wavefront is AMD's analogue of an NVIDIA warp, which is always 32 threads. Code that silently assumes 32 is the single most common way a CUDA port breaks on AMD, so the two widths are proven separately rather than assumed to follow from each other.

cell meaning outcome meaning
βœ… proven on the current code 🟣 contribution merged upstream
πŸ”„ proven earlier; the code has moved since 🟒 pull request open
πŸ”§ in progress πŸ”΄ pull request closed
⬜ not started βš–οΈ licence bars contributing the port
🚫 blocked, with a reason recorded βšͺ set aside, with the reason recorded
🎫 waived for this project, with maintainer approval ⏸ on hold, deliberately not being worked
β€” nothing recorded β€” nothing recorded

The project name links upstream.

Project wave64 wave32 windows Outcome
3DGS-LM (fork) βœ… βœ… βœ… 🟒 #15
3DUNDERWORLD-SLS-GPU_CPU (fork) πŸ”§ πŸ”„ πŸ”„ 🟒 #33
3P-ADMM-PC2 (fork) βœ… βœ… βœ… 🟣 #10
accelerated-scan (fork) βœ… βœ… βœ… 🟒 #17
aihwkit (fork) βœ… βœ… βœ… 🟒 #770
alien (fork) βœ… βœ… πŸ”„ 🟣 #710
amgcl (fork) βœ… βœ… βœ… 🟣 #315
anari-visionaray (fork) βœ… βœ… βœ… 🟒 #10
arbor (fork) βœ… βœ… βœ… 🟣 #2512
arrayfire (fork) πŸ”§ βœ… βœ… 🟒 #3708
AutoDock-GPU (fork) βœ… βœ… βœ… 🟒 #320
bam (fork) 🚫 🚫 🚫 ⏸ on hold
barney (fork) βœ… βœ… βœ… 🟣 #46
baspacho (fork) βœ… βœ… βœ… 🟒 #10
bellhopcuda (fork) βœ… βœ… βœ… 🟒 #65
brian2cuda (fork) βœ… βœ… πŸ”„ 🟒 #327
catboost (fork) βœ… βœ… βœ… 🟒 #3111
colmap (fork) βœ… βœ… βœ… β€”
CPM.cu 🚫 β€” β€” βšͺ not-portable
CubbyFlow (fork) βœ… βœ… βœ… 🟒 #145
cuBQL (fork) βœ… βœ… βœ… 🟣 #35
cubvh (fork) βœ… βœ… βœ… 🟣 #33
cuda-efficient-features (fork) βœ… βœ… βœ… 🟒 #3
CUDA-L2 🚫 β€” β€” βšͺ not-portable
CUDA-ScanMatcher-ICP (fork) βœ… βœ… βœ… 🟒 #10
cuda_voxelizer ⬜ ⬜ ⬜ β€”
cudaKDTree (fork) βœ… βœ… βœ… 🟣 #40
CudaSift (fork) βœ… βœ… βœ… 🟒 #97
CuMesh (fork) πŸ”§ πŸ”„ πŸ”„ 🟒 #36
cuPDLP-C (fork) βœ… βœ… βœ… 🟒 #41
cuPDLPx (fork) βœ… βœ… πŸ”„ 🟣 #94
cupoch (fork) βœ… βœ… βœ… 🟣 #143
CuRast (fork) βœ… βœ… βœ… 🟒 #2
cuSZ (fork) βœ… βœ… βœ… 🟒 #91
CV-CUDA (fork) βœ… βœ… 🚫 🟒 #293
DEM-Engine (fork) βœ… βœ… βœ… 🟒 #69
dgSPARSE-Lib (fork) βœ… βœ… βœ… 🟒 #39
dietgpu (fork) βœ… βœ… πŸ”„ β€”
diff-surfel-rasterizations (fork) ⬜ ⬜ ⬜ β€”
diff-surfel-tracing (fork) ⬜ ⬜ ⬜ β€”
DiffPhysDrone (fork) βœ… βœ… βœ… 🟒 #45
DynOSAM ⬜ ⬜ ⬜ β€”
egg.c (fork) βœ… βœ… βœ… 🟒 #8
ElasticFusion (fork) βœ… βœ… βœ… β€”
EnvGS (fork) βœ… βœ… βœ… β€”
espresso (fork) βœ… βœ… 🚫 β€”
evogp (fork) βœ… βœ… βœ… 🟣 #12
faiss (fork) βœ… βœ… βœ… β€”
FaithC (fork) βœ… βœ… βœ… 🟒 #12
Fast-Poisson-Image-Editing (fork) βœ… βœ… βœ… 🟣 #25
faster-gaussian-splatting (fork) βœ… βœ… πŸ”„ β€”
FastGeodis (fork) βœ… βœ… βœ… 🟒 #68
fdtd3d (fork) βœ… βœ… βœ… β€”
ffpa-attn (fork) βœ… βœ… βœ… 🟣 #268
FLAMEGPU2 (fork) βœ… βœ… βœ… β€”
FlashKDA ⬜ ⬜ ⬜ β€”
FlashMoE 🚫 β€” β€” βšͺ not-portable
FlashRT 🚫 β€” β€” βšͺ not-portable
foldmason (fork) βœ… βœ… βœ… β€”
foldseek (fork) βœ… βœ… βœ… β€”
gaussian_splatting (fork) βœ… βœ… βœ… 🟒 #37
gdtk (fork) βœ… βœ… βœ… β€”
GOMC (fork) βœ… βœ… βœ… β€”
GooFit (fork) πŸ”§ βœ… ⬜ β€”
gpu4pyscf (fork) βœ… βœ… 🚫 β€”
GPU_IPC (fork) βœ… βœ… ⬜ β€”
Gpufit (fork) βœ… βœ… βœ… 🟒 #149
GPUMD (fork) βœ… βœ… βœ… 🟣 #1538
gpuRIR (fork) βœ… βœ… βœ… β€”
gRASPA (fork) βœ… βœ… βœ… β€”
gtsam_points (fork) βœ… βœ… βœ… 🟒 #99
h2o4gpu ⬜ ⬜ ⬜ β€”
HEonGPU (fork) βœ… ⬜ ⬜ β€”
icicle (fork) βœ… βœ… 🚫 β€”
k2 (fork) βœ… βœ… βœ… 🟣 #1353
kaldi (fork) βœ… βœ… 🚫 🟒 #4986
kaldifeat (fork) βœ… βœ… βœ… β€”
KittenGpuLBVH (fork) βœ… βœ… βœ… 🟒 #5
LC-framework (fork) βœ… βœ… ⬜ β€”
lc0 (fork) βœ… βœ… 🚫 🟒 #2420
LEAP (fork) βœ… βœ… βœ… β€”
libSGM (fork) βœ… βœ… βœ… 🟒 #89
LichtFeld-Studio (fork) βœ… βœ… 🚫 β€”
LiteGS (fork) βœ… βœ… βœ… β€”
llm-awq (fork) βœ… βœ… βœ… β€”
llm.c (fork) βœ… βœ… βœ… 🟒 #854
llmq 🚫 β€” β€” βšͺ not-portable
mahout (fork) βœ… βœ… πŸ”„ 🟒 #1399
marian-dev (fork) βœ… βœ… πŸ”„ 🟒 #1043
MASt3R-SLAM (fork) βœ… βœ… βœ… β€”
mcx (fork) βœ… βœ… βœ… 🟣 #264
metaeuk (fork) βœ… βœ… βœ… β€”
mHC.cu (fork) βœ… βœ… βœ… β€”
MMseqs2 (fork) βœ… βœ… βœ… β€”
MPPI-Generic (fork) βœ… βœ… βœ… β€”
mumax3 (fork) βœ… βœ… βœ… 🟒 #400
ntransformer (fork) βœ… βœ… βœ… β€”
OCTproZ (fork) βœ… βœ… βœ… β€”
ohm (fork) βœ… βœ… βœ… β€”
oneflow (fork) βœ… βœ… 🚫 β€”
op43dgs (fork) βœ… βœ… βœ… β€”
Open3D (fork) βœ… βœ… πŸ”„ 🟒 #7509
opencv (fork) ⬜ ⬜ ⬜ β€”
opencv_contrib (fork) βœ… βœ… βœ… 🟒 #4147
PhoenixOS 🚫 ⬜ ⬜ ⏸ on hold
plumed2 (fork) βœ… βœ… 🚫 β€”
plvs (fork) βœ… βœ… 🚫 β€”
Pointcept (fork) βœ… βœ… βœ… 🟣 #604
popsift (fork) βœ… βœ… βœ… 🟒 #186
prismatic (fork) βœ… βœ… βœ… β€”
pytorch3d βœ… βœ… βœ… 🟣 #2039
qrack (fork) βœ… βœ… βœ… β€”
Quest (fork) βœ… βœ… ⬜ β€”
QUICK (fork) βœ… βœ… 🚫 β€”
rmagine (fork) βœ… βœ… βœ… β€”
rmcl (fork) ⬜ ⬜ ⬜ β€”
RWKV-CUDA (fork) βœ… βœ… βœ… β€”
RXMesh (fork) βœ… βœ… βœ… 🟒 #73
SCAMP (fork) βœ… βœ… βœ… 🟒 #145
SpargeAttn 🚫 β€” β€” βšͺ not-portable
spconv ⬜ ⬜ ⬜ β€”
splatad (fork) βœ… βœ… βœ… 🟒 #24
sppark (fork) βœ… βœ… βœ… 🟒 #82
stdgpu (fork) βœ… βœ… βœ… 🟣 #484
symforce (fork) βœ… βœ… βœ… 🟒 #465
TIGRE (fork) βœ… βœ… βœ… 🟒 #747
tiny-vllm (fork) βœ… βœ… βœ… 🟣 #2
torch-linear-assignment (fork) βœ… βœ… βœ… 🟒 #31
TornadoVM ⬜ ⬜ ⬜ β€”
tsne-cuda ⬜ ⬜ ⬜ β€”
TTT3R (fork) βœ… βœ… βœ… β€”
TurboFNO (fork) βœ… βœ… βœ… 🟣 #3
unified-cache-management (fork) βœ… βœ… πŸ”„ 🟒 #1021
Velvet (fork) βœ… βœ… βœ… 🟒 #9
visionaray (fork) βœ… βœ… βœ… 🟣 #51
yalm (fork) βœ… βœ… βœ… 🟒 #12
YarnBall (fork) βœ… βœ… βœ… 🟒 #5
ZhiLight (fork) βœ… βœ… 🎫 🟒 #81

Layout

See VISUAL.md for a diagram walkthrough of everything above, projects/README.md for the per-project files, the cuda-to-rocm skill for porting strategy and fault classes, and AGENTS.md for how either supported agent harness drives the pipeline.

About

Porting popular CUDA projects to ROCm/HIP, one repository at a time. Driven by Claude.

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages