当计算机具有多个支持CUDA的GPU时,每个GPU都会分配一个device ID
.默认情况下,CUDA内核会执行device ID 0
.您可以使用cudaSetDevice(int device)
选择其他设备.
假设我的机器中有两个GPU:GTX 480和GTX 670.CUDA 如何确定哪个GPU device ID 0
和哪个GPU device ID 1
?
关于CUDA如何分配设备ID的想法(只是头脑风暴):
动机:我正在研究一些HPC算法,我正在为几个GPU进行基准测试和自动调整.我的处理器有足够的PCIe通道,可以在全带宽下将cudaMemcpys驱动到3个GPU.因此,我不打算不断地将GPU交换进机器,而是计划在计算机中保留3个GPU.我希望能够预测当我在计算机中添加或更换某些GPU时会发生什么.
我有四块NVIDIA GTX 1080图形卡,当我初始化一个会话时,我看到以下控制台输出:
Adding visible gpu devices: 0, 1, 2, 3
Device interconnect StreamExecutor with strength 1 edge matrix:
0 1 2 3
0: N Y N N
1: Y N N N
2: N N N Y
3: N N Y N
Run Code Online (Sandbox Code Playgroud)
我还有2块NVIDIA M60 Tesla图形卡,初始化如下:
Adding visible gpu devices: 0, 1, 2, 3
Device interconnect StreamExecutor with strength 1 edge matrix:
0 1 2 3
0: N N N N
1: N N N N
2: N N N …
Run Code Online (Sandbox Code Playgroud) 我看到了这个解决方案,但是并不能完全回答我的问题。它也很老,所以我不确定它的相关性。
我不断收到有关GPU单位顺序的冲突输出。其中有两个:Tesla K40和NVS315(从未使用过的传统设备)。当我跑步时deviceQuery
,我得到
Device 0: "Tesla K40m"
...
Device PCI Domain ID / Bus ID / location ID: 0 / 4 / 0
Device 1: "NVS 315"
...
Device PCI Domain ID / Bus ID / location ID: 0 / 3 / 0
Run Code Online (Sandbox Code Playgroud)
另一方面,nvidia-smi
产生不同的顺序:
0 NVS 315
1 Tesla K40m
Run Code Online (Sandbox Code Playgroud)
我觉得很困惑。我为Tensorflow(以及Pytorch的类似解决方案)找到的解决方案是使用
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0"
Run Code Online (Sandbox Code Playgroud)
Tesla的PCI总线ID为4,NVS的PCI总线ID为3,因此应将其设置为3(NVS),对吗?
在火炬我设置
os.environ['CUDA_VISIBLE_DEVICES']='0'
...
device = torch.cuda.device(0)
print torch.cuda.get_device_name(0)
Run Code Online (Sandbox Code Playgroud)
要得到 Tesla K40m
当我改为
os.environ['CUDA_VISIBLE_DEVICES']='1'
device = torch.cuda.device(1)
print torch.cuda.get_device_name(0) …
Run Code Online (Sandbox Code Playgroud)