JuliaGPU / GPUArrays.jl

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

Broadcasting on nested ReshapedArrays and Adjoints falls back to DefaultArrayStyle #244

Closed tanhevg closed 4 years ago

tanhevg commented 4 years ago

MWE:

using CuArrays

x = cu(rand(5))
xx = reshape(x', 5)
typeof(xx) # ok: Base.ReshapedArray{Float32,1,LinearAlgebra.Adjoint{Float32,CuArray{Float32,1,Nothing}},Tuple{}}
typeof(-xx) # WTF: Array{Float32,1}

This is because the code that defines broadcast styles in GPUArrays.broadcast.jl only defines them for adapted types for the nested level of 1.

I guess one possible workaround would be

broadcastable(x::Base.ReshapedArray) = broadcastable(x.parent)
# etc etc for LinearAlgebra.Adjoint and others

I am not sure, however, if this would break other things, and whether it should sit within JuliaGPU or in Base

maleadt commented 4 years ago

We don't support nested wrappers, https://github.com/JuliaGPU/Adapt.jl/issues/21, doing so would require an ever increasing number of method definitions while we really need something structural (e.g., https://github.com/JuliaLang/julia/pull/31563).