JuliaGPU / GPUArrays.jl

Reusable array functionality for Julia's various GPU backends.
MIT License
313 stars 74 forks source link

Problem with `Base.mapreducedim!` #521

Open vpuri3 opened 4 months ago

vpuri3 commented 4 months ago

Problem 1

method ambiguity for Adjoint

julia> Base.mapreducedim!(identity, +, CUDA.zeros(4), CUDA.ones(4,4)')
ERROR: MethodError: mapreducedim!(::typeof(identity), ::typeof(+), ::CuArray{Float32, 1, CUDA.Mem.DeviceBuffer}, ::Adjoint{Float32, CuArray{Float32, 2, CUDA.Mem.DeviceBuffer}}) is ambiguous.

Candidates:
  mapreducedim!(f, op, R::AnyGPUArray, A::AbstractArray)
    @ GPUArrays ~/.julia/packages/GPUArrays/Hd5Sk/src/host/mapreduce.jl:10
  mapreducedim!(f, op::Union{typeof(&), typeof(+), typeof(Base._extrema_rf), typeof(Base.add_sum), typeof(max), typeof(min), typeof(|)}, B::AbstractArray, A::Adjoint{T, <:AbstractMatrix} where T)
    @ LinearAlgebra ~/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/share/julia/stdlib/v1.10/LinearAlgebra/src/adjtrans.jl:427

Possible fix, define
  mapreducedim!(::Any, ::Union{typeof(&), typeof(+), typeof(Base._extrema_rf), typeof(Base.add_sum), typeof(max), typeof(min), typeof(|)}, ::AnyGPUArray, ::Adjoint{T, <:AbstractMatrix} where T)

Stacktrace:
 [1] top-level scope
   @ REPL[39]:1
 [2] top-level scope
   @ ~/.julia/packages/CUDA/htRwP/src/initialization.jl:206

Problem 2

not dropping singleton dims

julia> Base.mapreducedim!(identity, +, CUDA.zeros(4), CUDA.ones(4,4,4))
4×1×1 CuArray{Float32, 3, CUDA.Mem.DeviceBuffer}:
[:, :, 1] =
 16.0
 16.0
 16.0
 16.0

julia> Base.mapreducedim!(identity, +, zeros(4), ones(4,4,4))
4-element Vector{Float64}:
 16.0
 16.0
 16.0
 16.0
vpuri3 commented 4 months ago

@maleadt can you recommend a fix for these problems?

For the first problem, my first thought was to implement https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/adjtrans.jl#L440-L448 for AnyGPUArray but that would be hard to maintain.

vpuri3 commented 4 months ago

Nevertheless that seems to be the only feasible solution