图形驱动程序如何通过程序从CPU到GPU进行通信

How does a graphics driver programmatically communicate from CPU to GPU?

本文关键字:GPU 通信 CPU 驱动程序 何通过 程序 图形      更新时间:2023-10-16

很长一段时间以来,我一直在想CPU指令如何与GPU交互。据我所知,CPU有一组它能理解和执行的指令(机器代码),而驱动程序是一块通过CPU与GPU通信的软件。

但是这个软件是如何通信的呢?CPU是否包含某些明确地"告诉"它与另一个设备通信的汇编指令?

我可以像给定一个特定的机器环境的驱动程序一样,编写汇编代码或C/C++代码来与显卡通信吗?

与PC上的任何硬件设备一样,图形卡将响应对某些内存地址的读取和写入,以及可能的输入/输出端口。PCI总线定义了如何分配这些数据。

没有特定的CPU指令来与图形卡通信,在向内存位置写入的情况下,它只使用普通指令来实现,在端口IO的情况下它只使用通用指令来实现。在这两种情况下,都需要一些CPU设置来将内存位置"映射"到虚拟地址空间或允许访问端口。

写入存储器位置1234567可以被引导到图形卡,以例如向其指示命令。(当然,这只是一个虚构的例子)你当然可以编写自己的驱动程序来实现这一点,但你必须确切地知道卡的预期,才能实现不同的功能,而这通常是只有制造商知道的秘密,他们在驱动程序软件中实现了这一点。有些卡片比其他卡片记录得更好,有些卡片经过了部分逆向工程。

视频卡并不比电脑内外的任何其他物品都神奇。你是如何阅读这个网页的,你至少有两台计算机通过一个接口(以太网/互联网)相互通信。内存、pcie(视频、硬盘、usb等)、usb(鼠标、键盘等)、网络,都通过接口连接到主cpu,这些接口最终连接到cpu的外部接口(内存总线没有更好的术语)。

我们喜欢认为这些设备中的许多都是纯逻辑的,当你写入路由到该外围设备的某个地址时,该地址和数据告诉该逻辑块执行一些操作,这似乎是有道理的。但是,就像在一台由另一台计算机提供服务的计算机上阅读这个网页一样,它不一定是纯逻辑的,你只需要一个移动数据的界面。不仅gpu,你电脑中的许多其他东西都有处理器,网络接口可能有,鼠标和键盘可能有,硬盘很可能有,而且正如我们现在所知,笔记本电脑上的电池组也有一个带固件的处理器(mac电池感染了一种病毒,在干净的重新安装后会重新感染电脑)。

没有魔法。计算机中其他处理器上运行的软件/固件与逻辑没有什么不同,它们的工作有一定比例是等待来自主cpu的命令来执行任务。鼠标请告诉我按钮的状态。Gpu请给我画一个三角形。

cpu中没有用于视频的特殊汇编语言指令。cpu从墙上的一个洞里不知道视频卡,驱动程序知道/确定它知道如何与之交谈的视频卡的地址空间,通过该地址空间它写入告诉视频卡做事所需的数据值。给我画一个三角形可能涉及几个数据项,毫无疑问,三个角的坐标,也许是填充颜色,或者是直线,这可能只是与外围设备通信接口定义的一部分。

这里没有魔法,如果你想请某人为你做点什么,你会提供一份清单,让他们做一些事情,并以他们能理解的方式交流(去主街123号,按门铃,告诉接电话的人你想要两张今晚演出的票,给他们这笔钱,带着零钱和票回来),使用硬件更容易,因为为外围设备定义了良好的通信接口。

是的,内存地址映射到计算机系统中的每个设备。最基本的是,如果你向映射到设备的某个内存区域写入,设备就会被写入。为此,设备具有映射到主存储器的特定寄存器和其他可编程空间。使用这些寄存器,您可以为您的案例配置GPU等设备。最后,对于巨大的数据传输,显然GPU使用了DMA传输,因此一旦启动DMA传输,它就可以在没有CPU干预的情况下工作。

因此,底线是,要与GPU或其他硬件设备进行通信,您需要研究安装GPU的系统架构,因为它最终是安装了GPU的系统中的系统软件,负责所有类型的内存映射和分配。

作为Von Neumann体系结构,内存总线是硬件系统的中心。每个设备都与内存总线通信,包括CPU。

让我们看看CPU,它只能向内存总线发出基本的读/写操作,以及一些额外的操作,如锁/屏障。

其他设备也是如此,例如GPU可以通过PCI接口通过DMA读取/写入主存储器;GPU还将一些寄存器映射到主总线,写入映射的寄存器可以发出特定命令的特定地址。

一般来说,所有设备都通过主存储器总线相互通信。

但除此之外,CPU还有一个中断接口,这是不可能的。

除了上面的答案之外,CPU还通过发送变量(内存地址)作为在GPU内部有意义的值来联系和处理GPU。GPU还执行图形API(OpenGL、Vulkan…)需要执行的调用,这些API通常用于与GPU交互,要通过多个步骤来实现硬件加速渲染(如果它用于渲染而不是GPGPU情况),其中一个基础就是渲染管道。