
処理性能を上げるためマルチGPU化したい場合、次の方法で使用するGPUを指定することができます。
コード
コードは以下の通り。
引数のデバイスのIDは「0~GPU接続数-1」の範囲です。
1 |
cudaSetDevice(0); //引数はIDをセット |
GPUの接続数は以下のように取得。
1 2 |
int count; cudaError_t err = cudaGetDeviceCount(&count); |
注意点
スレッドを分ける
cudaSetDeviceで別々のデバイスを指定するとき、別々のスレッドで呼ぶ必要があります。
つまり、次のように同じスレッド内で順にデバイスを指定してもうまくいきません。
1 2 3 4 5 6 7 8 |
cudaSetDevice(0); ・・・・データ転送・カーネル呼び出し cudaSetDevice(1); ・・・・データ転送・カーネル呼び出し |
PCI-expressの速度
マザーボードにもよりますが、GPUを二枚指すと、それぞれx16とx8で動作したり、一方の転送速度は落ちることがあります。
大体、次の様になるはずです。
PCI-express x16 転送速度: 理論値 16GB/sec 実際 11GB/secぐらい
PCI-express x8 転送速度: 理論値 8GB/sec 実際 5GB/secぐらい
思ったよりも遅いと思ったらNsightのタイムラインで調べてみましょう。

