例如,当我使用带有CUDA C/C++和GPUDirect 2.0 P2P的多GPU系统时,我使用嵌套的PCI-Express交换机,如图所示,那么我必须知道它们的PCI总线ID在任意两个GPU之间有多少交换机,优化数据传输和计算分配.
或者,如果我已经知道具有PCIe交换机的硬件PCIe拓扑,那么我必须知道,板上哪个硬件PCIe插槽连接了任何GPU卡.
据我所知,即使我已经知道具有PCIe交换机的硬件PCIe拓扑,那么这些标识符也不会硬连接到板上的PCIe插槽,并且这些ID可能会发生变化,并且不同于系统的运行:
> CUDA device_id
> nvidia-smi / nvml GPU id
> PCI总线ID
使用详细的设备树和Windows和Linux上板上PCIe插槽的数量来发现PCIe总线拓扑的最佳方法是什么?
解决方法:
这是一个不需要解析注册表的脚本版本.所有信息(此处使用)都在win32_pnpentity中可用.
Function Get-BusFunctionID {
gwmi -namespace root\cimv2 -class Win32_PnPEntity |% {
if ($_.PNPDeviceID -like "PCI\*") {
$locationInfo = $_.GetDeviceProperties('DEVPKEY_Device_LocationInfo').deviceProperties.Data
if ($locationInfo -match 'PCI bus (\d+), device (\d+), function (\d+)') {
new-object psobject -property @{
"Name" = $_.Name
"PnPID" = $_.PNPDeviceID
"BusID" = $matches[1]
"DeviceID" = $matches[2]
"FunctionID" = $matches[3]
}
}
}
}
}