CUDA_VISIBLE_DEVICES
CUDA 3.1以降、環境変数を設定することで、アプリケーションに表示されるGPUのリストを制限することができます。
これは、ランタイムAPIとドライバーAPIの両方に影響します(自分でチェックしたことを確認してください)。デバイスフィルタリングはドライバーレベルで強制されているようで、それを無視する方法はありません。
ただし、空の文字列に設定した場合でも、この変数を無視し、常にデバイス0を使用しているように見えるクローズドソースアプリケーションに遭遇しました。これは、アプリケーションがCUDA_VISIBLE_DEVICES
CUDA対応デバイスを認識しないことを意味します。
問題のアプリケーションは、使用可能なデバイスをカウントするためのダミーアプリケーションと同じCUDAライブラリを使用します。
$ ldd a.out # dummy
linux-vdso.so.1 => (0x00007fff7ec60000)
libcuda.so.1 => /usr/lib64/libcuda.so.1 (0x00007f606783a000)
libcudart.so.4 => /usr/local/cuda41/cuda/lib64/libcudart.so.4 (0x00007f60675e3000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f60672dd000)
libm.so.6 => /lib64/libm.so.6 (0x00007f606704e000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6066e37000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6066aa7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f606688b000)
libz.so.1 => /lib64/libz.so.1 (0x00007f6066674000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6066470000)
librt.so.1 => /lib64/librt.so.1 (0x00007f6066268000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6068232000)
$ ldd ../../bin/one.closed.source.application # application in question
linux-vdso.so.1 => (0x00007fffcf99c000)
libcufft.so.4 => /usr/local/cuda41/cuda/lib64/libcufft.so.4 (0x00007f06ce53a000)
libcuda.so.1 => /usr/lib64/libcuda.so.1 (0x00007f06cdb44000)
libcudart.so.4 => /usr/local/cuda41/cuda/lib64/libcudart.so.4 (0x00007f06cd8ed000)
libz.so.1 => /lib64/libz.so.1 (0x00007f06cd6cb000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f06cd4c7000)
librt.so.1 => /lib64/librt.so.1 (0x00007f06cd2bf000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f06ccfb8000)
libm.so.6 => /lib64/libm.so.6 (0x00007f06ccd34000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f06ccb1e000)
libc.so.6 => /lib64/libc.so.6 (0x00007f06cc78d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f06cc571000)
/lib64/ld-linux-x86-64.so.2 (0x00007f06d0110000)
このトリックをどのように行うことができるのか興味があります。