Skip to content

Add foreach_index - #779

Draft
vchuravy wants to merge 1 commit into
mg/ndrange-index-mapfrom
vc/foreachindex
Draft

vchuravy wants to merge 1 commit into
mg/ndrange-index-mapfrom
vc/foreachindex

Conversation

@vchuravy

@vchuravy vchuravy commented Sep 13, 2026

Copy link
Copy Markdown
Member

Adds foreach_index(f, itr, backend = get_backend(itr); workgroupsize = nothing), which runs f
once per index of eachindex(itr) with one work item per index, so a loop over the indices of an
array needs no @kernel definition:

function scale!(y, x)
    foreach_index(x) do i
        @inbounds y[i] = 2 * x[i] + 1
    end
    return y
end

f receives the index a for i in eachindex(itr) loop would produce: a linear index for an array
with IndexLinear style, a CartesianIndex otherwise.

Ported from AcceleratedKernels.jl, where
foreachindex is the primitive that map, reduce, sort, accumulate, findall,
searchsorted and reverse are built on, so it has had a lot of use.

Based on mg/ndrange-index-map

Based on mg/ndrange-index-map rather than main, because that branch is what makes this a thin
wrapper: the index space is carried by the ndrange, so

  • the kernel takes no argument besides the function, where AcceleratedKernels passes
    eachindex(itr) as a kernel argument and indexes it with the global index, and
  • an index space that does not start at 1 needs no special handling — @index(Global, Cartesian)
    already returns the shifted index. Covered by a test with an IndexLinear array whose axes1
    is -2:7.

1f7ed89a ("Compute the global linear index arithmetically") also removes the LinearIndices
lookup that pushed the AcceleratedKernels version to unsafe_indices=true, so this uses the
ordinary bounds-checked path.

What the port drops

The AcceleratedKernels signature carries a CPU scheduling policy (max_tasks, min_elems,
prefer_threads) that selects a Threads.@spawn loop over the kernel. 0.10 has no host-threaded
execution path to select — CPU === POCLBackend and get_backend(::Array) === POCLBackend()
and that policy is a backend's business anyway, which is where it lived in 0.9 (CPU_GRAINSIZE
and the static flag). block_size=256 becomes workgroupsize, KA's name for it, and defaults
to nothing so that the backend's autotuning picks it.

Open questions

  • The name. Spelled with an underscore so that it does not collide with the
    AcceleratedKernels export, and so that the difference in behaviour (no scheduler keywords,
    asynchronous, no @inbounds elision) does not hide behind an identical name. The cost is that
    it no longer mirrors eachindex, and that the ecosystem carries two near-identical names. The
    alternative would be foreachindex left unexported.
  • Compile latency on CPU(). Every distinct closure is a fresh POCL compile, so a one-shot
    foreach_index over an Array is far more expensive than the threaded loop it reads like. Fine
    for a loop that runs more than once, but worth saying out loud before users reach for this as a
    @threads replacement.
  • foraxes. Not included: with an ndrange that takes ranges, foreach_index(f, axes(A, 2))
    covers it (with the backend passed explicitly, since a range carries no backend).
  • Asynchronous. This follows every other launch in KA and does not synchronize, even though it
    reads like a for loop that has finished. Documented, but it is a plausible footgun.

Testing

test/foreach_index.jl, wired into the test suite: linear index spaces in 1-3 dimensions (result
plus each index visited exactly once), a CartesianIndices space through a strided view, an
offset linear space, an index space with no device memory (1:100), an explicit workgroupsize,
an explicit backend, an empty index space, and the error for an index space that is neither.
Passes on the CPU backend; not yet run on a GPU backend.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK

@github-actions

