应用程序如何告诉操作系统使用 GPU 还是 CPU 来生成图形?

应用程序如何告诉操作系统使用 GPU 还是 CPU 来生成图形?

我们已经有了这个问题:

答案是,应用程序决定

计算机无法决定。应用程序决定,并且默认通常是功率较低的 GPU(例如集成)。

如果某个应用需要更高性能的图形,它可以在注册表中检查是否有多个 GPU 可用,如果有,则可以切换到功率更高的 GPU。该决定由开发人员做出;如果他们不需要高功率,则 Windows 将继续使用默认显示适配器。

但我们知道应用程序无法访问硬件;它们要求操作系统访问硬件资源,而操作系统则会在后台完成这项工作。如果我没记错的话,应用程序与操作系统对话的方式是通过调用系统调用。

所以我的问题是,如果某个应用程序需要绘制图形,它如何告诉操作系统是否应该使用 GPU?是否有一组仅用于 GPU 的系统调用和一组不用于 GPU 的系统调用?

答案1

在底层,至少在 Windows 和 Linux 上,存在“设备文件”的概念。没有任何专用于使用 GPU 的系统调用 - 相反,程序会打开与 GPU 相对应的设备文件,并通过“通用”读/写/mmap/ioctl 调用(相应的内核驱动程序接收)与其交互。例如,如果我没记错的话,\\.\Display0在 Windows 上与/dev/dri/card0在 Linux 上(加上/dev/fb0基本的 2D)。

在 Windows NT 上,这些设备文件存在于常规“文件系统”世界之外 - WinObj[Ex] 可以向您展示整个画面 - 而在 Linux 上,它们在文件系统内直接可见。

这意味着操作系统不会特别区分GPU——它具有处理多种设备的通用机制(实际上早于现代类型的“带有 dGPU 直通的 iGPU”设置),以及让程序与设备驱动程序通信的通用机制。

音频也可能如此,例如,/dev/snd/pcm*Linux 提供对任意数量声卡的访问,而根本不存在任何与音频相关的系统调用。一个更明显的例子可能是磁盘,因为程序直接与磁盘分区交互\\.\Harddisk2/dev/sdc创建磁盘分区或将 ISO 写入 USB 记忆棒。

(我不确定 macOS 具体如何暴露 GPU,但它是一个 Unix,所以它肯定有设备文件一般来说,它们与 Linux 一样位于 /dev 下。)

对于游戏程序员来说,所有这些都集成到了程序所使用的操作系统提供的整体图形编程接口中,例如 DirectX 有自己的方法,而 Vulkan 有自己的方法 (vkPhysicalDevice),OpenGL 有自己的方法(也可能没有)。操作系统特定的细节在某种程度上被 DX/VK/GL 抽象化了,其中包括设备选择。

答案2

我不同意你找到的答案——应用程序不会决定 GPU——操作系统会决定这一点,或者更确切地说,安装的软件称为 编解码器

编解码器是一种对数据流或信号进行编码或解码的设备或计算机程序

这些程序是在应用程序开始播放视频时由操作系统自动启动的,根据此编解码器支持的格式进行选择。编解码器的功能是接受来自应用程序的视频/音频命令并使用 CPU/GPU 执行这些命令。编解码器可以使用 GPU,或仅使用 CPU,或两者兼而有之。

如果操作系统选择了错误的编解码器,可以通过以下方式强制选择分配将程序迁移到高性能或低性能的 GPU。

在 Windows 11 中,这是在 设置 > 系统 > 显示 > 图形。然后点击列表中的应用程序并选择 选项。然后,您可以在“省电”和“高性能”之间进行选择。在这种情况下,您需要安装支持您选择的编解码器,因为如果没有安装这样的编解码器,操作系统可能会覆盖此设置。

相关内容