【问题标题】:CUDA/PyCUDA: Which GPU is running X11?CUDA/PyCUDA:哪个 GPU 正在运行 X11?
【发布时间】:2011-09-19 17:07:07
【问题描述】:

在具有多个 GPU 的 Linux 系统中,您如何确定哪个 GPU 正在运行 X11,而哪个可以完全免费地运行 CUDA 内核?在具有低功率 GPU 运行 X11 和高功率 GPU 运行内核的系统中,这可以通过一些启发式方法来确定以使用更快的卡。但在两张相等卡的系统上,不能使用此方法。是否有 CUDA 和/或 X11 API 来确定这一点?

更新:命令“nvidia-smi -a”显示是否连接了“显示器”。我尚未确定这是否意味着物理连接、逻辑连接(运行 X11)或两者兼而有之。在此命令上运行 strace 会显示调用了许多 ioctl,并且没有调用 X11,因此假设卡报告显示器已物理连接。

【问题讨论】:

  • 为什么 GPU 不能同时运行 X CUDA? X 不需要那么多处理。
  • 如果在运行 X11 的 GPU 上运行内核,则无法运行调试器。此外,在同一个 GPU 上运行时,如果您正在处理的内核冻结,X11 也会挂起,导致显示锁定。
  • 运行X11的不是带显示器的吗?它应该对内核有运行时间限制(您可以检查设备属性),而另一张卡应该没有运行时间限制(我认为这在 Linux 上也是如此,不仅在 Windows 上)

标签: linux cuda x11 pycuda


【解决方案1】:

cudaDeviceProp 结构中有一个设备属性kernelExecTimeoutEnabled,它将指示设备是否受制于显示看门狗定时器。这是给定 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 是一个专用的计算设备。

【讨论】:

    【解决方案2】:

    我不知道任何可以检查的库函数。然而,我想到了一个“黑客”: X11 或任何其他管理连接显示器的系统组件必须消耗一些 GPU 内存。

    因此,检查两个设备是否通过'cudaGetDeviceProperties' 报告相同数量的可用全局内存,然后检查“totalGlobalMem”字段的值。 如果相同,请尝试在每个 GPU 上分配该(或略低)的内存量,并查看哪一个未能做到这一点(cudaMalloc 返回错误标志)。

    前段时间我在某处(我不记得在哪里)读到,当您提高显示器分辨率时,虽然 GPU 上有一个活动的 CUDA 上下文,但该上下文可能会失效。这暗示上述建议可能有效。但是请注意,我从未真正尝试过。这只是我的猜测。

    如果您设法确认它有效或无效,请告诉我们!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2015-10-17
      • 2022-10-23
      • 2011-05-19
      • 2012-10-01
      • 2011-05-01
      • 2019-02-26
      相关资源
      最近更新 更多