質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

Q&A

解決済

1回答

393閲覧

JuliaのCuArraysにおいて、要素にアクセスしたい

NULNUL

総合スコア2

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

0グッド

0クリップ

投稿2020/04/26 22:14

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において要素にアクセスし、値を変更するにはどうしたらよいでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一応,今はCuArrayは非推奨だったと思うので,CUDAモジュールと仮定して話をします。

allowscalarをfalseにしてGPUだけで処理が出きれば…

まぁ,できなくはないという感じですが,やはりCPUからのロードに時間がかかるので
速くはないと思います。
下はa[1,1]に-1を代入するコード例です。

julia

1 2using CUDA 3 4a = CuArray(rand(Float32, 3, 3)); 5 6a .*= CuArray([0f0 1f0 1f0; 7 1f0 1f0 1f0; 8 1f0 1f0 1f0]); 9 10a += CuArray([-1f0 0f0 0f0; 11 0f0 0f0 0f0; 12 0f0 0f0 0f0]);

9倍のデータをCPUとやり取りしているので,やはりオーバーヘッドが気になるところです。
一度に半分ぐらいの要素を代入するなら考える価値はあるでしょう。

投稿2022/09/16 14:25

ujimushi_sradjp

総合スコア2091

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問