diff --git a/src/lib/broadcast.jl b/src/lib/broadcast.jl index 8c0d3c54c..086fc6d13 100644 --- a/src/lib/broadcast.jl +++ b/src/lib/broadcast.jl @@ -286,3 +286,10 @@ using GPUArraysCore # replaces @require CUDA block, weird indenting to preserve pull_block_vert(sz, Δ::AbstractGPUArray, A::Number) = @allowscalar Δ[sz] + ∇getindex(x::T, inds::Tuple{AbstractArray{<:Integer}}) where {T <: AbstractGPUArray} = dy -> begin + inds1_cpu = Array(inds[1]) + dx = zeros(eltype(dy), length(x)) + dxv = view(dx, inds1_cpu) + dxv .= accum.(dxv, _droplike(Array(dy), dxv)) + return _project(x, T(dx)), nothing + end diff --git a/test/cuda.jl b/test/cuda.jl index 5cb1c8cdc..403ff553a 100644 --- a/test/cuda.jl +++ b/test/cuda.jl @@ -140,3 +140,9 @@ end @test_skip gradient((x,y) -> sum(vcat(x,y)), 1f0, r, 2f0, r)[2] isa CUDA.CuArray{Float32} end +@testset "repeated indexing" begin + f(a) = sum(view(a, [1, 1, 2])) + a = CUDA.CuArray([1.0f0, 1.0f0, 1.0f0]) + @test f(a) == 3.0f0 + @test Array(gradient(f, a)[1]) == [2.0f0, 1.0f0, 0.0f0] +end