Как заставить Julia CuArrays использовать загруженную CUDA 10.2 вместо загрузки новой копии? - PullRequest
3 голосов
/ 21 апреля 2020

У меня машина с медленным и прерывистым подключением inte rnet, поэтому загрузка CUDA 2,4 Гб почти буквально занимает вечность. Я хочу использовать программирование на GPU, скажем, со следующим кодом:

N = 2^2
using CuArrays
x_d = CuArrays.fill(1.0f0, N)  # a vector stored on the GPU filled with 1.0 (Float32)
y_d = CuArrays.fill(2.0f0, N)  # a vector stored on the GPU filled with 2.0
y_d .+= x_d

Проблема в том, что всякий раз, когда я запускаю последнюю строку кода, он загружает новую копию CUDA:

julia> y_d .+= x_d
Downloading artifact: CUDA10.2

Я установил последнюю CUDA. Фактически, прерывание загрузки Джулии и повторный запуск кода работает просто отлично:

julia> y_d .+= x_d
ERROR: InterruptException:
Stacktrace:
 [1] compile(::Symbol, ::CUDAnative.CompilerJob; libraries::Bool, dynamic_parallelism::Bool, optimize::Bool, strip::Bool, strict::Bool) at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\compiler\driver.jl:45
 [2] #compile#171 at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\compiler\driver.jl:33 [inlined]
 [3] cufunction_slow(::Function, ::Type{T} where T, ::Int64; name::String, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:326
 [4] #219 at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:393 [inlined]
 [5] get!(::CUDAnative.var"#219#220"{String,Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},GPUArrays.var"#26#27",DataType,Int64}, ::Dict{UInt64,CUDAnative.HostKernel}, ::UInt64) at .\dict.jl:452
 [6] macro expansion at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:392 [inlined]
 [7] macro expansion at .\lock.jl:183 [inlined]
 [8] cufunction_fast(::Function, ::Type{T} where T, ::Int64; name::String, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:391
 [9] getproperty at .\Base.jl:33 [inlined]
 [10] merge at .\namedtuple.jl:235 [inlined]
 [11] cufunction(::GPUArrays.var"#26#27", ::Type{Tuple{CuArrays.CuKernelContext,CUDAnative.CuDeviceArray{Float32,1,CUDAnative.AS.Global},Base.Broadcast.Broadcasted{Nothing,Tuple{Base.OneTo{Int64}},typeof(+),Tuple{Base.Broadcast.Extruded{CUDAnative.CuDeviceArray{Float32,1,CUDAnative.AS.Global},Tuple{Bool},Tuple{Int64}},Base.Broadcast.Extruded{CUDAnative.CuDeviceArray{Float32,1,CUDAnative.AS.Global},Tuple{Bool},Tuple{Int64}}}}}}; kwargs::Base.Iterators.Pairs{Symbol,String,Tuple{Symbol},NamedTuple{(:name,),Tuple{String}}}) at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:0
 [12] macro expansion at C:\Users\User\.julia\packages\CUDAnative\ierw8\src\execution.jl:157 [inlined]
 [13] gpu_call(::CuArrays.CuArrayBackend, ::Function, ::Tuple{CuArray{Float32,1,Nothing},Base.Broadcast.Broadcasted{Nothing,Tuple{Base.OneTo{Int64}},typeof(+),Tuple{Base.Broadcast.Extruded{CuArray{Float32,1,Nothing},Tuple{Bool},Tuple{Int64}},Base.Broadcast.Extruded{CuArray{Float32,1,Nothing},Tuple{Bool},Tuple{Int64}}}}}, ::Int64; name::String) at C:\Users\User\.julia\packages\CuArrays\e8PLr\src\gpuarrays.jl:32
 [14] #gpu_call#1 at C:\Users\User\.julia\packages\GPUArrays\QDGmr\src\device\execution.jl:60 [inlined]
 [15] copyto! at C:\Users\User\.julia\packages\GPUArrays\QDGmr\src\host\broadcast.jl:63 [inlined]
 [16] copyto! at .\broadcast.jl:864 [inlined]
 [17] materialize!(::CuArray{Float32,1,Nothing}, ::Base.Broadcast.Broadcasted{CuArrays.CuArrayStyle{1},Nothing,typeof(+),Tuple{CuArray{Float32,1,Nothing},CuArray{Float32,1,Nothing}}}) at .\broadcast.jl:823
 [18] top-level scope at REPL[5]:1

julia> y_d .+= x_d
4-element CuArray{Float32,1,Nothing}:
 3.0
 3.0
 3.0
 3.0

Однако Джулия пытается загружать снова, каждый раз, когда я запускаю коды, связанные с CUDA. У меня есть исполняемый файл, недавно загруженный с веб-сайта NVIDIA ("cuda_10.2.89_441.22_win10.exe"). Есть ли способ заставить Джулию использовать эту копию или не делать ее вообще?

1 Ответ

0 голосов
/ 21 апреля 2020

Не уверен на 100% (и, конечно, это временное решение), но одним из решений может быть проверка правильности загрузки Джулией динамических ссылок c. Чтобы проверить это:

using Libdl
DL_LOAD_PATH #(same as Libdl.DL_LOAD_PATH)

После этого вы сможете увидеть список путей библиотек CUDA. Если нет, то вы должны добавить их.

Для этого просто введите:

push!(DL_LOAD_PATH, "/path/to/cuda/")

Затем попробуйте импортировать пакет CuArrays.

Кстати, CuArrays зависит от CUDAnative, а также от CUDAdrv. Таким образом, другое решение может быть установить все 3 пакета отдельно.

...