设备驱动程序指令如何对GPU进行编程?


9

说我正在使用计算机,或多或少使用任何典型的现代计算机。设备驱动程序负责我在屏幕上看到的所有内容,包括在我键入此内容后立即更新屏幕的过程(当然,这在操作系统(例如Windows)的范围内)。

让我们将其降至硬件不关心是否存在内核的水平,仅接受指令。

基本上,GPU如何“确切地”知道如何做所有事情?驱动程序是否基本上控制了可能的或使用驱动程序提供的特殊指令计算二进制数据以供显示的每一个微小的,固有的或硬件的电路级功能?

如果是这样,GPU是否像CPU一样使用“特殊”语言或“汇编”来理解发送给它的指令?

我的知识差距太大,GPU背后存在令人不愉快的“谜”,而这些GPU可以通过硬件直接访问。

例如,GPU和CPU必须能够以某种方式连接,因此可以通过CPU组件访问GPU,并实现正确的数据/地址总线。设备供应商无法使无法在驱动程序外部访问GPU,因为驱动程序也是编译代码,并且GPU作为可编程电路必须与二进制指令一起工作。

我已经问过这些类型的问题,并且在许多站点上都没有答案,所以很快就被暴力删除了,那么这里的大秘密/秘密是什么?这是主板上的一块硬件,可以像其他任何硬件一样进行访问。

因此,真的...假设这是关于软件和硬件的“确定”问题,那么任何人都可以直接访问GPU而无需供应商特定的文件,因为这些文件不是很神奇。

那么,如何从裸机,直接硬件角度在特定于硬件的级别对GPU进行“编程”?


我认为这是一个“确定”的问题(尽管很复杂,可能需要一本书来回答-这不是一种很好的格式,所以请先查看帮助中心导览页,以熟悉您可以在此处提出什么样的问题) 。
Doktoro Reichard

我没有在阅读帮助中心。

请问我为什么不呢?
Doktoro Reichard 2013年

因为可以花很多时间思考,所以尝试解决并回答我的“确定”问题。

正如我说的那样,要正确回答这个问题,您可能需要一本书……长答案通常不是一个好答案。
Doktoro Reichard 2013年

Answers:


8

基本上,GPU如何“确切地”知道如何做所有事情?驱动程序是否基本上控制了可能的或使用驱动程序提供的特殊指令计算二进制数据以供显示的每一个微小的,固有的或硬件的电路级功能?

不,该设备具有自己的IC,这些IC控制设备功能的所有硬件级别,并且它们与中央处理器接口,以协调设备上的各个方面并提供可使用的更高级别的编程接口。访问,读取,写入和控制设备。

如果是这样,GPU是否像CPU一样使用“特殊”语言或“汇编”来理解发送给它的指令?

是的,没有。与大多数设备一样,视频卡使用标准来简化事务。他们使用VESA等标准来访问常规功能(如引导时视频),或使用CUDA来访问GPU编程功能。此外,程序可以直接使用机器代码(通常为C编译为汇编程序)以及设备的编程文档(可从适配器的网站获得)来访问非标准或与设备相关的功能。

我的知识差距太大,GPU背后存在令人不愉快的“谜”,而这些GPU可以通过硬件直接访问。

驱动程序直接访问设备,这就是它们具有特殊访问权限的原因(出于安全性和稳定性的考虑,常规用户级程序不允许直接在Vista +中访问硬件)。使用端口,DMA(直接内存访问)和内存映射访问设备。

例如,GPU和CPU必须能够以某种方式连接,因此可以通过CPU组件访问GPU,并实现正确的数据/地址总线。设备供应商无法使无法在驱动程序外部访问GPU,因为驱动程序也是编译代码,并且GPU作为可编程电路必须与二进制指令一起工作。

