【问题标题】:Is there a way to programmatically find the current used GPU (C, C++)?有没有办法以编程方式查找当前使用的 GPU(C、C++)?
【发布时间】:2022-01-19 00:03:48
【问题描述】:

在 CPU 的情况下,(特定于 Linux 的)sys 调用 getcpu()sched_getcpu() 可以在程序中用于获取执行它们的内核的 ID。例如,在 4 处理器系统的情况下,由上述调用返回的逻辑索引可以推断出正在使用 4 个 CPU 中的哪一个(假设每个 CPU 包含 10 个内核,因此如果 sched_getcpu() 返回 20 ,这意味着 CPU #2 正在使用,因为核心编号 20 在第三个 CPU 中)。

在 GPU 的情况下如何实现类似的效果?有没有办法从应用程序内部实时找到正在使用的那个?

【问题讨论】:

  • 你到底想做什么?大多数应用程序不使用 GPU,因为您需要显式获取 GPU 资源。
  • 似乎是 askubuntu.com/questions/5417/how-to-get-the-gpu-info 的副本,尽管该问题的一些答案已经过时了,我确信工具已经改变
  • @WillOw 您提到的链接中的任何答案都没有提供有关如何以编程方式获取当前使用的 GPU的答案。请注意,我还明确写了“inside a program”、“from inside an application”和“C/C++”。
  • @ReyReddington 没有当前使用的 GPU,除非您明确要求使用 GPU,因此您需要展示/解释您是如何做到的
  • 如果系统有 OpenGL,您可以从 OpenGL 上下文中获取 GPU 信息,特别是 GL_VENDORGL_RENDERER。对于这个 Linux 桌面,我得到了“NVIDIA Corporation”和“GeForce GT 720/PCIe/SSE2”。要在不打开 GL 窗口的情况下执行此操作,请参阅您平台的 glxinfo.c 的源代码。如果未安装 OpenGL 硬件驱动程序,您将获得供应商的“Microsoft”或“Mesa”或类似名称。 khronos.org/opengl/wiki/…

标签: c++ c gpu cpu


【解决方案1】:

C++ 没有 GPU 的概念。您得到了很好的评论,指出使用 OpenGL 获取一些 GPU 信息的正确方向,我相信还有其他跨平台库。

查看neofetch 的源代码,它是一个命令行系统信息工具,除其他外,它可以获取您的 GPU。它使用一系列不同的方法来获取当前系统上的 GPU,其中一些方法可能会帮助您指出正确的方向。例如,对于 linux 系统,它使用 lspci -mm 获取 gpu 信息:

echo $(lspci -mm | awk -F '\"|\" \"|\\(' \
'/"Display|"3D|"VGA/ {
a[$0] = $1 " " $3 " " ($(NF-1) ~ /^$|^Device [[:xdigit:]]+$/ ? $4 : $(NF-1))
}
END { for (i in a) {
if (!seen[a[i]]++) {
sub("^[^ ]+ ", "", a[i]);
print a[i]
}
}}')

为我的系统返回NVIDIA Corporation GP107 [GeForce GTX 1050 Ti]。但这不是跨平台的。如果您想自己做,则必须:

  • 为您的应用程序将在其上运行的每个系统实现一种方法
  • 失去跨平台能力

或者简单地使用上面提到的OpenGL。

【讨论】:

    【解决方案2】:

    这取决于您用于访问 GPU 的 API。在 vulkan 下,API 本身提供了查询可用设备的功能。例如

    vkEnumeratePhysicalDevices    //< use to iterate over devices 
    vkGetPhysicalDeviceProperties //< use to determine make/model
    vkGetPhysicalDeviceFeatures   //< use to determine the capabilities
    

    在 OpenGL 下,这有点困难,因为 API 并没有真正提供一种很好的健壮方式来迭代连接的 GPU 的(这在很大程度上留给了底层操作系统)。除了使用 GL_VENDOR 和/或 GL_RENDERER 调用 glGetString 在创建上下文之后,这就是你所拥有的一切。

    一般来说,使用图形 API,您通常会先选择要使用的设备,然后再忘记它。 (即您知道正在使用哪个 GPU,因为它是您请求的那个)

    因此,例如,在 Windows 上,您将使用 WIn32 API 调用 EnumDisplayDevices 来迭代一堆 DISPLAY_DEVICE 结构,从而为您提供 GPU 设备的细分。如果您想查询设备功能,则需要初始化一个 OpenGL 上下文(使用正确的设备),并多次调用 glGetIntegerv 来查询实际功能。

    遗憾的是,在 linux 上这有点棘手。迭代显示设备在很大程度上取决于您用于初始化 GPU 的底层 API(例如 GLX、SDL、Qt 等)

    因此,例如,在 SDL 中,您将使用 SDL_GetRenderDriverInfo 遍历可用设备,然后在应用启动时将首选设备索引传递给 SDL_CreateRenderer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2021-08-28
      • 2011-09-12
      相关资源
      最近更新 更多