Skip to content

Fix more kernel launches over INT_MAX work-items with DPC++ 2026.2 - #3104

Merged
antonwolfy merged 5 commits into
masterfrom
fix-id-queries-link-flag
Oct 23, 2026
Merged

antonwolfy merged 5 commits into
masterfrom
fix-id-queries-link-flag

Conversation

@antonwolfy

Copy link
Copy Markdown
Contributor

This PR passes -fno-sycl-id-queries-fit-in-int at both compile and link time to the ufunc, window and statistics extensions and to the dpnp_backend_c library. Until now only the dpnp.tensor modules and the indexing extension had it.

With DPC++ 2026.2 the range a kernel assumes for its work-item IDs is recorded at the device link step, so these modules recorded the default int range, and their kernels failed when launched over more than INT_MAX work-items:

RuntimeError: The kernel was compiled with -fsycl-id-queries-range=int, but the provided range/offset exceeds the maximum value storable in an int. Either reduce the range/offset or recompile the kernel with -fsycl-id-queries-range=[uint|size_t].

The other extensions don't need the option: fft, lapack, sparse and vm compile no kernels of their own, and the only blas kernel (syrk) runs over an n x n range, where no single dimension can exceed INT_MAX. In statistics each work-item processes several elements, so the limit is reached only for very large inputs.

Validated with DPC++ 2026.2 on Intel Data Center GPU Max 1100 (Level Zero) and on CPU (OpenCL), on inputs with 2**31 + 1 elements; results are the same on both devices:

Case Module Before After
dpnp.gcd on broadcast int8 inputs ufunc failed passed
dpnp.hamming(2**31 + 1) window failed passed
dpnp.random.logistic(size=2**31 + 1) dpnp_backend_c failed passed

test_binary_ufuncs.py, test_histogram.py, test_window.py, test_product.py, test_random_state.py, test_statistics.py, test_fft.py and test_special.py pass on both devices, and the build has no new warnings.

No new tests are added: these cases need multi-GiB allocations, so as slow tests they would not run in CI and would skip on most devices.

  • Have you provided a meaningful PR description?
  • Have you added a test, reproducer or referred to an issue with a reproducer?
  • Have you tested your changes locally for CPU and GPU devices?
  • Have you made sure that new changes do not introduce compiler warnings?
  • Have you checked performance impact of proposed changes?
  • Have you added documentation for your changes, if necessary?
  • Have you added your changes to the changelog?

With DPC++ 2026.2 the work-item ID range is recorded at the device link
step, so modules built without the option at link time fail to launch
kernels over more than INT_MAX work-items. Pass it at compile and link
time to the ufunc, window and statistics extensions and to the
dpnp_backend_c library, whose kernels can be launched over such ranges.
@antonwolfy antonwolfy self-assigned this Oct 15, 2026
@antonwolfy antonwolfy added this to the 0.21.0 release milestone Oct 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

View rendered docs @ https://intelpython.github.io/dpnp/pull/3104/index.html

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Array API standard conformance tests for dpnp=0.21.0dev15=np2py314h8d9cdd5_18 ran successfully.
Passed: 1376
Failed: 0
Skipped: 6

@coveralls

coveralls commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Coverage Status

coverage: 82.62%. remained the same — fix-id-queries-link-flag into master

Comment thread dpnp/backend/extensions/statistics/CMakeLists.txt
Comment thread CHANGELOG.md Outdated
antonwolfy and others added 2 commits October 22, 2026 21:01
@vlad-perevezentsev
vlad-perevezentsev self-requested a review October 23, 2026 08:18

@vlad-perevezentsev vlad-perevezentsev left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM
Thank you @antonwolfy !

@antonwolfy

Copy link
Copy Markdown
Contributor Author

@exai-bot /review

@antonwolfy
antonwolfy merged commit 211a242 into master Oct 23, 2026
133 of 139 checks passed
@antonwolfy
antonwolfy deleted the fix-id-queries-link-flag branch October 23, 2026 11:08
antonwolfy added a commit that referenced this pull request Oct 26, 2026
This PR moves the setup that the nine pybind11 extensions in
`dpnp/backend/extensions` repeat into one CMake function, and raises the
minimum CMake version so the workarounds for older versions can be
removed. It is stacked on #3104 and will be rebased onto master once
that PR is merged.