github-actions Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 74d3e03... main / 74d3e03...
launch/3D static workgroup, dynamic ndrange 0.0719 ± 0.029 ms 0.0723 ± 0.028 ms 0.994 ± 0.56
launch/3D static workgroup, static ndrange 0.0704 ± 0.033 ms 0.0723 ± 0.029 ms 0.974 ± 0.6
launch/dynamic workgroup, dynamic ndrange 0.0743 ± 0.026 ms 0.0749 ± 0.022 ms 0.991 ± 0.45
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0712 ± 0.031 ms 0.0716 ± 0.032 ms 0.994 ± 0.62
launch/static workgroup, dynamic ndrange 0.0713 ± 0.031 ms 0.0721 ± 0.03 ms 0.988 ± 0.6
launch/static workgroup, static ndrange 0.0716 ± 0.029 ms 0.0723 ± 0.029 ms 0.991 ± 0.56
partition/dynamic workgroup, dynamic ndrange 0.0587 ± 0.0015 μs 0.0582 ± 0.0012 μs 1.01 ± 0.032
partition/static workgroup, dynamic ndrange 0.0782 ± 0.012 μs 0.0698 ± 0.012 μs 1.12 ± 0.26
partition/static workgroup, static ndrange 1.55 ± 0.01 ns 1.55 ± 0.01 ns 1 ± 0.0091
saxpy/default/Float16/1024 0.0764 ± 0.02 ms 0.0766 ± 0.019 ms 0.997 ± 0.36
saxpy/default/Float16/1048576 0.78 ± 0.029 ms 0.775 ± 0.03 ms 1.01 ± 0.054
saxpy/default/Float16/16384 0.0645 ± 0.031 ms 0.0633 ± 0.032 ms 1.02 ± 0.71
saxpy/default/Float16/2048 0.0785 ± 0.028 ms 0.0788 ± 0.025 ms 0.995 ± 0.48
saxpy/default/Float16/256 0.0751 ± 0.023 ms 0.0755 ± 0.016 ms 0.995 ± 0.37
saxpy/default/Float16/262144 0.235 ± 0.029 ms 0.242 ± 0.031 ms 0.972 ± 0.17
saxpy/default/Float16/32768 0.0734 ± 0.03 ms 0.0732 ± 0.03 ms 1 ± 0.58
saxpy/default/Float16/4096 0.0804 ± 0.031 ms 0.0799 ± 0.031 ms 1.01 ± 0.55
saxpy/default/Float16/512 0.0752 ± 0.027 ms 0.0757 ± 0.014 ms 0.993 ± 0.4
saxpy/default/Float16/64 0.0754 ± 0.019 ms 0.0757 ± 0.018 ms 0.996 ± 0.34
saxpy/default/Float16/65536 0.095 ± 0.027 ms 0.0944 ± 0.027 ms 1.01 ± 0.4
saxpy/default/Float32/1024 0.0754 ± 0.019 ms 0.0755 ± 0.014 ms 0.999 ± 0.31
saxpy/default/Float32/1048576 0.484 ± 0.022 ms 0.487 ± 0.023 ms 0.995 ± 0.064
saxpy/default/Float32/16384 0.056 ± 0.029 ms 0.0562 ± 0.03 ms 0.996 ± 0.74
saxpy/default/Float32/2048 0.0742 ± 0.029 ms 0.074 ± 0.03 ms 1 ± 0.57
saxpy/default/Float32/256 0.0753 ± 0.021 ms 0.0753 ± 0.013 ms 1 ± 0.33
saxpy/default/Float32/262144 0.166 ± 0.029 ms 0.165 ± 0.029 ms 1.01 ± 0.25
saxpy/default/Float32/32768 0.0624 ± 0.028 ms 0.0621 ± 0.028 ms 1 ± 0.64
saxpy/default/Float32/4096 0.0732 ± 0.032 ms 0.0706 ± 0.032 ms 1.04 ± 0.65
saxpy/default/Float32/512 0.0751 ± 0.02 ms 0.0752 ± 0.013 ms 0.999 ± 0.32
saxpy/default/Float32/64 0.0754 ± 0.022 ms 0.0757 ± 0.014 ms 0.996 ± 0.35
saxpy/default/Float32/65536 0.0776 ± 0.029 ms 0.0765 ± 0.029 ms 1.01 ± 0.54
saxpy/default/Float64/1024 0.0748 ± 0.025 ms 0.075 ± 0.024 ms 0.998 ± 0.47
saxpy/default/Float64/1048576 0.554 ± 0.077 ms 0.558 ± 0.078 ms 0.992 ± 0.2
saxpy/default/Float64/16384 0.0575 ± 0.028 ms 0.0574 ± 0.029 ms 1 ± 0.7
saxpy/default/Float64/2048 0.0735 ± 0.032 ms 0.0739 ± 0.032 ms 0.994 ± 0.62
saxpy/default/Float64/256 0.0746 ± 0.025 ms 0.0754 ± 0.014 ms 0.99 ± 0.37
saxpy/default/Float64/262144 0.181 ± 0.034 ms 0.182 ± 0.035 ms 0.994 ± 0.27
saxpy/default/Float64/32768 0.0661 ± 0.028 ms 0.0663 ± 0.028 ms 0.996 ± 0.6
saxpy/default/Float64/4096 0.0694 ± 0.03 ms 0.0683 ± 0.03 ms 1.02 ± 0.62
saxpy/default/Float64/512 0.0751 ± 0.017 ms 0.0753 ± 0.015 ms 0.997 ± 0.31
saxpy/default/Float64/64 0.0751 ± 0.023 ms 0.0757 ± 0.018 ms 0.992 ± 0.39
saxpy/default/Float64/65536 0.0844 ± 0.029 ms 0.0836 ± 0.029 ms 1.01 ± 0.49
saxpy/static workgroup=(1024,)/Float16/1024 0.074 ± 0.024 ms 0.074 ± 0.025 ms 1 ± 0.47
saxpy/static workgroup=(1024,)/Float16/1048576 0.774 ± 0.028 ms 0.775 ± 0.029 ms 0.999 ± 0.052
saxpy/static workgroup=(1024,)/Float16/16384 0.0599 ± 0.031 ms 0.0591 ± 0.03 ms 1.01 ± 0.73
saxpy/static workgroup=(1024,)/Float16/2048 0.0756 ± 0.029 ms 0.0765 ± 0.029 ms 0.988 ± 0.54
saxpy/static workgroup=(1024,)/Float16/256 0.0731 ± 0.022 ms 0.073 ± 0.025 ms 1 ± 0.46
saxpy/static workgroup=(1024,)/Float16/262144 0.232 ± 0.03 ms 0.229 ± 0.03 ms 1.01 ± 0.19
saxpy/static workgroup=(1024,)/Float16/32768 0.0697 ± 0.028 ms 0.0698 ± 0.029 ms 0.998 ± 0.57
saxpy/static workgroup=(1024,)/Float16/4096 0.077 ± 0.032 ms 0.0764 ± 0.033 ms 1.01 ± 0.6
saxpy/static workgroup=(1024,)/Float16/512 0.0734 ± 0.021 ms 0.0736 ± 0.025 ms 0.996 ± 0.44
saxpy/static workgroup=(1024,)/Float16/64 0.0728 ± 0.026 ms 0.0729 ± 0.028 ms 0.998 ± 0.52
saxpy/static workgroup=(1024,)/Float16/65536 0.0912 ± 0.024 ms 0.0909 ± 0.023 ms 1 ± 0.37
saxpy/static workgroup=(1024,)/Float32/1024 0.0728 ± 0.019 ms 0.0729 ± 0.02 ms 0.999 ± 0.39
saxpy/static workgroup=(1024,)/Float32/1048576 0.481 ± 0.022 ms 0.488 ± 0.023 ms 0.986 ± 0.065
saxpy/static workgroup=(1024,)/Float32/16384 0.0538 ± 0.027 ms 0.0536 ± 0.026 ms 1 ± 0.7
saxpy/static workgroup=(1024,)/Float32/2048 0.0723 ± 0.029 ms 0.071 ± 0.03 ms 1.02 ± 0.59
saxpy/static workgroup=(1024,)/Float32/256 0.0728 ± 0.027 ms 0.0733 ± 0.023 ms 0.993 ± 0.48
saxpy/static workgroup=(1024,)/Float32/262144 0.165 ± 0.028 ms 0.162 ± 0.028 ms 1.02 ± 0.25
saxpy/static workgroup=(1024,)/Float32/32768 0.0605 ± 0.026 ms 0.0603 ± 0.026 ms 1 ± 0.62
saxpy/static workgroup=(1024,)/Float32/4096 0.0671 ± 0.032 ms 0.0676 ± 0.033 ms 0.992 ± 0.68
saxpy/static workgroup=(1024,)/Float32/512 0.073 ± 0.022 ms 0.0733 ± 0.024 ms 0.996 ± 0.45
saxpy/static workgroup=(1024,)/Float32/64 0.073 ± 0.025 ms 0.0734 ± 0.026 ms 0.994 ± 0.49
saxpy/static workgroup=(1024,)/Float32/65536 0.0735 ± 0.027 ms 0.0736 ± 0.027 ms 0.998 ± 0.52
saxpy/static workgroup=(1024,)/Float64/1024 0.0719 ± 0.028 ms 0.0728 ± 0.028 ms 0.988 ± 0.53
saxpy/static workgroup=(1024,)/Float64/1048576 0.542 ± 0.056 ms 0.551 ± 0.061 ms 0.985 ± 0.15
saxpy/static workgroup=(1024,)/Float64/16384 0.0545 ± 0.026 ms 0.0546 ± 0.026 ms 0.998 ± 0.68
saxpy/static workgroup=(1024,)/Float64/2048 0.071 ± 0.03 ms 0.0694 ± 0.031 ms 1.02 ± 0.63
saxpy/static workgroup=(1024,)/Float64/256 0.0727 ± 0.025 ms 0.0735 ± 0.026 ms 0.988 ± 0.49
saxpy/static workgroup=(1024,)/Float64/262144 0.183 ± 0.032 ms 0.181 ± 0.032 ms 1.02 ± 0.25
saxpy/static workgroup=(1024,)/Float64/32768 0.0633 ± 0.027 ms 0.0629 ± 0.026 ms 1.01 ± 0.6
saxpy/static workgroup=(1024,)/Float64/4096 0.0633 ± 0.031 ms 0.063 ± 0.031 ms 1 ± 0.7
saxpy/static workgroup=(1024,)/Float64/512 0.0721 ± 0.027 ms 0.0732 ± 0.02 ms 0.985 ± 0.46
saxpy/static workgroup=(1024,)/Float64/64 0.0723 ± 0.028 ms 0.0734 ± 0.023 ms 0.984 ± 0.49
saxpy/static workgroup=(1024,)/Float64/65536 0.0813 ± 0.028 ms 0.0821 ± 0.028 ms 0.99 ± 0.48
time_to_load 0.756 ± 0.0074 s 0.749 ± 0.0038 s 1.01 ± 0.011
main 74d3e03... main / 74d3e03...
launch/3D static workgroup, dynamic ndrange 7 allocs: 0.297 kB 7 allocs: 0.297 kB 1
launch/3D static workgroup, static ndrange 8 allocs: 0.328 kB 8 allocs: 0.328 kB 1
launch/dynamic workgroup, dynamic ndrange 17 allocs: 0.469 kB 17 allocs: 0.469 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, dynamic ndrange 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, static ndrange 4 allocs: 0.203 kB 4 allocs: 0.203 kB 1
partition/dynamic workgroup, dynamic ndrange 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
partition/static workgroup, dynamic ndrange 2 allocs: 32 B 2 allocs: 32 B 1
partition/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
time_to_load 0.201 k allocs: 11.8 kB 0.201 k allocs: 11.8 kB 1

