相川と申します.
件名にもありますように,GPU と CPU を跨ぐようなデータの取り扱いについてお聞きしたいことがあります.
お手数お掛けしますが,ご回答頂けますと幸いです.
(1)
ある Variable object の data を cupy.ndarray 型として入力に与え,何らかの関数を計算した結果として帰ってくる Variable object の data は常に cupy.ndarray 型のものとなっているという理解でよろしいのでしょうか?
mnist のサンプルを確認したところ,計算結果として帰ってくる loss.data を足し合わせたものを,to_cpu() メソッド等を用いず直接 CPU 側の変数である loss_sum に和算することが出来ているようでした.
上記のような規則性を持っているものと仮定すると,GPU 上に配置されている loss.data が,CPU 上に配置されている sum_loss に足されているように見えます.
かなり前の経験なため記憶があいまいなのですが,ネイティブの CUDA で書く場合,そのようなケースでは一度 GPU 上に配置されたデータを CPU 側に転送してから足し合わせる必要があったような気がするので,Chainer では GPU 上と CPU 上のデータをどのように扱っているのかが気になりました.
どのような理屈で上記のような計算手続きが実現されているのでしょうか.
また GPU と CPU を跨ぐデータの取り扱いに関して,何か一貫した規則のようなものがありましたら,お教え頂けませんでしょうか.
(2)
(1)と似たような質問です.
Chainer で GPU を使用してモデルを学習する場合,model (Link object) を to_gpu() メソッド等を用いて,GPU 側に配置しなければならないものと理解しています.
この to_gpu() メソッドは,対応する オブジェクトを全て GPU 側のメモリに移行し,CPU 側のメモリは一度全て解放している認識でよろしいのでしょうか?
仮に GPU 側にオブジェクトを全て転送していた場合,CPU 側のメモリにはデータが残っていないはずだと思うのですが,mnist のサンプルを見ると to_cpu() を使うことなく,save_npz() を使用することが出来ているようなので気になりました.
私自身,プログラムはあまり得意なほうではないので,見当違いなことを言っていたら申し訳ありません.
質問をまとめさせて頂くと,Chainer における GPU 上と CPU 上を跨ぐようなデータの取り扱いについてより詳しく知りたいということです.
ご回答やアドバイスを頂けますと非常に助かります,よろしくお願いいたします.