Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
392fdbb
Replace the sparse back-end hooks with storage-parametric types
maleadt Sep 25, 2026
3883d4e
Convert between dense and sparse arrays and materialize transposes
maleadt Sep 25, 2026
2914642
Assemble sparse arrays from coordinates on the device
maleadt Sep 25, 2026
676993d
Bump GPUArrays to 12.0.0 and JLArrays to 0.5.0
maleadt Sep 25, 2026
ce27c3f
Implement sparse × dense products
maleadt Sep 25, 2026
33bb487
Broadcast over COO and mixed sparse formats
maleadt Sep 25, 2026
601b617
Implement structural operations on sparse matrices
maleadt Sep 25, 2026
1a01e09
Index GPU sparse arrays with ranges and slices
maleadt Sep 25, 2026
16d3f98
Add dot products, count/any/all, and element-type conversions
maleadt Sep 25, 2026
76ca44f
Multiply sparse matrices
maleadt Sep 25, 2026
b6af96c
Plan the GPUArrays v13 sparse interface and backend migration
maleadt Oct 21, 2026
a3d94a2
Reconcile sparse reference algorithms with GPUArrays 12 main
maleadt Oct 21, 2026
9b116ed
Use the scaled dense norm for stored sparse values
maleadt Oct 21, 2026
52b2e7e
Expose dense storage resizing capability for mutation preflight
maleadt Oct 21, 2026
9b6b82b
Separate sparse pointer storage and enforce canonical mutation contracts
maleadt Oct 21, 2026
d5e5050
Centralize sparse product selection and array semantics
maleadt Oct 21, 2026
2c797a8
Exercise v13 sparse contracts across dense backends
maleadt Oct 21, 2026
b357700
Document v13 sparse contracts and coordinated migration progress
maleadt Oct 21, 2026
7bba4e2
Fail CI on backend installation errors and nightly regressions
maleadt Oct 21, 2026
bcf3422
Keep scalar sparse comparisons independent of structural output widths
maleadt Oct 21, 2026
7e23537
Check sparse value narrowing separately from index conversion
maleadt Oct 21, 2026
c09c1af
Preflight sparse value conversions and storage placement
maleadt Oct 21, 2026
1b6757e
Avoid Metal miscompilation of wide sparse union counts
maleadt Oct 21, 2026
44b9e3b
Follow component storage scalar-access policy in sparse tests
maleadt Oct 21, 2026
3b72005
Select sparse products centrally and admit vendor-owned formats
maleadt Oct 21, 2026
6e421f1
Record current migration checkpoints and hardware failure evidence
maleadt Oct 21, 2026
70fdfca
Support ordered boolean mask slices in canonical sparse formats
maleadt Oct 21, 2026
2f996a1
Preserve triangular solve wrappers and inspect sparse product buffers…
maleadt Oct 21, 2026
22df6fb
Integrate cuSPARSE and oneMKL through GPUArrays-owned execution selec…
maleadt Oct 21, 2026
31c4659
Record vendor migration validation and cleanup review decisions
maleadt Oct 21, 2026
4505791
Support borrowed sparse column views and exact numerical snapshots
maleadt Oct 21, 2026
a20b7cb
Preserve product semantics across CUDA normalization and version limits
maleadt Oct 21, 2026
f8e31c4
Specify oneMKL prepared snapshot and refresh contract
maleadt Oct 21, 2026
9ddc474
Preserve sparse constructor, wrapper arithmetic and slicing compatibi…
maleadt Oct 21, 2026
7889d6c
Restrict vendor SpMM selection to supported operand layouts
maleadt Oct 21, 2026
8baa6c7
docs: refresh physical backend validation checkpoint
maleadt Oct 21, 2026
e6f717f
Preserve wrapper arithmetic, promotion and array compatibility
maleadt Oct 21, 2026
f0824a8
Allow floating Kronecker rounding while checking exact structure
maleadt Oct 21, 2026
96f51e0
Document scale-and-promote product association and review decision
maleadt Oct 21, 2026
981ba05
Integrate rocSPARSE selection and vendor solves centrally
maleadt Oct 21, 2026
d26d1fa
Preserve BSR arithmetic and identity through canonical integration
maleadt Oct 21, 2026
176db7a
Reject narrowing overflow before format-conversion allocation
maleadt Oct 21, 2026
ebda95b
Import Test before querying optional test-runner features
maleadt Oct 21, 2026
4d2661a
Transfer GPU diagonal storage explicitly in host array constructors
maleadt Oct 21, 2026
8f43d2e
Preserve wrapped diagonal offsets and empty out-of-range results
maleadt Oct 21, 2026
6617619
Preflight typed wrappers and stored diagonal entries before allocation
maleadt Oct 21, 2026
c3250a6
Reject mismatched dense and generalized sparse dot dimensions
maleadt Oct 21, 2026
5313858
Materialize structured sparse operands for mixed addition and subtrac…
maleadt Oct 21, 2026
54522bd
docs: record coordinated CI, hardware parity and remaining gates [onl…
maleadt Oct 21, 2026
0b1460f
Record PR retarget, validated entrypoint and SpGEMM publication contract
maleadt Oct 21, 2026
688778b
Benchmark migrated sparse execution and observed device memory agains…
maleadt Oct 21, 2026
262d8bb
Own dense sparse entrypoint policy while preserving backend defaults
maleadt Oct 21, 2026
820f806
Add reproducible backend sparse validation and portable-only driver
maleadt Oct 21, 2026
256a629
Record final-stack checks, policy migration and OpenCL isolation evid…
maleadt Oct 21, 2026
ddba8ce
Update validation-driver checkpoint
maleadt Oct 21, 2026
974c082
Keep rectangular identity regressions independent of stdlib restrictions
maleadt Oct 21, 2026
91b31f1
Record exact shared-suite results and backend CI wiring checkpoint [o…
maleadt Oct 21, 2026
3ceeb6e
Retain deprecated canonical-format dispatch names and document downst…
maleadt Oct 21, 2026
c0134e1
Record downstream sparse API migration audit [only tests]
maleadt Oct 21, 2026
d9350ef
Record OpenCL compilation routes and unsupported-type preflight in va…
maleadt Oct 21, 2026
8609e8d
TEMP CI: validate the pinned unreleased sparse-v13 stack [only tests]
maleadt Oct 21, 2026
f1b0abd
Keep sparse broadcast combinations on the checked GPU path
maleadt Oct 21, 2026
d26c2dd
Include implicit zeros in negative-order sparse norms
maleadt Oct 21, 2026
6b04c67
Test sparse entry rendering independently of CPU MIME presentation
maleadt Oct 21, 2026
f10a01f
Use scalar magnitudes for nonfinite complex norm references
maleadt Oct 21, 2026
8b6fb9f
Document final sparse contracts, validation and coordinated release g…
maleadt Oct 21, 2026
08f0630
Keep zero-dimensional GPU fusion inside sparse broadcast preflight
maleadt Oct 21, 2026
5e6c98d
Reject unsupported broadcast dimensions before generic fallback
maleadt Oct 21, 2026
76600f3
Record artifact validation and consolidate the sparse release handoff
maleadt Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
194 changes: 22 additions & 172 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,56 +14,14 @@ steps:
codecov: true
commands: |
unset LD_LIBRARY_PATH
julia -e 'using Pkg

gpuarrays = pwd()
gpuarrayscore = joinpath(gpuarrays, "lib", "GPUArraysCore")
devdir = mktempdir()
package = joinpath(devdir, "CUDA")

println("--- :julia: Installing TestEnv")
Pkg.activate(; temp=true)
Pkg.add("TestEnv")
using TestEnv

println("--- :julia: Installing CUDA.jl")
withenv("JULIA_PKG_PRECOMPILE_AUTO" => 0,
"JULIA_PKG_DEVDIR" => devdir) do
try
Pkg.develop("CUDA")
Pkg.activate(package)
Pkg.develop([
PackageSpec(path=gpuarrays), PackageSpec(path=gpuarrayscore),
PackageSpec(path=joinpath(package, "CUDACore")),
PackageSpec(path=joinpath(package, "CUDATools")),
PackageSpec(path=joinpath(package, "lib", "cupti")),
PackageSpec(path=joinpath(package, "lib", "nvml")),
PackageSpec(path=joinpath(package, "lib", "cublas")),
PackageSpec(path=joinpath(package, "lib", "cusparse")),
PackageSpec(path=joinpath(package, "lib", "cusolver")),
PackageSpec(path=joinpath(package, "lib", "cufft")),
PackageSpec(path=joinpath(package, "lib", "curand")),
])
TestEnv.activate()
catch err
@error "Could not install CUDA.jl" exception=(err,catch_backtrace())
exit(3)
finally
Pkg.activate(package)
end
end

println("+++ :julia: Running tests")
Pkg.test(; coverage="@" * gpuarrays)'
julia .buildkite/sparse-v13-stack.jl CUDA
agents:
queue: "cuda"
if: |
build.message !~ /\[skip [^\]]*(tests|cuda)/ &&
(build.message =~ /\[only [^\]]*(tests|cuda)/ ||
build.message !~ /\[only / && !build.pull_request.draft)
timeout_in_minutes: 120
soft_fail:
- exit_status: 3

- label: "CUDA.jl -- Julia {{matrix.julia}}"
plugins:
Expand All @@ -73,36 +31,7 @@ steps:
codecov: true
commands: |
unset LD_LIBRARY_PATH
julia -e 'using Pkg

gpuarrays = pwd()
gpuarrayscore = joinpath(gpuarrays, "lib", "GPUArraysCore")
devdir = mktempdir()
package = joinpath(devdir, "CUDA")

println("--- :julia: Installing TestEnv")
Pkg.activate(; temp=true)
Pkg.add("TestEnv")
using TestEnv

println("--- :julia: Installing CUDA.jl")
withenv("JULIA_PKG_PRECOMPILE_AUTO" => 0,
"JULIA_PKG_DEVDIR" => devdir) do
try
Pkg.develop("CUDA")
Pkg.activate(package)
Pkg.develop([PackageSpec(path=gpuarrays), PackageSpec(path=gpuarrayscore)])
TestEnv.activate()
catch err
@error "Could not install CUDA.jl" exception=(err,catch_backtrace())
exit(3)
finally
Pkg.activate(package)
end
end

println("+++ :julia: Running tests")
Pkg.test(; coverage="@" * gpuarrays)'
julia .buildkite/sparse-v13-stack.jl CUDA
agents:
queue: "cuda"
if: |
Expand All @@ -114,8 +43,6 @@ steps:
setup:
julia:
- "1.13"
soft_fail:
- exit_status: 3

- label: "AMDGPU.jl -- Julia {{matrix.julia}}"
plugins:
Expand All @@ -124,36 +51,7 @@ steps:
- JuliaCI/julia-coverage#v1:
codecov: true
command: |
julia -e 'using Pkg

gpuarrays = pwd()
gpuarrayscore = joinpath(gpuarrays, "lib", "GPUArraysCore")
devdir = mktempdir()
package = joinpath(devdir, "AMDGPU")

println("--- :julia: Installing TestEnv")
Pkg.activate(; temp=true)
Pkg.add("TestEnv")
using TestEnv

println("--- :julia: Installing AMDGPU.jl")
withenv("JULIA_PKG_PRECOMPILE_AUTO" => 0,
"JULIA_PKG_DEVDIR" => devdir) do
try
Pkg.develop("AMDGPU")
Pkg.activate(package)
Pkg.develop([PackageSpec(path=gpuarrays), PackageSpec(path=gpuarrayscore)])
TestEnv.activate()
catch err
@error "Could not install AMDGPU.jl" exception=(err,catch_backtrace())
exit(3)
finally
Pkg.activate(package)
end
end

println("+++ :julia: Running tests")
Pkg.test(; coverage="@" * gpuarrays)'
julia .buildkite/sparse-v13-stack.jl AMDGPU
agents:
queue: "rocm"
rocmgpu: "*"
Expand All @@ -167,8 +65,6 @@ steps:
julia:
- "1.10"
- "1.13"
soft_fail:
- exit_status: 3

- label: "oneAPI.jl -- Julia {{matrix.julia}}"
plugins:
Expand All @@ -177,37 +73,7 @@ steps:
- JuliaCI/julia-coverage#v1:
codecov: true
command: |
julia -e 'using Pkg

gpuarrays = pwd()
gpuarrayscore = joinpath(gpuarrays, "lib", "GPUArraysCore")
devdir = mktempdir()
package = joinpath(devdir, "oneAPI")

println("--- :julia: Installing TestEnv")
Pkg.activate(; temp=true)
Pkg.add("TestEnv")
using TestEnv

println("--- :julia: Installing oneAPI.jl")
withenv("JULIA_PKG_PRECOMPILE_AUTO" => 0,
"JULIA_PKG_DEVDIR" => devdir) do
try
Pkg.develop("oneAPI")
include(joinpath(package, "deps", "build_ci.jl"))
Pkg.activate(package)
Pkg.develop([PackageSpec(path=gpuarrays), PackageSpec(path=gpuarrayscore)])
TestEnv.activate()
catch err
@error "Could not install oneAPI.jl" exception=(err,catch_backtrace())
exit(3)
finally
Pkg.activate(package)
end
end

println("+++ :julia: Running tests")
Pkg.test(; coverage="@" * gpuarrays)'
julia .buildkite/sparse-v13-stack.jl oneAPI
agents:
queue: "oneapi"
if: |
Expand All @@ -220,8 +86,23 @@ steps:
julia:
- "1.10"
- "1.13"
soft_fail:
- exit_status: 3

- label: "OpenCL.jl -- NVIDIA GPU"
plugins:
- JuliaCI/julia#v1:
version: "1.13"
- JuliaCI/julia-coverage#v1:
codecov: true
command: julia .buildkite/sparse-v13-stack.jl OpenCL --platform=cuda --verbose
agents:
queue: "cuda"
env:
OCL_ICD_FILENAMES: "libnvidia-opencl.so.1"
if: |
build.message !~ /\[skip [^\]]*(tests|opencl)/ &&
(build.message =~ /\[only [^\]]*(tests|opencl)/ ||
build.message !~ /\[only / && !build.pull_request.draft)
timeout_in_minutes: 120

- label: "Metal.jl -- Julia {{matrix.julia}}"
plugins:
Expand All @@ -230,36 +111,7 @@ steps:
- JuliaCI/julia-coverage#v1:
codecov: true
command: |
julia -e 'using Pkg

gpuarrays = pwd()
gpuarrayscore = joinpath(gpuarrays, "lib", "GPUArraysCore")
devdir = mktempdir()
package = joinpath(devdir, "Metal")

println("--- :julia: Installing TestEnv")
Pkg.activate(; temp=true)
Pkg.add("TestEnv")
using TestEnv

println("--- :julia: Installing Metal.jl")
withenv("JULIA_PKG_PRECOMPILE_AUTO" => 0,
"JULIA_PKG_DEVDIR" => devdir) do
try
Pkg.develop("Metal")
Pkg.activate(package)
Pkg.develop([PackageSpec(path=gpuarrays), PackageSpec(path=gpuarrayscore)])
TestEnv.activate()
catch err
@error "Could not install Metal.jl" exception=(err,catch_backtrace())
exit(3)
finally
Pkg.activate(package)
end
end

println("+++ :julia: Running tests")
Pkg.test(; coverage="@" * gpuarrays, test_args=`--all`)'
julia .buildkite/sparse-v13-stack.jl Metal
agents:
queue: "metal"
if: |
Expand All @@ -272,8 +124,6 @@ steps:
julia:
- "1.10"
- "1.13"
soft_fail:
- exit_status: 3

env:
SECRET_CODECOV_TOKEN: "GrevHmzmr2Vt6UK4wbbTTB1+kcMcIlF6nCXVCk3Z0plHDimpD6BwdN9T2A+5J9k3I2em0xXUqpt+2qUSqM8Bn5mNdpjR0TvxVY3oYXc+qzvBXmcZJpuCgJeoTP1P+kVFwszUn4na3fohNq9Qffp6tXMn/j8yJQKOiiC8mkD0aPEI0zISHuDaa/7j7JYf0vTrMRRZ9BMUQHmFuVaIQN8FLGG2BiE3236rj4eHh0lj2IfekCG3wd/LUzAsMx0MC3kIR8WzOWW2rf6xUMPkjm5+NuHwhAOcZc0+LRM7GYIwoW/nHAgyIqjvLiInNFmaJk+7V/GAKtd+gSAIzmyBUHAy6A==;U2FsdGVkX1+4ZljneQoaNE295nRIx8D6+WoFIgT6Pg2BXHaTyhTL4sxEcG0jX0e7oq68uvi4bK7x7YMS4L0Kew=="
Loading
Loading