图形驱动程序如何以编程方式从CPU到GPU进行通信?

vli*_*ind 6 c c++ cpu assembly gpu

我很想知道CPU指令如何与GPU交互.据我所知,CPU具有一定的指令(机器代码),它可以理解和执行,驱动程序是一个通过CPU与GPU通信的软件.

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

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

jco*_*der 7

与PC上的任何硬件设备一样,图形卡将响应对某些存储器地址的读写,以及可能的输入/输出端口.PCI总线定义了这些分配的方式.

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

例如,可以将对存储器位置1234567的写入指向图形卡以指示对其的命令.(当然这只是一个组成的例子)你当然可以编写自己的驱动程序来做到这一点,但是你必须确切地知道卡所期望的不同的东西,而这通常只是一个秘密,只有制造商,他们在他们的驱动软件中实现它.有些卡比其他卡更好记录,有些卡已部分逆向工程.


old*_*mer 5

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

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

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

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

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