1. **Require CMake 3.27.** `cmake_minimum_required(VERSION 3.21...3.27)`
claimed that CMake 3.21 was enough, but `pyproject.toml` and the conda
recipes already require CMake 3.31.6 or newer, and
`FetchContent_Declare(... FIND_PACKAGE_ARGS)` for pybind11 needs at
least 3.24. The minimum is now 3.27, which removes the 11 copies of the
Windows workaround for `target_link_options` in CMake older than 3.27.
The policy level stays at 3.27, as builds use today, so no CMake policy
changes behavior.
2. **Shared helper.** The nine extension `CMakeLists.txt` files repeated
about 80 identical lines: the pybind11 module, SYCL, the `_usmarray`
dependency, fat-binary options, include directories, math flags, device
code split, coverage, the redistribution rpath and install.
`build_dpnp_pybind11_ext` in `dpnp/CMakeLists.txt` now does this. Each
extension lists its sources and extra include directories, keeps its own
oneMKL/oneMath linking, and passes `LARGE_RANGES` when its kernels can
be launched over more than `INT_MAX` work-items (`indexing`,
`statistics`, `ufunc`, `window`), which adds
`-fno-sycl-id-queries-fit-in-int` at compile and link time. A new
extension can no longer miss one of these options by copying an outdated
file.

The only change in the generated build is for the `vm` extension: it had
no fat-binary block, so it was the one extension built without
`-fsycl-targets` when `DPNP_TARGET_CUDA`, `DPNP_TARGET_HIP` or
`DPNP_SYCL_TARGETS` is set. It now gets these options like the others.
`vm` compiles no kernels of its own, and in CUDA/HIP builds it compiles
only `vm_py.cpp` and the two shared elementwise helper sources that
`ufunc` already compiles with these options.

**Verification.** The project was configured with CMake 4.4.4, Ninja and
icpx 2026.1, with and without this change on top of the same base, and
every compile and link command (`ninja -t commands` and
`compile_commands.json`), the generated install rules and the configure
warnings were compared:

| Configuration | Result |
|---|---|
| Release (oneMKL) | identical |
| Coverage with `DPNP_GENERATE_COVERAGE`, `DPNP_WITH_REDIST` and
`DPNP_SYCL_TARGETS=spir64-unknown-unknown` | identical, except
`-fsycl-targets` on the `vm` compile and link commands |
| Release with `DPNP_USE_ONEMATH=ON` | identical |

Windows builds are covered by CI.
github-actions Bot added a commit that referenced this pull request Oct 26, 2026
This PR moves the setup that the nine pybind11 extensions in
`dpnp/backend/extensions` repeat into one CMake function, and raises the
minimum CMake version so the workarounds for older versions can be
removed. It is stacked on #3104 and will be rebased onto master once
that PR is merged.

1. **Require CMake 3.27.** `cmake_minimum_required(VERSION 3.21...3.27)`
claimed that CMake 3.21 was enough, but `pyproject.toml` and the conda
recipes already require CMake 3.31.6 or newer, and
`FetchContent_Declare(... FIND_PACKAGE_ARGS)` for pybind11 needs at
least 3.24. The minimum is now 3.27, which removes the 11 copies of the
Windows workaround for `target_link_options` in CMake older than 3.27.
The policy level stays at 3.27, as builds use today, so no CMake policy
changes behavior.
2. **Shared helper.** The nine extension `CMakeLists.txt` files repeated
about 80 identical lines: the pybind11 module, SYCL, the `_usmarray`
dependency, fat-binary options, include directories, math flags, device
code split, coverage, the redistribution rpath and install.
`build_dpnp_pybind11_ext` in `dpnp/CMakeLists.txt` now does this. Each
extension lists its sources and extra include directories, keeps its own
oneMKL/oneMath linking, and passes `LARGE_RANGES` when its kernels can
be launched over more than `INT_MAX` work-items (`indexing`,
`statistics`, `ufunc`, `window`), which adds
`-fno-sycl-id-queries-fit-in-int` at compile and link time. A new
extension can no longer miss one of these options by copying an outdated
file.

The only change in the generated build is for the `vm` extension: it had
no fat-binary block, so it was the one extension built without
`-fsycl-targets` when `DPNP_TARGET_CUDA`, `DPNP_TARGET_HIP` or
`DPNP_SYCL_TARGETS` is set. It now gets these options like the others.
`vm` compiles no kernels of its own, and in CUDA/HIP builds it compiles
only `vm_py.cpp` and the two shared elementwise helper sources that
`ufunc` already compiles with these options.

**Verification.** The project was configured with CMake 4.4.4, Ninja and
icpx 2026.1, with and without this change on top of the same base, and
every compile and link command (`ninja -t commands` and
`compile_commands.json`), the generated install rules and the configure
warnings were compared:

| Configuration | Result |
|---|---|
| Release (oneMKL) | identical |
| Coverage with `DPNP_GENERATE_COVERAGE`, `DPNP_WITH_REDIST` and
`DPNP_SYCL_TARGETS=spir64-unknown-unknown` | identical, except
`-fsycl-targets` on the `vm` compile and link commands |
| Release with `DPNP_USE_ONEMATH=ON` | identical |

Windows builds are covered by CI. 2fe6540
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.

3 participants