# Issue with using IterativeSolvers, LinearMaps and CuArrays

**URL:** <https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232>\
**Category:** General Usage\
**Created:** [July 7, 2018, 6:04am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232 "2018-07-07T06:04:47Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [July 7, 2018, 6:04am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/1 "2018-07-07T06:04:47Z")

</div>

Dear all,

I am trying to solve big linear systems with iterative methods on the GPU using IterativeSolvers.jl and CuArrays.jl. But I can’t get it to work. My problem is very related to this [one](https://github.com/JuliaGPU/CUDAdrv.jl/issues/76) and I put my error on this [link](https://github.com/JuliaGPU/CUDAdrv.jl/pull/77). My code is a bit involved, so I tried to find a simpler example of bug. This one already produces a bug although it is not completely related to [link](https://github.com/JuliaGPU/CUDAdrv.jl/pull/77).

```julia
using CuArrays,IterativeSolvers, LinearMaps
A = LinearMap{Float32}(cumsum, 100; ismutating=false)
b = rand(100) |> cu
tol = 1e-5
x = gmres(A, b; tol=tol, maxiter=2000)

```

returns

```julia
ERROR: conversion to pointer not defined for CuArray{Float32,1}
Stacktrace:
 [1] copy!(::SubArray{Float32,1,Array{Float32,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true}, ::CuArray{Float32,1}) at /user/rveltz/home/.julia/v0.6/GPUArrays/src/abstractarray.jl:120
 [2] #init!#55(::Bool, ::Function, ::IterativeSolvers.ArnoldiDecomp{Float32,LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}}, ::Array{Float32,1}, ::CuArray{Float32,1}, ::IterativeSolvers.Identity, ::Array{Float32,1}) at /user/rveltz/home/.julia/v0.6/IterativeSolvers/src/gmres.jl:219
 [3] (::IterativeSolvers.#kw##init!)(::Array{Any,1}, ::IterativeSolvers.#init!, ::IterativeSolvers.ArnoldiDecomp{Float32,LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}}, ::Array{Float32,1}, ::CuArray{Float32,1}, ::IterativeSolvers.Identity, ::Array{Float32,1}) at ./<missing>:0
 [4] #gmres_iterable!#52(::IterativeSolvers.Identity, ::IterativeSolvers.Identity, ::Float64, ::Int64, ::Int64, ::Bool, ::Function, ::Array{Float32,1}, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at /user/rveltz/home/.julia/v0.6/IterativeSolvers/src/gmres.jl:118
 [5] (::IterativeSolvers.#kw##gmres_iterable!)(::Array{Any,1}, ::IterativeSolvers.#gmres_iterable!, ::Array{Float32,1}, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at ./<missing>:0
 [6] #gmres!#54(::IterativeSolvers.Identity, ::IterativeSolvers.Identity, ::Float64, ::Int64, ::Int64, ::Bool, ::Bool, ::Bool, ::IterativeSolvers.#gmres!, ::Array{Float32,1}, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at /user/rveltz/home/.julia/v0.6/IterativeSolvers/src/gmres.jl:185
 [7] (::IterativeSolvers.#kw##gmres!)(::Array{Any,1}, ::IterativeSolvers.#gmres!, ::Array{Float32,1}, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at ./<missing>:0
 [8] #gmres#53(::Array{Any,1}, ::Function, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at /user/rveltz/home/.julia/v0.6/IterativeSolvers/src/gmres.jl:134
 [9] (::IterativeSolvers.#kw##gmres)(::Array{Any,1}, ::IterativeSolvers.#gmres, ::LinearMaps.FunctionMap{Float32,Base.#cumsum,Void}, ::CuArray{Float32,1}) at ./<missing>:100:

```

I hope that this is the reason of the [bug](https://github.com/JuliaGPU/CUDAdrv.jl/pull/77).

Thank you for your help

---

<div class="post-metadata">

**Author:** ![mohamed82008](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mohamed82008/32/18171_2.png) [@mohamed82008](https://discourse.julialang.org/u/mohamed82008)\
**Post date:** [July 7, 2018, 6:36am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/2 "2018-07-07T06:36:46Z")

</div>

IterativeSolvers.jl doesn’t support arbitrary array types (yet) AFAIK.

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [July 7, 2018, 6:52am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/3 "2018-07-07T06:52:14Z")

</div>

but [link](https://github.com/JuliaGPU/CUDAdrv.jl/pull/77) seems to imply that it used to work. @samuelpowell confirmed this to me.

---

<div class="post-metadata">

**Author:** ![mohamed82008](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mohamed82008/32/18171_2.png) [@mohamed82008](https://discourse.julialang.org/u/mohamed82008)\
**Post date:** [July 7, 2018, 7:05am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/4 "2018-07-07T07:05:06Z")

</div>

I saw [IterativeSolvers.jl/gmres.jl at 30062518106d28f7a52e35637e68f273e41fcee5 · JuliaLinearAlgebra/IterativeSolvers.jl · GitHub](https://github.com/JuliaMath/IterativeSolvers.jl/blob/30062518106d28f7a52e35637e68f273e41fcee5/src/gmres.jl#L7) and assumed it doesn’t. Use of `Matrix` and `zeros(n)` is also common all over IterativeSolvers.jl. I would be happy to see it working but it may need a bit of work. @stabbles may have a comment on this.

---

<div class="post-metadata">

**Author:** ![samuelpowell](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/samuelpowell/32/248_2.png) [@samuelpowell](https://discourse.julialang.org/u/samuelpowell)\
**Post date:** [July 8, 2018, 5:42pm UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/5 "2018-07-08T17:42:08Z")

</div>

The PR to which you have linked is for the `CUDAdrv.jl` implementation of `CuArray` which I believe to be different to that provided by `CuArrays.jl` - see comments by @maleadt in said PR.

Further, I can only confirm that this worked for my particular use case. As I recall this involved a linear operator exposed through the `AbstractArray` interface which undertook its own memory transfers and launched kernels on the GPU. The only missing piece for me was the `copy!` function for the views provided by the solver.

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [July 8, 2018, 9:52pm UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/6 "2018-07-08T21:52:28Z")

</div>

Oh that’s my mistake, I did not pay attention to the fact that it used the `CUDAdrv.jl` implementation of `CuArray`.

Then I am stuck…

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [July 9, 2018, 8:29am UTC](https://discourse.julialang.org/t/issue-with-using-iterativesolvers-linearmaps-and-cuarrays/12232/7 "2018-07-09T08:29:38Z")

</div>

It seems unfortunate that `IterativeSolvers.jl` does not support GPU computations. I have no idea how much work it is to allow it. What is the list of priorities for `IterativeSolvers.jl`?

Does anyone know of an alternative?
