【问题标题】:Ignoring `CUDA_VISIBLE_DEVICES` environment variable忽略`CUDA_VISIBLE_DEVICES`环境变量
【发布时间】:2012-09-05 01:44:01
【问题描述】:

从 CUDA 3.1 开始,可以通过设置 CUDA_VISIBLE_DEVICES 环境变量来限制对应用程序可见的 GPU 列表。

这会影响 Runtime API 和 Driver 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)

我很好奇如何做到这一点。

【问题讨论】:

    标签: cuda environment-variables


    【解决方案1】:

    Rubber duck debugging 确实有效。

    原来在调用cuInitcudaSetDevice之前使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2017-12-14
      • 2012-12-03
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多