通过访问内存映射的端口等,驱动程序可以使用常规CPU指令读写设备。作为一个易于理解的示例,您可以通过写入地址B8000的“内存”以文本模式在屏幕上显示字符。该地址不是RAM,而是映射为与视频卡的内存相对应,因此对其进行写入将写入屏幕。同样,你可以通过把你想要的字符写在写tothe屏幕AL注册表,0x09AH寄存器中,然后调用BIOS中断0x10。更高级的功能没有什么不同。您可以读写适配器的内存,调用其芯片上的功能,等等,使用设备公开和记录的任何inetrface。

因此,真的...假设这是关于软件和硬件的“确定”问题,那么任何人都可以直接访问GPU而无需供应商特定的文件,因为这些文件不是很神奇。

仅对于符合标准的功能,而对于其他所有功能(即更高级的功能),则需要查阅制造商的编程文档。

那么,如何从裸机,直接硬件角度在特定于硬件的级别对GPU进行“编程”?

通过多层:

  1. 晶体管等固态组件
  2. 低级ASIC
  3. 板载处理器和芯片组
  4. 低级编程接口(汇编)
  5. 高级编程接口(DirectX,OpenGL)
  6. 高级编程语言(C ++,C#,Python等)

1
关于“裸金属”的说明;在您听到大多数游戏开发人员正在谈论的情况下,他们抱怨他们必须使用DirectX / OpenGL之类的高级抽象,而不是编写可编译到卡本身机器语言的代码。请参阅此处,以获取Nvidia的FERMI GPU使用的汇编语言的信息code.google.com/p/asfermi请注意,即使CUDA都位于被编译为机器代码的高级语言(PTX)之上,因此您在CUDA中编程的opcoodes可能与编译后的输出不同。
弗兰克·托马斯

嘿,您可能有一个适合大学生的好书建议,其中涵盖了您在这篇文章中谈到的内容吗?我对从事GPU编程工作不感兴趣,但是我对所有工作原理的了解令人沮丧。
lanza

2

我不是计算机架构方面的天才,但我将尽我所能尝试按点来解决您的问题。


设备驱动程序负责我在屏幕上看到的所有内容,包括在我键入此内容后立即更新屏幕的过程(当然,这在操作系统(例如Windows)的范围内)。

没错,主要是因为与GPU的直接交互不容易实现。因此,开发了DirectX和OpenGL等图形框架。

维基百科中的这个方便的定义更详细地解释了这一点:

设备驱动程序通过充当硬件设备与使用该设备的应用程序或操作系统之间的转换器来简化编程。程序员可以独立于最终用户使用的任何特定硬件来编写高级应用程序代码。


基本上,GPU如何“确切地”知道如何做所有事情?驱动程序是否基本上控制了可能的或使用驱动程序提供的特殊指令计算二进制数据以供显示的每一个微小的,固有的或硬件的电路级功能?

GPU是微处理器。这样,他们处理。它们处理从CPU馈入的数据(即元素的位置)到正确的显示。他们“知道”如何做所有事情,因为它们是通过这种方式制造的,并且一大批人都同意了向GPU发送数据或从GPU发送数据的正确方法。

将显示驱动程序视为缓冲区或代理。假设您是一个程序窗口,并且用户将您向上移动。您要求GPU刷新显示。但是当GPU讲Klingon而您讲Vulcan时,驱动程序会收到您的命令,并将其转换为GPU,从而执行您的命令。

如果是这样,GPU是否像CPU一样使用“特殊”语言或“汇编”来理解发送给它的指令?


维基百科

ARB汇编语言是一种低级着色语言,可以将其描述为汇编语言。它是由OpenGL体系结构审查委员会(ARB)创建的,用于标准化控制硬件图形管线的GPU指令。

有一个示例,请记住,各个制造商(NVIDIA,ATI)都有自己的指令集。

此外,还存在OpenCL和许多其他方式,可以通过某种方式直接将指令编程到GPU。

所有这些都可以在某种程度上回答您的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.