cuda(nvcc)でpythonのモジュールを作ってみた
ここのところcudaが楽しくてしょうがないのですが、でもC言語で高いレイヤーの処理はやりたくないですよね。画像をCで触るとか、考えたくもない。 そんなわけでふつう使うのはpycudaあたりだと思うのですが、あえてPython/C APIでモジュールを作ってみることにしました。
とりあえずソースを書きます。
#include <python3.4/Python.h> // 環境によってはバージョンが違ったり、<python.h>だけで良かったりするかも。 static PyObject* tea_device_count(PyObject *self){ int n; cudaGetDeviceCount(&n); return PyLong_FromLong(n); } static PyMethodDef TeaMethods[] = { {"device_count", (PyCFunction)tea_device_count, METH_NOARGS, "get device count."}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef teamodule = { PyModuleDef_HEAD_INIT, "tea", "this is tea\n", -1, TeaMethods }; PyMODINIT_FUNC PyInit_tea(){ return PyModule_Create(&teamodule); }
こんな感じ。tea
ってモジュールに、device_count
ってGPUの数を数える関数が一つあるだけです。
コンパイルするときはこんな。
$ nvcc -shared -Xcompiler -fPIC tea.cu -o tea.so
-fPIC
ってやつが-Xcompiler
の前に来るとエラーになるので要注意です。あとは普通に?
使い方は完全に普通のpythonモジュールと同じで、以下のような感じになります。
>>> import tea >>> tea.device_count() 1
お使いのGPUの数が表示されると思います。2とか3とか出たらリッチな感じですね。
計算などはまだ試していませんが、まあここまで出来て出来ないことはないかと。 素直にpycudaを使えって感じもしますが、これはこれで悪くない気がします。
参考: