From 97680261fb95b4f59bdec6b7567f97168ba84ce9 Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Thu, 5 Nov 2026 12:18:04 +0100 Subject: [PATCH] Skip ComplexF16 sparse tests on the LTS stack GPUArrays 12.2's sparse reduction kernels return wrong real parts for ComplexF16 when compiled by the LTS IGC (2.11) with Julia 1.13, which broke the Aurora CI. IGC's load/store combining packs the accumulator into a layout struct and miscompiles a copy of it. The bug reproduces on DG2 with IGC 2.11.7, and was fixed upstream in IGC 2.26.0 by intel/intel-graphics-compiler@15614f2, which has not been backported to the 2.11 LTS line. --- docs/src/lts.md | 11 ++++++++++- test/runtests.jl | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/src/lts.md b/docs/src/lts.md index fdff0b15..f8b9ab5f 100644 --- a/docs/src/lts.md +++ b/docs/src/lts.md @@ -155,11 +155,20 @@ This workaround is independent of `ONEAPI_LTS` and can be enabled on its own. `cumsum` are unaffected. It is not reproducible on Xe-LP hardware with the same NEO 25.18 / IGC 2.11 user-mode driver, so it looks specific to IGC's PVC code generation. There is no workaround in oneAPI.jl yet. +- **`ComplexF16` sparse reductions.** With Julia 1.13, `sum(A; dims)` and other reductions + along a dimension of a `ComplexF16` sparse matrix return wrong real parts; the imaginary + parts are correct. IGC's load/store combining packs the complex accumulator into a layout + struct, and copying that struct emits a stray move that overwrites the real field with + another lane's data. This is not specific to PVC: the LTS IGC 2.11.7 produces the same + wrong results on DG2. It was fixed upstream in IGC 2.26.0 (and 2.25.10) by + [intel/intel-graphics-compiler@15614f2](https://github.com/intel/intel-graphics-compiler/commit/15614f288101c71739ff41d4e21cef6e4dad3e8e), + which has not been backported to the 2.11 LTS line (checked up to 2.11.54). Building the + module with `-igc_opts 'EnableLdStCombine=0'` avoids it. ## Running the test suite The test suite reads the same switch and skips the cases the LTS stack cannot support (the -`BFloat16` element type, the BFloat16 example, `ComplexF32` in the accumulate tests). On a multi-tile node, pinning each test +`BFloat16` element type, the BFloat16 example, `ComplexF32` in the accumulate tests, `ComplexF16` in the sparse tests). On a multi-tile node, pinning each test worker to its own tile avoids the oversubscription that provokes the dropped-tail corruption: diff --git a/test/runtests.jl b/test/runtests.jl index 5bbdcb1a..c43e0cca 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -144,6 +144,12 @@ init_worker_code = quote if oneL0.LTS[] && test === TestSuite.test_accumulate filter!(!=(ComplexF32), typs) end + # The LTS IGC (2.11) miscompiles the ComplexF16 accumulator of GPUArrays' sparse + # reductions with Julia 1.13, corrupting the real parts. Fixed upstream in IGC 2.26 + # (intel/intel-graphics-compiler@15614f2), not in the LTS line; see docs/src/lts.md. + if oneL0.LTS[] && test === TestSuite.test_sparse + filter!(!=(ComplexF16), typs) + end return typs end