From ba12a299b8b6133947927ae438c5a75736e373cb Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Mon, 26 Oct 2026 13:16:06 -0700 Subject: [PATCH 1/2] Add AGENTS.md and templates Flagged by agent readiness checking tools --- .github/ISSUE_TEMPLATE/bug_report.yml | 47 ++++++++ .github/ISSUE_TEMPLATE/config.yml | 8 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 22 ++++ .gitignore | 4 + AGENTS.md | 126 +++++++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 AGENTS.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..4d79d68e59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,47 @@ +name: Bug report +description: Report incorrect behavior, a crash, or a build failure +labels: ["bug"] +body: + - type: textarea + id: description + attributes: + label: Description + description: What happened, and what did you expect? + validations: + required: true + - type: textarea + id: reproducer + attributes: + label: Reproducer + description: Minimal code or commands that trigger the problem. + render: python + validations: + required: true + - type: textarea + id: output + attributes: + label: Output + description: Full traceback or error output. Run with `DPCTL_VERBOSITY=warning` for C API diagnostics. + render: shell + - type: input + id: version + attributes: + label: dpctl version + description: Output of `python -c "import dpctl; print(dpctl.__version__)"` + validations: + required: true + - type: textarea + id: devices + attributes: + label: Devices + description: Output of `python -m dpctl -f` + render: shell + validations: + required: true + - type: textarea + id: environment + attributes: + label: Environment + description: OS, Python version (and whether free-threaded), how dpctl was installed (conda/pip/source), DPC++ compiler version if built from source. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..3836a39ff5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Questions and discussions + url: https://github.com/IntelPython/dpctl/discussions + about: Ask usage questions here. + - name: Security vulnerabilities + url: https://github.com/IntelPython/dpctl/blob/master/SECURITY.md + about: Report security issues privately, not as public issues. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..6b49a56688 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,22 @@ +name: Feature request +description: Propose new SYCL functionality or an API change +labels: ["enhancement"] +body: + - type: textarea + id: motivation + attributes: + label: Motivation + description: What do you need to do that dpctl does not support today? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed API + description: Python, Cython, or C API you would like, and the SYCL feature it maps to. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered diff --git a/.gitignore b/.gitignore index f8d185c7a9..454b0ebe5d 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,7 @@ dpctl/resources/cmake # asv artifacts *.asv* + +# agent-related +.agents/* +.claude/* diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..be6b8a8a8d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,126 @@ +# AGENTS.md + +dpctl is a Python/Cython wrapper over a subset of SYCL, built on a C API +library (`libsyclinterface`). It is compiled with Intel oneAPI DPC++ (`icx`/`icpx`). + +## Environment + +- Activate the compiler before building or testing: `source /opt/intel/oneapi/setvars.sh` + (or use a conda env with `dpcpp_linux-64`). The environment does not persist + between shell invocations; source it in the same command: + `source /opt/intel/oneapi/setvars.sh && python -m pytest dpctl/tests/...`. +- Check visible devices: `sycl-ls`. Tests skip on missing devices/aspects; a CPU + OpenCL device is enough for most of the suite. +- Python build deps: `pip install numpy cython scikit-build cmake ninja pytest "versioneer[toml]==0.29"`. + +## Commands + +- Build in place + editable install: `python scripts/build_locally.py --verbose` + - defaults to `icx`/`icpx` on `PATH`; other compilers need `--compiler-root` + - `--debug`, `--clean`, `--target-cuda[=sm_XX]`, `--target-hip=`, + `--cmake-opts="-D..."` +- Python tests: `python -m pytest dpctl/tests` + - one file: `python -m pytest dpctl/tests/test_sycl_queue.py` + - one test: `python -m pytest dpctl/tests/test_sycl_queue.py -k memset` + - without a C compiler/Cython: add `-k "not test_cython_api and not test_c_headers"` +- C API tests (GoogleTest, needs `GTEST_ROOT`): `bash libsyclinterface/dbg_build.sh` + (runs `make check`) +- Coverage (C + Python, rebuilds with `-DDPCTL_BUILD_CAPI_TESTS=ON`): + `python scripts/gen_coverage.py --oneapi` +- Docs (needs doxyrest): `python scripts/gen_docs.py --doxyrest-root=` +- Lint/format one file (no build needed): `pre-commit run --files ` +- Lint/format everything: `pre-commit run --all-files` + (black, isort, flake8, cython-lint, clang-format, codespell, bandit, shellcheck, + gitleaks, actionlint). Config: `pyproject.toml`, `.flake8`, `.clang-format`. + +## Structure + +- `libsyclinterface/` — C API over SYCL (C++ implementation) + - `include/syclinterface/*.h` — public C headers, `DPCTL_` functions + - `source/*.cpp` — implementations + - `tests/*.cpp` — GoogleTest suite; `*.spv` are prebuilt kernel fixtures +- `dpctl/` — Python package + - `_backend.pxd` — Cython `extern` declarations of the C API + - `_sycl_*.pyx/.pxd` — `SyclDevice`, `SyclQueue`, `SyclContext`, `SyclEvent`, ... + - `memory/` — USM memory objects (`MemoryUSMDevice`, ...), IPC memory + - `compiler/` — `SyclKernelBundle` creation (SPIR-V, SYCL source) + - `program/` — deprecated alias of `dpctl.compiler` + - `utils/` — order manager, device queries, Intel device info + - `apis/include/` — Python C-API headers for extensions (`dpctl_capi.h`, `dpctl4pybind11.hpp`) + - `tests/` — pytest suite; `tests/helper/` has `get_queue_or_skip` and friends +- `examples/` — python, cython, pybind11, c extension examples (each with README) +- `docs/doc_sources/` — Sphinx sources +- `conda-recipe/`, `conda-recipe-cf/` — conda packaging used by CI +- `scripts/` — build, coverage, docs drivers + +## Adding a SYCL feature (typical PR shape) + +1. Declare in `libsyclinterface/include/syclinterface/dpctl_sycl__interface.h` + with a Doxygen comment and ownership attributes. +2. Implement in `libsyclinterface/source/dpctl_sycl__interface.cpp`. +3. Add GoogleTest cases in `libsyclinterface/tests/test_sycl__interface.cpp`. +4. Declare in `dpctl/_backend.pxd`; wrap in `dpctl/_sycl_.pyx` (and `.pxd` if + the method is `cdef`). +5. Add pytest coverage in `dpctl/tests/`. +6. Add a `CHANGELOG.md` entry with the PR link. + +Reference PRs to copy from: +- New queue operation: gh-2361 (`DPCTLQueue_Memset` → `SyclQueue.memset`, + `dpctl/tests/test_sycl_queue_memset.py`). +- New device info query: gh-2324 (`dpctl_sycl_device_interface.h` → + `dpctl/_sycl_device.pyx`; register the check in + `dpctl/tests/_device_attributes_checks.py`). New enums go through + `dpctl_sycl_enum_types.h`, `libsyclinterface/helper/`, and `dpctl/enum_types.py`. + +## Conventions + +### C API +- Opaque refs (`DPCTLSyclQueueRef`, ...) via `wrap`/`unwrap` + (`dpctl_sycl_type_casters.hpp`). +- Annotate ownership: `__dpctl_give` (caller must delete), `__dpctl_take` + (callee consumes), `__dpctl_keep` (borrowed). See `Support/MemOwnershipAttrs.h`. +- Never let a C++ exception cross the C boundary: catch, call + `error_handler(e, __FILE__, __func__, __LINE__)`, return `nullptr`/error value. +- Null-check every incoming ref and report via `error_handler`. +- Errors are silent unless `DPCTL_VERBOSITY=warning` (or `error`) is set; set it + when debugging a `nullptr` return. + +### Cython / Python +- Release the GIL (`with nogil:`) around calls that may block on the device. +- Python-visible errors: raise specific exceptions (`TypeError`, `ValueError`, + `SyclQueueCreationError`, ...) when the C API returns `NULL`. +- Free-threaded CPython (3.14t) is supported; do not rely on the GIL for + thread safety of shared state. +- Line length 80 (black, isort, cython-lint, clang-format). + +### Tests +- Get devices with `get_queue_or_skip()` / skip on missing aspects; never assume + a GPU or fp64 support. +- Test both sync and `*_async` variants when adding queue operations. + +### Files +- New files need the Apache-2.0 license header from `CONTRIBUTING.md` + (C/C++ headers also need the `\file` Doxygen block). +- Comments and docstrings: short, describe what the code does. + +## Git + +- Branch off `master`; pre-commit blocks commits directly to `master` and + `maintenance/*`. +- One concern per PR; fill in `.github/pull_request_template.md`. +- Update `CHANGELOG.md` (Keep a Changelog sections: Added, Changed, Deprecated, + Removed, Fixed, Maintenance) for user-visible changes, citing `gh-NNNN`. + +## Boundaries + +- Generated, do not edit: `dpctl/*.cxx`, `dpctl/**/*.cxx`, `dpctl/include/` + (headers copied/generated at build time), `dpctl/_version.py` (versioneer), + `_skbuild/`, `build/`. +- Edit C headers in `libsyclinterface/include/`, not their copies under `dpctl/include/`. +- In-place `.so` files survive branch switches; rebuild (`--clean`) before + trusting test results after checking out another branch. +- Changing an existing C API signature or enum value is a breaking change: + call it out in the PR and the CHANGELOG `NOTE` list. +- `.github/workflows/` actions are pinned to commit SHAs (checked by zizmor); + keep that when adding steps. +- `conda-recipe*/`, release versions, and doc version lists need maintainer review. From 36da9292fc7942b9a4972814ade8718792dbac7e Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Mon, 26 Oct 2026 14:10:23 -0700 Subject: [PATCH 2/2] Apply review comments --- .gitignore | 10 ++++++++-- AGENTS.md | 5 ++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 454b0ebe5d..a391dce26f 100644 --- a/.gitignore +++ b/.gitignore @@ -106,5 +106,11 @@ dpctl/resources/cmake *.asv* # agent-related -.agents/* -.claude/* +.claude/settings.local.json +.claude/worktrees/ + +# virtual environments, test caches, local env files +.venv/ +venv/ +.pytest_cache/ +.env diff --git a/AGENTS.md b/AGENTS.md index be6b8a8a8d..085ad38a52 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,10 +21,9 @@ library (`libsyclinterface`). It is compiled with Intel oneAPI DPC++ (`icx`/`icp `--cmake-opts="-D..."` - Python tests: `python -m pytest dpctl/tests` - one file: `python -m pytest dpctl/tests/test_sycl_queue.py` - - one test: `python -m pytest dpctl/tests/test_sycl_queue.py -k memset` + - one test: `python -m pytest dpctl/tests/test_sycl_queue_memset.py::test_memset_partial_count` - without a C compiler/Cython: add `-k "not test_cython_api and not test_c_headers"` -- C API tests (GoogleTest, needs `GTEST_ROOT`): `bash libsyclinterface/dbg_build.sh` - (runs `make check`) +- C API tests (GoogleTest, needs `GTEST_ROOT`): `(cd libsyclinterface && bash dbg_build.sh)` - Coverage (C + Python, rebuilds with `-DDPCTL_BUILD_CAPI_TESTS=ON`): `python scripts/gen_coverage.py --oneapi` - Docs (needs doxyrest): `python scripts/gen_docs.py --doxyrest-root=`