忽略'CUDA\u VISIBLE\u DEVICES'环境变量
由于CUDA 3.1,可以通过设置忽略'CUDA\u VISIBLE\u DEVICES'环境变量,cuda,environment-variables,Cuda,Environment Variables,由于CUDA 3.1,可以通过设置CUDA\u visible\u设备环境变量来限制应用程序可见的GPU列表 这会影响运行时API和驱动程序API(确保我自己已经检查过)。设备过滤似乎是在驱动程序级别强制执行的,并且没有办法忽略它 然而,我遇到了一个封闭源代码的应用程序,它似乎忽略了这个变量,总是使用设备0,即使我们将CUDA\u VISIBLE\u DEVICES设置为空字符串,这意味着appliction不应该看到任何支持CUDA的设备 该应用程序使用与虚拟应用程序相同的CUDA库来计算可用
CUDA\u visible\u设备
环境变量来限制应用程序可见的GPU列表
这会影响运行时API和驱动程序API(确保我自己已经检查过)。设备过滤似乎是在驱动程序级别强制执行的,并且没有办法忽略它
然而,我遇到了一个封闭源代码的应用程序,它似乎忽略了这个变量,总是使用设备0,即使我们将CUDA\u VISIBLE\u DEVICES
设置为空字符串,这意味着appliction不应该看到任何支持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)
我很好奇怎么可能做到这一点 真的有效
结果表明,在调用cuInit
或cudaSetDevice
之前使用unsetenv
就足够了,环境变量的初始值将被忽略
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
int main(int argc, char **argv, char **env) {
int x;
unsetenv("CUDA_VISIBLE_DEVICES");
cuInit(0);
// Now we see all the devices on machine
cuDeviceGetCount(&x);
printf("%d\n",x);
return 0;
}
#包括
#包括
#包括
内部主(内部argc、字符**argv、字符**env){
int x;
unsetenv(“CUDA_可见设备”);
cuInit(0);
//现在我们看到机器上的所有设备
cuDeviceGetCount(&x);
printf(“%d\n”,x);
返回0;
}