CUDAのカーネル関数がタイムアウトしてしまう場合の対処
先日購入したGeForce GTX 480を試そうとしたところ以下のようなエラーが出てきました。
Cuda error: Kernel execution failed in file 'testbed.cu' in line 367 : the launch timed out and was terminated.
原因としてはPrimary Deviceに指定されているGPUで長時間カーネル関数を実行しすぎているため。
実際に最大実行時間がどれだけかはOSによってバラバラなようでカーネル関数の実行時間が長時間の場合は注意が必要。
対処法としはそもそも長時間実行せずに細かく何度も実行するなど考えられますが、何度も実行するとさまざまなオーバーヘッドがかかるためなるべく1度に長時間実行したい場合があります。
今回の私のケースがそれで、解決したときのメモ。
XWindowを止めてしまうというのもあるようですが今回はGPUが2つあったのでこれを利用します。
環境は以下の通り。
- OSはCentOS 5.2
- GPUはGeForce 8800 GTとGeForce GTX 480
目標はGeForce GTX 480でカーネル関数を長時間実行してもタイムアウトしないようにすること。
まず、Xorg.0.logでPrimary DeviceがどのGPUになっているかを確認します。
Primary Device is: PCI 00:02:0
上のようになっていればPCIが00:02:0のGPUがPrimary Deviceに指定されています。
あとはPCIが00:02:0がどのGPUかをXorg.0.logで確認します。
今回調べてみるとPrimary DeviceがGeForce GTX 480になっていたのでPrimary DeviceをGeForce 8800 GTにするためにGPUのPCI Expressの場所を入れ替えればOK。
これでPrimary DeviceがGeForce 8800 GTになっているはず・・・
実際にカーネル関数をGeForce GTX 480で実行してもタイムアウトはしませんでした。
ただ、いちいちケースを開けるのも面倒だしもっといい方法があったら教えてください。