在具有多个GPU的Linux系统中,如何确定哪个GPU正在运行X11以及哪个GPU可以完全免费运行CUDA内核?在具有低功率GPU以运行X11和更高功率GPU以运行内核的系统中,可以通过一些启发式来确定使用更快的卡。但是在具有两张相同卡的系统上,不能使用此方法。是否有CUDA和/或X11 API来确定这个?
更新:命令'nvidia-smi -a'显示是否连接了“显示”。我还没有确定这是否意味着物理连接,逻辑连接(运行X11),或两者兼而有之。在此命令上运行strace会显示正在调用的大量ioctl并且没有调用X11,因此假设该卡报告显示器已物理连接。
答案 0 :(得分:2)
kernelExecTimeoutEnabled
结构中有一个设备属性cudaDeviceProp
,它将指示设备是否受显示监视计时器的影响。这是给定CUDA设备是否运行X11(或Windows / Mac OS等效设备)的最佳指标。
在PyCUDA中,您可以像这样查询设备状态:
In [1]: from pycuda import driver as drv
In [2]: drv.init()
In [3]: print drv.Device(0).get_attribute(drv.device_attribute.KERNEL_EXEC_TIMEOUT)
1
In [4]: print drv.Device(1).get_attribute(drv.device_attribute.KERNEL_EXEC_TIMEOUT)
0
此处设备0连接了显示器,设备1是专用计算设备。
答案 1 :(得分:0)
我不知道任何可以检查的库函数。然而,想到一个“黑客”: X11或管理连接的监视器的任何其他系统组件必须占用一些GPU内存。
因此,检查两个设备是否通过'cudaGetDeviceProperties'报告相同数量的可用全局内存,然后检查'totalGlobalMem'字段的值。 如果它是相同的,尝试在每个GPU上分配那个(或仅略低)内存量,并查看哪一个未能做到这一点(cudaMalloc返回错误标志)。
前段时间我读到某处(我不记得在哪里)当你提高你的显示器分辨率时,虽然GPU上有一个活跃的CUDA上下文,但是上下文可能会失效。这暗示上述建议可能有效。但请注意,我从未尝试过它。这只是我疯狂的猜测。
如果你设法确认它有效,或者它没有,请告诉我们!