PythonでCUDA (…ならず)

CUDAをローレベルで書くとか言っても、ゴリゴリとコード書くほどではないので、なんだかな〜…と思っていたのだけどcupyとかpycudaとか見つけてしまった。

で、とりあえずcupyを入れるも、なにやらアーキテクチャが合わないみたいなエラーで止まってしまい動作確認できず。
pycudaはCUDA2.0〜対応しているというので、インストールしてみたのだが、これまた動かず。

どうやら、どちらもビデオカードに積んでいるCUDAのバージョンが古いので動かない…という結果に。

いやいや、待ってよ…
「pycudaはCUDA2.0〜対応」じゃないんかよ!って思ったんだけど、そもそもCUDAの動作環境としてインストールしている「CUDA toolkit」なる動作環境が間に噛んでおり、toolkitにもまた対応するCUDAのバージョンが…。

toolkit9.1の場合、それが3.0以降なので対応できぬ、という話だった。

現状linux機に積んでいるGPUはFermi世代(CUDA2.1, 具体的にはquadro600)なので、Kepler以降のもの(例えばquadroK600など)に変えないと駄目そう。
敢えてtoolkit9.0にダウングレードするという選択肢もあるみたいだけど、ソースからインストールするのではゴリゴリコード書く人と変わんなくないですか…ってことで、そのうちGPUを変えたら再度検証したい。
(Windows機に乗ってるGTX950でもKeplerの次のMaxwell世代なのでそっちなら動かせるんだけど、個人的にlinux活用週間なのでこっちで遊びたい…)

…考えてみるとpycudaではコードゴリゴリ書くのとあまり変わんないような気もするし、その際はnumpy準拠(?)のcupyで行きたい。

そもそもCUDAのローレベルのコードというのは

 どんなものか? という話もあるのか…

 CUDAの基本的な動作パターンは、大雑把には以下の通り。

 ・予めCPU側で計算する値の配列情報を用意
 ・用意した配列をGPU側に転送(メモリ確保&コピー)
 ・GPU側で実行する計算処理を指定してGPU側の計算を実行
 ・GPU側の計算が終わったら、GPU側からCPU側に結果を転送(メモリ確保&コピー)
 ・GPU側のメモリを開放

 pycudaの場合は、これを概ねそのままPythonで記述する感じ。
 cupyの方は、基本numpyと同じような記述で済む。

 どっちだって同じじゃね?と思うかもしれないが、例えば「GPU側で実行する計算処理」はPythonではなくて nvcc でコンパイルするものをそのまま書く感じなので、ここはC言語に準拠した記述になる。これをpycudaでは文字列で扱うし、他の要素に関してもあまりPythonぽい手続きには感じない。
 numpyはそもそもPython記述で処理を書き連ねる感じになっているので、Pythonコードを書くというその部分でストレスを感じずに済む。それだけで、numpy準拠であるcupyは意味がある。