c – 如何在电路板上发现PCIe总线拓扑和插槽号?

例如,当我使用带有CUDA C/C++和GPUDirect 2.0 P2P的多GPU系统时,我使用嵌套的PCI-Express交换机,如图所示,那么我必须知道它们的PCI总线ID在任意两个GPU之间有多少交换机,优化数据传输和计算分配.

或者,如果我已经知道具有PCIe交换机的硬件PCIe拓扑,那么我必须知道,板上哪个硬件PCIe插槽连接了任何GPU卡.
c  – 如何在电路板上发现PCIe总线拓扑和插槽号?

据我所知,即使我已经知道具有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]
                }
            }
        }
    }
} 
上一篇:PCI总线的主要性能?


下一篇:PCI基地址寄存器BAR