CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
6.7 KiB
6.7 KiB
Contributing to rocjitsu
General principles
- Extend existing libraries rather than adding new ones. Check
lib/util/,lib/simdojo/, andlib/rocjitsu/before introducing a dependency or writing something from scratch. - Follow the existing architecture. See docs/architecture.md for the component overview and where things live.
- Never manually edit autogenerated files. ISA decoders, execute
bodies, legalization tables, and encoding translators are generated
by the
amdisacodegen pipeline. Edit the generator (lib/python/amdisa/codegen/_generator.py), regenerate, and commit all generated output. See docs/codegen.md.
Where things live
| What you're adding | Where it goes |
|---|---|
| GPU hardware component (cache, queue, CU logic) | lib/rocjitsu/src/rocjitsu/vm/amdgpu/ |
| ISA instruction semantics | lib/python/amdisa/codegen/_generator.py (regenerate) |
| Hand-written ISA support (address calc, matrix math) | lib/rocjitsu/src/rocjitsu/isa/arch/amdgpu/<target>/ |
| KFD ioctl or interposer hook | lib/rocjitsu/src/rocjitsu/kmd/linux/ |
| Binary translation rule or expansion | lib/rocjitsu/src/rocjitsu/code/dbt/ |
| Binary instrumentation pass | lib/rocjitsu/src/rocjitsu/code/patch/ |
| Code object loading or ELF mutation | lib/rocjitsu/src/rocjitsu/code/ |
| Register liveness or def-use analysis | lib/rocjitsu/src/rocjitsu/analysis/ |
| Simulation engine (events, topology, PDES) | lib/simdojo/ |
| Shared utility (bit ops, logging, SIMD, allocators) | lib/util/ |
| JSON config schema change | schemas/ + lib/rocjitsu/src/rocjitsu/config/ |
| CLI changes | tools/rocjitsu/ |
| New GPU topology config | configs/ |
| Tests | tests/ (mirror the source structure: tests/dbt/, tests/analysis/, tests/patch/, etc.) |
Libraries to use
Before writing new infrastructure, check these existing libraries:
- Logging — Use
util/log.h(Logger::print<>()), neverfprintforstd::cerr. Build with or without tracing via the logger's compile-time group filters. - Bit manipulation —
util/bit.handutil/bitfield.hcover masks, extraction, insertion, and typed bitfield access. - Data types —
util/data_types.hprovides FP16/BF16/FP8/BF8/FP4/FP6 conversions. Extend it rather than adding ad-hoc converters. - SIMD —
util/simd.hwraps<experimental/simd>with scalar fallback. Add new SIMD primitives here, not inline in ISA execute bodies. - Intrusive list —
util/intrusive_list.hfor linked data structures that need O(1) insert/erase without heap allocation per node. - Arena allocator —
util/arena_alloc.hfor fixed-size block pools. - Exceptions —
util/except.hforInvalidInst,UnimplementedInst,ConfigError. - Register sets —
isa/register_set.hfor ISA-independent register file modeling (SGPR/VGPR/AccVGPR bitsets). - Spill manager —
code/patch/spill_manager.hfor scratch layout planning (DBI spill/fill slots). - Instruction builder —
code/patch/instruction_builder.hfor encoding common instructions (s_branch,s_nop, etc.).
Code style
- C++20. Use standard library features (concepts, ranges,
std::format). - Formatting. The repo uses pre-commit hooks (clang-format for C++,
black for Python, gersemi for CMake). Install once and run before
every commit:
The config lives at the repo root (
pip install pre-commit pre-commit install pre-commit run --all-filesrocm-systems/.pre-commit-config.yaml). - Naming. Use clear, descriptive names. No single-letter variables.
Non-trivial types with methods must be
class(notstruct). Maintainpublic:/protected:/private:ordering. - Comments. Use
@brief/@detailsdoxygen style when documenting public APIs. Avoid decorative comment lines (---,===). Default to writing no comments; only comment when the why is non-obvious. - No
fprintf. Always useLoggerfromutil/log.h. - Exceptions. Exceptions are used only for unrecoverable errors
during initialization and configuration (
ConfigError) or when encountering invalid/unimplemented instructions during code object parsing (InvalidInst,UnimplementedInst). All exception types live inutil/except.h. Do not throw exceptions in simulation hot paths (event handlers, instruction execution, cache lookups). Do not addtry/catchblocks unless you are at a boundary that must translate an error (e.g., the C API layer). There is no general exception safety guarantee — assume code is not exception-safe unless explicitly documented.
ISA codegen workflow
When modifying instruction semantics or adding instruction support:
- Edit
lib/python/amdisa/codegen/_generator.py(never the generated C++ files) - Regenerate with
--multimode (see docs/codegen.md) - Format the generated files with
clang-format - Stage ALL generated files before committing
Testing
- Add tests for new functionality. Place them in
tests/mirroring the source directory structure. - Run the test suite:
ctest --test-dir build - Run Python tests:
cd lib/python && python -m pytest amdisa/tests/ -x - Ensure zero compiler warnings before submitting.
Proposing architectural changes
Large changes that affect the component structure, add new subsystems, change public APIs, or modify the translation/instrumentation pipeline must be proposed before implementation. Open a GitHub issue with:
- A clear title describing the proposed change
- A markdown document (attached or inline) covering:
- Motivation — What problem does this solve and why now?
- Design — Proposed architecture, component interactions, data flow
- Alternatives considered — What else was evaluated and why it was rejected
- Migration / compatibility — Impact on existing code, tests, and users
- Scope — What is and is not included in the change
Wait for maintainer review and approval before starting implementation. This avoids wasted effort on changes that conflict with the project direction or duplicate ongoing work.
Examples of changes that require a proposal:
- Adding a new translation pair or instrumentation pass
- Changing the KFD ioctl interface or RPC protocol
- Restructuring the simulation engine or cache hierarchy
- Introducing new external dependencies
Bug fixes, test additions, and localized improvements do not need a proposal — open a PR directly.
Commit hygiene
- Never commit buggy or untested code. Verify end-to-end first.
- Write concise commit messages focused on the why, not the what.
- When regenerating ISA files, include all generated output in the same commit as the generator change.