繁体   English   中英

有没有办法以编程方式找到当前使用的 GPU (C, C++)?

[英]Is there a way to programmatically find the current used GPU (C, C++)?

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

在 GPU 的情况下,我怎样才能实现类似的事情? 有没有办法从应用程序内部实时找到正在使用的那个?

这取决于您用于访问 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结构,这将为您提供 Z52F9EC21735243AD9917CDA3 设备的细分。 如果您想查询设备功能,则需要初始化 OpenGL 上下文(使用正确的设备),并多次调用 glGetIntegerv 以查询实际功能。

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

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

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM