我很想知道CPU指令如何与GPU交互。据我所知,CPU具有一定的指令(机器代码),它可以理解和执行,驱动程序是一个通过CPU与GPU通信的软件。
但这个软件如何沟通? CPU是否包含明确告诉它与另一个设备通信的某些汇编指令?
我可以编写汇编代码或C / C ++代码与图形卡进行通信,就像驱动程序给出了一个特定的机器环境一样吗?
答案 0 :(得分:7)
与PC上的任何硬件设备一样,图形卡将响应对某些存储器地址以及可能的输入/输出端口的读写操作。 PCI总线定义了如何分配它们。
没有特定的CPU指令可以与显卡通信,在写入内存位置的情况下,它只使用普通指令来执行此操作,而在端口IO的情况下,它只使用通用指令来执行此操作。在这两种情况下,都需要一些CPU设置来将内存位置“映射”到虚拟地址空间或允许访问端口。
例如,可以将对存储器位置1234567的写入指向图形卡以指示对其的命令。 (当然这只是一个例子) 你当然可以编写自己的驱动程序来做到这一点,但是你必须确切地知道卡所期望的不同之处,这通常只是制造商知道的秘密,并且他们在驱动程序软件中实现它。有些卡比其他卡有更好的记录,有些卡已部分逆向工程。答案 1 :(得分:3)
是的,内存地址映射到计算机系统中的每个设备。基本的是,如果您写入映射到设备的某个内存区域,则会写入设备。为此,设备具有映射到主存储器的特定寄存器和其他可编程空间。使用这些寄存器可以根据情况配置GPU等设备。最后,对于巨大的数据传输,GPU显然使用了DMA传输,因此一旦启动DMA传输,它就可以在没有CPU干预的情况下工作。
所以底线是,为了与GPU或其他硬件设备进行通信,您需要研究安装GPU的系统架构,因为最终系统软件在安装GPU的系统中后退,负责所有类型的内存映射和分配。
答案 2 :(得分:1)
视频卡不比计算机内部或外部的任何其他项目更神奇。您是如何阅读此网页的,至少有两台计算机通过接口(以太网/互联网)相互通信。内存,pcie(视频,硬盘,USB等),usb(鼠标,键盘等),网络都通过最终连接到cpu外部接口(内存总线)的接口连接到主cpu缺乏一个更好的术语)。
我们认为这些设备中的许多都是纯粹的逻辑,并且当您写入路由到该外设的某个地址时,似乎有意义,地址和数据告诉该blob逻辑执行某些操作。但就像在一台由其他计算机提供的计算机上阅读此网页一样,它不一定是纯逻辑,只需要一个界面来移动数据。不仅是gpu而且计算机中的许多其他东西都有处理器,网络接口可能,鼠标和键盘可能都有,硬盘最有可能,而且我们现在知道笔记本电脑上的电池组有一个固件处理器好吧(mac battery感染了病毒,在重新安装后重新感染计算机)。
没有魔力。在计算机中的这些其他处理器上运行的软件/固件与逻辑没有什么不同,他们的工作的一部分是等待来自主cpu的命令来执行操作。鼠标请给我按钮状态。 Gpu请给我画一个三角形。
视频的cpu中没有特殊的汇编语言指令。 cpu不知道墙上一个洞的视频卡,驱动程序知道/确定它知道如何通话的视频卡的地址空间,通过该地址空间写入告诉视频卡所需的数据值的东西。画一个三角形可能涉及几个数据项,毫无疑问是三个角坐标,也许是填充颜色或是直线,这可能只是与该外围设备的通信接口定义的一部分。
这里没有魔力,如果你想让别人为你做点什么,你会提供他们要做的事情清单,以他们能理解的方式进行交流(去123大街,敲响门铃,告诉那个人你会得到两张有关今晚演出票的答案,给他们这笔钱,随着更改和门票返回),硬件更容易,因为通讯接口已经为该外围设备定义良好。
答案 3 :(得分:0)
除了上述答案外,CPU还通过发送变量(内存地址)来与GPU进行接触并与之打交道,因为在GPU内部具有含义的值还会执行图形API(OpenGL,Vulkan ...)需要执行的调用,这些API通常用于与GPU交互,通过许多步骤来实现硬件加速的渲染(如果用于渲染而不是GPGPU情况),其中一个基础就是渲染管道。
答案 4 :(得分:-1)
作为Von Neumann架构,内存总线是硬件系统的核心。每个设备都与内存总线通信,包括CPU。
让我们看一下CPU,它只能对内存总线发出基本的读/写操作,还有一些额外的操作,比如锁/屏障。
其他设备也是如此,例如,GPU可以通过PCI接口通过DMA读/写主存储器; GPU还将一些寄存器映射到主总线,写入寄存器映射的特定地址可以发出特定命令。
通常,所有设备都通过主存储器总线相互通信。
但另外,CPU也有一个中断接口,这是不可能的。