JuliaIO / JLD2.jl

HDF5-compatible file format in pure Julia
Other
549 stars 85 forks source link

Error when loading `CuArray` #405

Closed Lightup1 closed 8 months ago

Lightup1 commented 2 years ago

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
JonasIsensee commented 2 years ago

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.