Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

`findmin!` and `findmax!` do not work on GPU arrays

Abierto
#792 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
julia
Área
backend

Línea de trabajo

Start with the existing findmin(A; dims) implementation in GPUArrays and AcceleratedKernels' mapreducedim! behavior. Implement the issue's option 1 for findmin! and findmax!, then verify init=false, init=true, nonempty slices, and empty A using the Julia examples and GPU arrays such as JLArray or CUDA.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

arrays

GPUArrays implements findmin and findmax, but not their in-place forms, so findmin!(rval, rind, A) falls back to Base's findminmax! loop, which indexes scalars:

using JLArrays   # or CUDA, etc.
A = JLArray(Float32[3 1; 2 4])
rval = JLArray(zeros(Float32, 1, 2))
rind = JLArray(fill(CartesianIndex(1, 1), 1, 2))
findmin!(rval, rind, A)
# ERROR: Scalar indexing is disallowed.
# Invocation of getindex resulted in scalar indexing of a GPU array.

(GPUArrays main, and with the AcceleratedKernels-based reductions of #790; Julia 1.13.)

An implementation must reproduce Base's init keyword, whose init=false does not fold the old values in: Base resets the index destination (fill!(rind, zero(eltype(keys(A))))), and "the initial values of Rval are not used if the corresponding indices in Rind are 0", so the old rval is ignored whenever the slice is not empty:

julia> findmin!([-10], [42], [3, 2]; init=false)
([2], [2])

julia> findmin!([0.5 5.0], [CartesianIndex(9, 9) CartesianIndex(9, 9)], [3.0 1; 2 4]; init=false)
([2.0 1.0], CartesianIndex{2}[CartesianIndex(2, 1) CartesianIndex(1, 2)])

With init=true, rval starts from the first slice and rind from zero, which gives the same result; either way the result is the reduction of A alone, and an empty A leaves rval and rind unchanged (Base returns early).

Two ways to implement it:

  1. Reduce (f(x), i) pairs into a temporary array of tuples with AK.mapreducedim! in overwrite mode, as findmin(A; dims) does, then unzip it into rval and rind (rind through keys(A)). This needs no change in AcceleratedKernels, and costs one extra pass over the (small) output and a temporary of its size.
  2. Let AK.mapreducedim! write a destination that is a pair of arrays, which saves that pass but adds a new destination contract to AcceleratedKernels.

Option 1 is the natural first step; findmin!/findmax! along dims are rarely performance-critical.

Lenguaje dominante
Julia
Estrellas
456
Forks
108
Merge medio
3 d 1 h
PR fusionados (30 d)
27

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de JuliaGPU/GPUArrays.jl

Todos los issues de JuliaGPU/GPUArrays.jl

Issues similares

Más issues de Julia

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.