Как мне получить доступ к элементу в CuArray объекта Julia и изменить его значение?
Я хочу изменить только один элемент, как показано в приведенном ниже коде.
using Flux, CuArrays
a = rand(3,3) |> gpu
CuArrays.allowscalar(false)
a[1, 1] = 1.0f0
Поскольку для параметра allowscalar установлено значение false, естественно, что он будет выглядеть, как показано ниже.
ERROR: scalar setindex! is disallowed
Но если удалить allowscalar, он будет выглядеть, как показано ниже.
Performing scalar operations on GPU arrays: This is very slow, consider disallowing these operations with allowscalar(false)
Я включил и выключил "allowscalar" до и после части, которая обращается к элементу. Тогда это было примерно в 20 раз медленнее, чем когда для allowscalar было установлено значение true.
Затем я попытался один раз создать еще одну матрицу на CPU, а затем сложить матрицы на GPU, как показано ниже.
b = zeros(Float32, 3, 3)
b[1, 1] = 1.0f0
b = b |> gpu
a .+= b
Однако это примерно в 4 раза быстрее, если предположить, что я могу сделать это только на графическом процессоре, как показано ниже.
a .*= 1.0f0 # Dummy calculations that do some processing on the GPU
a .+= a # Dummy calculations that do some processing on the GPU
Как мне получить доступ к элементу в CuArray и изменить его значение? Я с нетерпением жду вашего ответа.
2 ответа
Я включил и выключил "allowscalar" до и после части, которая обращается к элементу. Тогда это было примерно в 20 раз медленнее, чем когда для allowscalar было установлено значение true.
Переключение allowscalar
не должно влиять на производительность. Фактически, CuArrays сам делает это, когда ему нужно проверить отдельные элементы с помощью определенных API. Макро-версия функции упрощает это:
julia> a = CuArrays.rand(3,3);
julia> CuArrays.allowscalar(false)
julia> a[1, 1] = 1.0f0
ERROR: scalar setindex! is disallowed
julia> CuArrays.@allowscalar a[1, 1] = 1.0f0
1.0f0
julia> a
3×3 CuArray{Float32,2,Nothing}:
1.0 0.277899 0.333898
0.126213 0.0881365 0.794662
0.94518 0.586488 0.656359
julia> a[1, 1] = 1.0f0
Спасибо за ваш ответ. Однако у меня есть вопрос. Г-н Малеадт сказал: "Переключение allowscalar не должно влиять на производительность". Но в моей программе все немного по-другому.
using Flux, CuArrays, CUDAnative
a = CuArrays.rand(50, 50);
@time for i in 1:10000
b = sum(CUDAnative.log.(a))
end
12.222549 seconds (4.25 M allocations: 151.379 MiB, 1.05% gc time)
С другой стороны,
using Flux, CuArrays, CUDAnative
a = CuArrays.rand(50, 50);
CuArrays.allowscalar(false)
@time for i in 1:10000
CuArrays.@allowscalar b = sum(CUDAnative.log.(a))
end
16.512146 seconds (4.21 M allocations: 151.733 MiB, 0.57% gc time)
Почему так происходит?