本文主要是介绍【WebGPU Unleashed】0.0 GPU驱动程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加VX:digital_twin123
什么是GPU驱动程序
学校毕业后,我找到了第一份工作,担任系统软件工程师,负责 OpenGL(GPU 驱动程序)工作。但当时我对驱动程序的了解还相当有限。在大学里,GPU和驱动软件并不是计算机科学研究的重点,所以我只知道驱动程序是一个软件,充当硬件和应用程序之间的桥梁。我不知道它是如何工作的,也不知道它传输到硬件的数据类型。直到我加入团队并开始从事该项目后,我才对 GPU 驱动程序的运行方式及其在图形渲染过程中的关键作用有了更深入的了解。
作为图形工程师,我们编写程序在屏幕上绘制像素。尽管绘图看起来似乎是瞬时的,但幕后发生了很多活动。为了正确理解和使用 WebGPU API,对 GPU 驱动程序和渲染管道的工作原理有一个基本的了解非常重要。 GPU 驱动程序充当图形应用程序(例如视频游戏)、操作系统和 GPU 硬件之间的中介。了解 GPU 驱动程序和渲染管线的作用有助于我们更好地理解和利用旨在控制 GPU 硬件的图形 API。
GPU驱动程序不是单个程序,而是服务于不同功能的多个程序的包。一些处理视频压缩和解压缩,而另一些则执行一般计算任务。然而,GPU驱动程序的核心功能是实现实时3D图形渲染。
图形API又是指什么
令人困惑的是,这些 GPU 驱动程序有时也称为图形规范。这是因为在实现的背后,有很多公司都认可的API规范。例如,DirectX 标准是由 Microsoft 主导的,它是 Windows 平台上大多数游戏的首选 API。另一方面,OpenGL 是由 Khronos Group 定义的,该组织是一个由 3D 图形领域主要公司的代表组成的联盟。这些API的实现通常由NVIDIA、AMD和Intel等GPU供应商负责,并以驱动程序的形式发布并安装在我们的计算机上。
多年来,OpenGL 和 DirectX 一直是实时 3D 图形的主要选择。然而,近年来,新的 API 不断涌现,例如 PC 上的 Vulkan、DirectX 12 和 Mac 上的 Metal。 DirectX 12 虽然感觉像是 DirectX 系列的后继者,但它是一种全新的设计,与 DirectX 11 显著不同,使其成为一个独特的 API。
新图形标准的出现反映了 API 设计思维方式的转变。老一代 API 力求通用并为所有用例提供繁重的工作,但结果是它们变得缓慢且繁琐。相比之下,较新的 API 被设计为轻量级的,并让开发人员承担更多的微调和性能优化的责任。虽然这使得使用新 API 的图形开发更具挑战性,但它也允许更好的控制和改进的性能。开发效率和人体工程学现在得到高级图形中间件(例如游戏引擎)的支持,可以帮助解决特定的用例。例如,如果你正在开发视频游戏,通常不建议使用低级 API 从头开始,而是选择合适的游戏引擎。
Web 3D 图形的开发遵循了与其他图形技术类似的路径。 WebGL 和 WebGL2 是最早的 Web 3D API,与 OpenGL ES 2 和 3 共享根源。它们经过简化以提高功能较差设备上的效率,并放弃了向后兼容性的要求。与其他图形 API 不同,这些 Web API 不是由硬件供应商在驱动程序中实现,而是由 Web 浏览器提供。 Web 浏览器将这些 API 转换为本机 API 之一。例如,在 Chrome 中,有一个名为 ANGLE 的子系统,它实现了 WebGL API。如果是在Windows上的Chrome,就是通过ANGLE转换为DirectX可以理解的指令。因此,在Windows平台上的Chrome浏览器里,WebGL实际上是通过ANGLE这样的适配器间接地与DirectX进行交互的,而不是直接调用OpenGL或DirectX。
直到最近,WebGL 和 WebGL2 一直是 Web 上使用最广泛的 3D 图形 API。然而,WebGPU(新一代 3D API 的 Web 版本)遵循相同的轻量级设计原则,将在不久的将来取代 WebGL。因此,现在是开始学习这一新标准的绝佳时机。
现在我们对图形 API 的概况有了广泛的了解,那么图形驱动程序到底是做什么的呢?
GPU驱动程序是怎么运作的
众所周知,操作系统有两种运行模式:内核模式和用户模式。内核模式处理操作系统运行所需的最基本的功能。相比之下,用户模式不太重要,大多数应用程序都运行在这种模式下。只有一个操作系统内核在运行,它为许多其他在用户模式下运行的应用程序提供服务。
当谈到 GPU 驱动程序时,架构是相似的。一些 GPU 驱动程序在内核模式下运行,它们负责将绘制命令调度到 GPU 硬件、分配或发送资源以及执行 CPU 和 GPU 之间的同步。内核模式 GPU 驱动程序只有一个实例。其他组件以动态链接库的形式实现,作为应用程序的一部分在用户模式下运行,为图形功能提供高级接口,其中最著名的是 OpenGL 和 DirectX。我们将在后面的部分中更深入地探讨 GPU 驱动程序的架构。
现在让我们看看用户模式驱动程序和内核模式驱动程序如何与操作系统一起工作以使图形子系统正常运行。
在正在运行的系统中,每个需要执行图形任务的应用程序都加载了自己的用户模式驱动程序实例。因此,存在用户模式驱动程序的多个实例。相比之下,内核模式驱动程序仅在启动时加载一次,并由整个系统共享,包括用户应用程序和桌面等系统组件。
GPU驱动程序的重要作用
图形驱动程序具有三个重要作用。首先,它们充当实时编译器,将开发人员的 API 调用转换为 GPU 硬件可以理解的机器代码;其次,它们充当资源管理器,根据需要分配和释放 GPU 内存;最后,它们充当调度程序,将工作发送到 GPU 并为 CPU 和 GPU 之间的同步提供必要的基础设施。
你可能想知道为什么图形应用程序需要实时编译器,而 CPU 程序似乎不需要实时编译器。这是因为:
- GPU硬件没有标准的指令集,不像CPU方面x86和ARM都有开放和标准化的指令集。如果一个程序是为特定的CPU架构构建的,那么它应该在相同架构的所有CPU上运行,无论是什么硬件制造商。然而在GPU方面,NVIDIA的指令与AMD的指令不兼容,因此必须根据所使用的具体硬件来生成机器代码。
- GPU硬件的主要功能是渲染,但具体的渲染内容在编译时无法确定。例如,考虑一个显示时钟的应用程序。当前时间决定了用户界面上显示的内容,CPU代码根据这个时间生成一系列GPU绘图命令,然后发送到GPU进行渲染。由于 GPU 绘图命令是由当前时间确定的,因此它们必须在执行过程中动态生成。
在资源管理方面,GPU驱动程序负责分配GPU内存中的资源。这些资源可以包括纹理、包含几何图形的缓冲区或着色器程序。着色器程序运行在GPU上,负责将像素输出到屏幕。编写着色器程序是 GPU 编程的一个关键方面,我们将在后面的章节中更详细地探讨这个主题。
由于 GPU 内存有限,因此驱动程序必须对其进行有效管理。例如,它可以暂时将未使用的 GPU 资源交换到 CPU 内存中,以优先考虑其他资源分配,从而允许系统运行比原始 GPU 内存允许的更多的图形应用程序。此外,CPU 和 GPU 内存之间的数据传输速度相对较慢,因此必须优化驱动程序以减少数据传输并最大限度地提高性能。
GPU 驱动程序的第三个角色是作为作业调度程序和同步基础设施。
所有用户应用程序都将其绘制命令和资源上传请求发送到内核模式驱动程序。在这种情况下,“上传”是指将数据从CPU内存复制到GPU内存,而相反的过程,即从GPU内存复制数据到CPU内存,被称为“下载”。
内核模式驱动程序负责将这些请求发送到 GPU 硬件来执行,并在请求完成时通知系统。此过程类似于 JavaScript 事件循环,每个请求都充当异步函数调用。
然而,这些调度并不像看起来那么简单。由于内核模式驱动程序由整个系统共享,因此必须仔细且公平地管理工作负载。如果 GPU 陷入长时间运行的作业中,可能会导致整个系统挂起,就像长时间运行的 JavaScript 函数冻结 Web 浏览器一样。
除了其他职责之外,GPU 驱动程序还有助于 CPU 和 GPU 之间的同步,以避免数据争用。例如,如果我们正在渲染 3D 场景,并希望将渲染结果保存为图像,则需要驱动程序在渲染完成后通知我们,然后再保存。
举一个具体的例子,当一个图形应用程序(例如游戏)启动时,它会请求操作系统加载适当的用户模式驱动程序,并通过调用图形API提供的函数开始与GPU交互。视频游戏需要通过 API 分配资源,例如缓冲区和纹理,并通过定义着色器程序来配置渲染行为。在渲染过程中,游戏通过API发送几何数据进行渲染。用户模式驱动程序将这些函数调用转换为GPU硬件可以理解的低级命令和数据,并通过系统调用将它们发送到内核模式驱动程序进行作业调度。内核模式驱动程序响应来自整个系统的所有与GPU相关的请求,将所有这些请求排队执行,并确保排队策略对于整个系统来说是公平且高效的。
总结
本节概述了图形 API 的概况、GPU 驱动程序的体系结构,以及用户模式驱动程序、操作系统和内核模式驱动程序如何协同工作来控制 GPU 硬件。我们还讨论了 GPU 驱动程序执行的三个主要角色。然而,驱动程序只是GPU的助手,实际的渲染是由硬件使用一个称为GPU管道的概念来进行的。在下一节中,我们将更详细地探讨该管道,因为它构成了图形 API 设计的基础。
这篇关于【WebGPU Unleashed】0.0 GPU驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!