というわけでせっかく導入したマルチGPGPU環境、せっかくなのでOpenCLを入れてみようと思います。
これはpipが呼び出しているC++コンパイラが必要なヘッダファイルの場所を知らないという状況です。 これはsetup.pyと同じフォルダに置かれたsiteconf.pyを通じてコンパイラに教えることができます。
まずpyopencl.tar.gzを拾ってきて解凍、なかのconfigure.pyを実行。生成したsiteconf.pyを編集します。
CL_TRACE = False CL_ENABLE_GL = False CL_INC_DIR = ['C:\\Program Files (x86)\\AMD APP SDK\\3.0\\include'] CL_LIB_DIR = ['C:\\Program Files (x86)\\AMD APP SDK\\3.0\\lib\\x86_64'] CL_LIBNAME = ['OpenCL']
するとガンガンエラーが出る。uint32_tがどうとか、syntax errorとか。
今の僕にはNvidiaもあるんだ、ということでそちらに切り替え。
CL_INC_DIR = ['C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v7.5\\include'] CL_LIB_DIR = ['C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v7.5\\lib\\x64']
エラーの内容を見ると、まずwrap_cl_core.hで
賢明な読者諸君にはお分かりの通り、これはC++0xの仕様です。
翻ってコンパイラはVisual C++ for python、中身はVS2008で使われていたVC9です。
python 3に移行(python本体がVS2010以降でビルド)
C++0xを使っていない時代のpyOpenCLのバージョンを使う
が考えられるかな、と。ということで最後のを試してみます。
git clone https://github.com/pyopencl/pyopencl.git cd pyopencl git checkout v2015.1 vi siteconf.py pip install .
するとコンパイル成功。やったぜ。 ちなみに環境はWindowsですが、viはmsysのものです。
thread.obj : error LNK2001: unresolved external symbol "void __cdecl pyopenclboost::throw_exception(class std::exception const &)" (?throw_exception@pyopenclboost@@YAXAEBVexception@std@@@Z) wrap_mempool.obj : error LNK2001: unresolved external symbol "void __cdecl pyopenclboost::throw_exception(class std::exception const &)" (?throw_exception@pyopenclboost@@YAXAEBVexception@std@@@Z) builtin_converters.obj : error LNK2001: unresolved external symbol "void __cdecl pyopenclboost::throw_exception(class std::exception const &)" (?throw_exception@pyopenclboost@@YAXAEBVexception@std@@@Z)
エラーをよく見ると/EHscを使えってあったので、siteconf.pyに
なお、siteconf.pyのオプションを調べてたり、ソースコードを覗いていたら、Boostを使っているのかもしれません。 僕は以前PCLで遊ぶためにビルドとパス設定をしたBoost(VC120とVC140)があるので、問題はありませんでした。
とりあえず上の設定でやってみて、Boostのライブラリが足りないっぽいエラーが出たらBoostをインストールしてみたらいいと思います。
せっかくなのでベンチマーク。opyopenclの中のexampleを使います。
cd examples python download-examples-from-wwiki.py cd wiki-examples python MatrixMultiply.py # for python MatrixMultiply.py python MatrixMultiply.py
$ python MatrixMultiply.py Choose platform: [0] [1] Choice [0]:1 Set the environment variable PYOPENCL_CTX='1' to avoid being asked again. GPU push+compute+pull total [s]: 0.0306499838829 GPU push [s]: 0.00999999046326 GPU pull [s]: 0.00999999046326 GPU compute (host-timed) [s]: 0.0106500029564 GPU compute (event-timed) [s]: 0.010541984 GFlops/s: 192.300416102 GPU==CPU: True CPU time (s) 1.88499999046 GPU speedup (with transfer): 61.5008476893 GPU speedup (without transfer): 176.995255136 $ python MatrixMultiply.py Choose platform: [0] [1] Choice [0]:0 Choose device(s): [0] [1] Choice, comma-separated [0]:0 Set the environment variable PYOPENCL_CTX='0:0' to avoid being asked again. GPU push+compute+pull total [s]: 0.047450363636 GPU push [s]: 0.00400018692017 GPU pull [s]: 0.00400018692017 GPU compute (host-timed) [s]: 0.0394499897957 GPU compute (event-timed) [s]: 0.03938454 GFlops/s: 51.9138283839 GPU==CPU: True CPU time (s) 1.84999990463 GPU speedup (with transfer): 38.9881080538 GPU speedup (without transfer): 46.8948132614 $ python MatrixMultiply.py Choose platform: [0] [1] Choice [0]:0 Choose device(s): [0] [1] Choice, comma-separated [0]:1 Set the environment variable PYOPENCL_CTX='0:1' to avoid being asked again. GPU push+compute+pull total [s]: 7.53135018349 GPU push [s]: 0.00400018692017 GPU pull [s]: 0.0 GPU compute (host-timed) [s]: 7.52734999657 GPU compute (event-timed) [s]: 7.636417726 GFlops/s: 0.272074501775 GPU==CPU: True CPU time (s) 1.72899985313 GPU speedup (with transfer): 0.22957369011 GPU speedup (without transfer): 0.229695690239
device GFlops/s GTX750Ti 192.300416102 Radeon 51.9138283839 A10 0.272074501775
さすがにCPU遅すぎなので、設定がまずいのかもしれません。