Как мне получить доступ к элементу в CuArray of Julia и изменить его значение? - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу изменить только один элемент, как показано в приведенном ниже коде.

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 ]

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

Спасибо за ваш ответ. Однако у меня есть вопрос. Мистер Малеадт сказал: «Переключение 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)

Почему это происходит?

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

Я включил и выключил «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
...