Julia(v. 1.4.0)についてもCUDA(CUDA Toolkit:v.10.2.89; cuDNN:v.7.6; CuArrays:v.2.1.0)についても、手探りで勉強中です。
ネットで英語サイトも含め検索してみましたがこれといった情報を見つけることが出来なかったため、表題の件につきましてご教示いただけますと幸いです。
以下のコードのように、どうしてもある要素だけを変更したいと考えています。
なお、エラーが出る最小限のコード+変数・引数も適当であるため、この処理自体には何の意味もありません。
Julia
1using Flux, CuArrays 2 3a = rand(3,3) |> gpu 4CuArrays.allowscalar(false) 5a[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)
と出ます。ちなみに外した場合は、後述するa .+= b
版より2倍くらい早いという結果になりました。
また、念のため要素にアクセスする部分の前後でallowscalarをオンオフさせてみましたが、当然ながら(?)一桁違うレベルで遅くなりました。
次に、以下のように一度cpu上で別の行列を作成し、それをgpu上で行列の足し算をしてみました。
b = zeros(Float32, 3, 3) b[1, 1] = 1.0f0 b = b |> gpu a .+= b
しかし、GPU上だけで処理が出来たと仮定した
a .*= 1.0f0 # GPU上で何か処理をしたつもりのダミー計算 a .+= a # GPU上で何か処理をしたつもりのダミー計算
版の方が上記のa .+= b
版より4倍ぐらい早いという結果になりました。
前述した通り、a .+= b
版よりもallowscalarをtrueにした方が(2倍)早いですし、
allowscalarをfalseにしてGPUだけで処理が出来ればもっと早いと考えています。
特に実際の処理はもう少しあるため、その差がより大きくなると予想されます。
改めまして、CuArrayにおいて要素にアクセスし、値を変更するにはどうしたらよいでしょうか?
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。