【问题标题】:How does a graphics driver programmatically communicate from CPU to GPU?图形驱动程序如何以编程方式从 CPU 到 GPU 通信?
【发布时间】:2016-10-01 22:29:29
【问题描述】:

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

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

我是否可以编写汇编代码或 C/C++ 代码来与显卡通信,就像驱动程序在特定机器环境下所做的那样?

【问题讨论】:

  • 你知道有开源操作系统,对吧? Just dive in。这是深水,但很有教育意义。
  • CPU 如何与硬盘、鼠标或键盘、电源按钮或声音芯片通信?

标签: c++ c assembly gpu cpu


【解决方案1】:

与 PC 上的任何硬件设备一样,显卡会响应对特定内存地址的读取和写入,可能还有输入/输出端口。 PCI 总线定义了这些是如何分配的。

没有特定的 CPU 指令与显卡通信,在写入内存位置的情况下,它只使用普通指令来执行此操作,而在端口 IO 的情况下,它仅使用通用指令来执行此操作。在这两种情况下,都需要一些 CPU 设置来将内存位置“映射”到虚拟地址空间或允许访问端口。

例如,对内存位置 1234567 的写入可以定向到显卡以向其指示命令。 (当然这只是一个虚构的例子) 您当然可以编写自己的驱动程序来做到这一点,但是您必须确切地知道卡对不同事物的期望,而这通常是只有制造商知道的秘密,他们在驱动程序软件中实现了它。有些卡片比其他卡片有更好的文档记录,有些卡片经过了部分逆向工程。

【讨论】:

    【解决方案2】:

    作为冯诺依曼架构,内存总线是硬件系统的中心。每个设备都与内存总线通信,包括 CPU。

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

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

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

    但另外,CPU还有一个中断接口,这不在话下。

    【讨论】:

    • 虽然这在很大程度上可能是正确的,但它确实不能回答这个问题。
    • 这不是“基本上是真的”,真的。 Intel 8080 引入了 I/O 总线,这可能更常见。此外,这些都是合乎逻辑的,并且常见的物理实现没有内存总线。相反,您有到设备的 PCI-e 通道,这是点对点连接而不是总线,这与 DDRx 内存总线(通常是复数)是分开的
    • @MSalters 由于这个答案最近收到了几个赞成票,我必须说清楚。 1) DDRx 内存绝对不是内存总线,它只是连接到主总线的一个端点,与 CPU、PCIe 或任何其他端点相同。 2)PCI-e肯定是主总线的一个端点,它是p2p内部连接我的意思是,所有的PCIe都通过p2p连接连接到PCIe根,但是PCIe根设备作为一个端点连接到主总线。现在现代 CPU 是 NUMA 而不是冯诺依曼,主要区别是每个 CPU 都有自己的主总线,它们通过 QPI 互连
    【解决方案3】:

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

    所以底线是,要与 GPU 或其他硬件设备进行通信,您需要研究安装 GPU 的系统架构,因为最终是系统软件在安装 GPU 的系统中后退负责各种内存映射和分配。

    【讨论】:

      【解决方案4】:

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

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

      没有魔法。在您计算机中的这些其他处理器上运行的软件/固件与逻辑没有什么不同,它们的工作的一部分是等待来自主 cpu 的命令来做事。鼠标请给我按钮状态。 Gpu请给我画一个三角形。

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

      这里没有魔法,如果你想请某人为你做某事,你会提供一份清单供他们做,并以他们可以理解的方式进行交流(去 123 大街,按门铃,告诉回答的人您想要两张今晚演出的门票,给他们这笔钱,然后将零钱和门票退回),使用硬件更容易,因为该外围设备的通信接口已明确定义。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-04
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          相关资源
          最近更新 更多