Benchmark Plots

A plot of the benchmark results have been uploaded as an artifact to the workflow run for this PR.
Go to "Actions"->"Benchmark a pull request"->[the most recent run]->"Artifacts" (at the bottom).

@vchuravy vchuravy changed the title Add foreachindex Add foreach_index Sep 13, 2026
@vchuravy
vchuravy force-pushed the mg/ndrange-index-map branch from 13f4f01 to 39488ea Compare September 13, 2026 16:03
A kernel whose body is a loop over the indices of an array needs none of the
kernel language beyond the index itself, and writing it out is boilerplate that
downstream packages repeat.

Add `foreach_index(f, itr, backend = get_backend(itr); workgroupsize)`, which
launches one work item per index of `eachindex(itr)` and calls `f` with the
index a `for i in eachindex(itr)` loop would produce: a linear index for an
`IndexLinear` array, a `CartesianIndex` otherwise. The index space is carried
by the `ndrange`, so the kernel takes no argument besides the function, and an
index space that does not start at 1 needs no special handling. The function is
inlined into the kernel, as an out-of-line call to a closure can spill its
captures to local memory.

Ported from AcceleratedKernels.jl, without its CPU scheduling keywords
(`max_tasks`, `min_elems`, `prefer_threads`): those pick a host-threaded loop,
which 0.10 no longer has, and the workgroup size is left to the backend rather
than defaulting to 256. Spelled with an underscore to keep the name distinct
from the AcceleratedKernels function it does not behave identically to, so that
importing both packages does not clash.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK
@giordano

Copy link
Copy Markdown
Collaborator

I rebased this on top of #772, previous rebase looked broken. In case you wanted to go back to previous state, old commit was c033aef

Comment thread src/foreach_index.jl
Comment on lines +10 to +13
@kernel function foreach_index_linear_kernel(f)
I = @index(Global, Cartesian)
@inline f(I.I[1])
end

@vchuravy vchuravy Sep 13, 2026

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Suggested change
@kernel function foreach_index_linear_kernel(f)
I = @index(Global, Cartesian)
@inline f(I.I[1])
end
@kernel function foreach_index_linear_kernel(f)
I = @index(Global, Linear)
@inline f(I)
end

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.

2 participants