JLD2.jl icon indicating copy to clipboard operation
JLD2.jl copied to clipboard

Error when loading `CuArray`

Open Lightup1 opened this issue 2 years ago • 1 comments

Code and error message

using JLD2
using CUDA
test=CuArray([1,2])
jldsave("example.jld2";test)
julia> data=load("example.jld2")
Dict{String, Any} with 1 entry:Error showing value of type Dict{String, Any}:
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] current_device
    @ C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\lib\cudadrv\devices.jl:24 [inlined]
  [2] context!(ctx::CuContext)
    @ CUDA C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\lib\cudadrv\state.jl:150
  [3] #context!#63
    @ C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\lib\cudadrv\state.jl:162 [inlined]
  [4] context!
    @ C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\lib\cudadrv\state.jl:161 [inlined]
  [5] unsafe_copyto!(dest::Vector{Int64}, doffs::Int64, src::CuArray{Int64, 1, CUDA.Mem.DeviceBuffer}, soffs::Int64, n::Int64)
    @ CUDA C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\src\array.jl:406
  [6] copyto!
    @ C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\src\array.jl:360 [inlined]
  [7] copyto!
    @ C:\Users\Baiyi Yu\.julia\packages\CUDA\tTK8Y\src\array.jl:364 [inlined]
  [8] copyto_axcheck!
    @ .\abstractarray.jl:1104 [inlined]
  [9] Vector{Int64}(x::CuArray{Int64, 1, CUDA.Mem.DeviceBuffer})
    @ Base .\array.jl:563
 [10] Array
    @ .\boot.jl:481 [inlined]
 [11] convert
    @ .\array.jl:554 [inlined]
 [12] adapt_storage
    @ C:\Users\Baiyi Yu\.julia\packages\GPUArrays\gok9K\src\host\abstractarray.jl:23 [inlined]
 [13] adapt_structure
    @ C:\Users\Baiyi Yu\.julia\packages\Adapt\wASZA\src\Adapt.jl:42 [inlined]
 [14] adapt
    @ C:\Users\Baiyi Yu\.julia\packages\Adapt\wASZA\src\Adapt.jl:40 [inlined]
 [15] show_vector
    @ C:\Users\Baiyi Yu\.julia\packages\GPUArrays\gok9K\src\host\abstractarray.jl:34 [inlined]
 [16] show(io::IOContext{IOBuffer}, X::CuArray{Int64, 1, CUDA.Mem.DeviceBuffer})
    @ Base .\arrayshow.jl:481
 [17] sprint(f::Function, args::CuArray{Int64, 1, CUDA.Mem.DeviceBuffer}; context::IOContext{Base.TTY}, sizehint::Int64)
    @ Base .\strings\io.jl:112
 [18] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, t::Dict{String, Any})
    @ Base .\show.jl:112
 [19] display(d::REPL.REPLDisplay{REPL.LineEditREPL}, mime::MIME{Symbol("text/plain")}, x::Dict{String, Any})
    @ OhMyREPL C:\Users\Baiyi Yu\.julia\packages\OhMyREPL\oDZvT\src\output_prompt_overwrite.jl:8
 [20] display(d::REPL.REPLDisplay, x::Any)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:271
 [21] display(x::Any)
    @ Base.Multimedia .\multimedia.jl:328
 [22] #invokelatest#2
    @ .\essentials.jl:716 [inlined]
 [23] invokelatest
    @ .\essentials.jl:714 [inlined]
 [24] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:293
 [25] (::REPL.var"#45#46"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:277
 [26] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:510
 [27] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:275
 [28] (::REPL.var"#do_respond#66"{Bool, Bool, REPL.var"#77#87"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:846
 [29] #invokelatest#2
    @ .\essentials.jl:716 [inlined]
 [30] invokelatest
    @ .\essentials.jl:714 [inlined]
 [31] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
    @ REPL.LineEdit C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\LineEdit.jl:2493
 [32] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
    @ REPL C:\Users\Baiyi Yu\AppData\Local\Programs\Julia-1.7.3\share\julia\stdlib\v1.7\REPL\src\REPL.jl:1232
 [33] (::REPL.var"#49#54"{REPL.LineEditREPL, REPL.REPLBackendRef})()
    @ REPL .\task.jl:429

Lightup1 avatar Jul 14 '22 13:07 Lightup1

Hi @Lightup1 ,

this is tricky. I suppose, CUDA might be able to implement storing and reconstructing of CuArrays with JLD2. However, currently, you are just telling JLD2 to store a CuArray which (in CPU RAM) just contains information about the GPU and where to find data on the GPU. This is not useful for storing and loading.

The easy solution would be to just convert your data to regular arrays.

JonasIsensee avatar Jul 14 '22 13:07 JonasIsensee