首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPU程序集是什么样子的?

GPU程序集是什么样子的?
EN

Computer Graphics用户
提问于 2018-07-14 15:23:13
回答 4查看 18.5K关注 0票数 21

我曾经玩过CPU组装编程,比如Nasm、Tasm或Masm,但我真的很想知道GPU现在是如何工作的。然而,当我看到互联网时,我感到很困惑。我听说过Cuda和OpenCL,但这不是我想要的。我想知道GPU指令是如何在RAM中.对于大多数GPU,Nasm和Masm是什么?GPU的x86或Z80是什么(GPU的不同家族)?你知道构造函数操作码参考手册吗?我想我真的需要一些东西来比较这两个处理单元,因为GPU组装编程似乎是一个更难从互联网上学习CPU asm编程的课题。我也读过"NVIDIA从来没有发布过他们的硬件实际理解的指令的细节“,但这对我来说似乎是相当令人惊讶的。在那里的全文:https://stackoverflow.com/questions/4660974/how-to-create-or-manipulate-gpu-assembler?newreg=e31519279ce949f087df6322dbf2bf4d

谢谢你的帮忙!

EN

回答 4

Computer Graphics用户

回答已采纳

发布于 2018-07-15 08:27:37

你正在向风车倾斜,试图学习"GPU组装“,这是由于GPU和GPU是如何制造和销售的不同的。

每个CPU都有所谓的指令集体系结构,例如x86或ARMv8。指令集是CPU用户(即程序员)和芯片之间的接口。芯片设计器发布指令集的详细信息,以便编译器供应商可以编写编译器来针对该指令集。任何使用该指令集的CPU都可以运行相同的二进制文件。(像SSE这样的扩展使这一点有点不真实,但它们只添加了新的指令:它们不改变二进制文件的结构。)当供应商创建一个新的处理器系列时,它可以在内部拥有完全不同的微体系结构,但是拥有相同的指令集。

GPU根本就不是这样的。为了达到最佳的效率,指令集通常与CPU的微体系结构紧密相连.这意味着每一个新的GPU家族都有一个新的指令集。GPU无法运行为不同GPU创建的二进制文件。由于这个原因,指令集通常不会发布:相反,您与GPU的接口是由供应商为每个图形API (OpenGL、Vulkan、DirectX和&c.)发布的驱动程序。这就是为什么图形API具有获取着色器源代码并运行它的功能:编译后的着色器只运行在它编译的GPU的同一个模型或系列上。

最接近GPU汇编语言的是SPIR-V。这是一个行业标准的中间表示,GPU供应商正在开始支持它。它就像一个GPU等价于LLVM的中间表示。它允许您预先完成编译的解析和源代码优化部分,以获得SPIR-V文件,然后GPU驱动程序只需在加载时将其编译到GPU的指令集。

票数 29
EN

Computer Graphics用户

发布于 2018-07-15 05:31:39

你所读的是正确的。通常,GPU供应商不会发布GPU的机器指令列表。

也就是说,您可以使用OpenGL ARB汇编语言在GPU上执行类似于程序集编程的操作。它允许您以汇编样式编写程序,每一行编写一个操作码及其操作数。虽然这与为CPU编写汇编语言不太一样,但它与您可能得到的汇编语言非常接近。我认为它在现代OpenGL中是不可取的(虽然不是积极的)。它在OpenGL 2.1中仍然有效。

票数 5
EN

Computer Graphics用户

发布于 2020-09-16 20:57:30

对于Nvidia GPU,有几种机器语言可以在这里阅读:https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#instruction-set-ref

在“指令集引用”一节中,还有一些关于存储在ELF中的SASS代码的SM70变体的例子,因此它也是一种机器代码,因为出于历史原因,ELF始终是一个非托管代码容器(除了PE之外,它可能包含CIL托管代码,但即使在这种情况下,它也必须位于数据部分,而ELF根本不支持这种令人困惑的特性),而且它不是托管/虚拟字节码或某些用户这样说的东西,它是GPU的真正本机编译设备代码。正确的指令是用大写字母和十六进制形式写的(比如/*0000*/ MOV R1,c0x0 ;),其他指令只是PTX,实际上与问题无关。作为一个缺点,如果发行商选择以预编译的形式发布GPU程序,而不是源代码,或者至少是可移植的PTX,则可能需要fatbin技术。但是这是非常罕见的,因为没有CPU的二进制文件那么多这样的程序。无论如何,这类代码通常包含在库宾文件中,这些文件通过调用"cuModuleLoad“动态加载,然后使用"cuModuleGetFunction”重写指针到设备GPU函数句柄,然后调用"cuLaunchKernel“,这迫使驱动程序向GPU发送二进制代码,并从类似的0地址开始执行,因为所有内核从0开始(实际上,Nvidia使用的ELF变体包含许多部分,但驱动程序只发送所需的内核代码及其子程序和数据,如开关数据等)。那么指令本身呢,嗯,它们大多是由RISC设计的。没有div或mod,相反,nvcc编译器必须输出基于加法、减法、乘法、移位、按位逻辑操作(按位运算和大部分)的复杂算法。只有寻址模式才能提醒某些CISC的存在,如"LD R2,R2+0x1c;“等。

票数 5
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/7809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档