为什么 SPIR-V 使用“4 字节”代码或 "Word code"?

Why does SPIR-V use a "4 byte" code, or "Word code"?

根据 SPIR-V 1.3 规范,据我了解,all instructions are segmented in 4 byte words. 这不同于传统的字节码 IR 语言,如 Python 的字节码和 Java 的 JVM 字节码,如果我正确理解字面上的段操作作为单个字节。我什至听到人们不经意地谈论这是一件特别好的事情 ("word code"),但从未详细说明原因。为什么 Khronos 小组决定沿着这条路线进行 SPIR-V 定义,而不是使用单字节格式或其他任意大小?

原因有很多,但可能最大的原因是它以简单、高效且可扩展的方式解决了端序问题。

SPIR-V 被定义为小端编码。因此,在大端系统上,第一步必须将数据转换为正确的字节序。在更面向字节的汇编风格中,您必须阅读和解释每个操作码,然后找出哪些操作数必须进行字节交换。基本上,字节序交换需要解释数据。使用 SPIR-V,您只需每 4 个字节转置一次:一个简单而高效的循环。

另外,SPIR-V 是可扩展的;扩展可以添加到操作码集中。在面向字节的程序集中,您需要能够理解每个扩展操作码才能进行字节序转换。使用 SPIR-V,您不关心是否可以理解所有操作码;只需每 4 个字节转置一次即可。所以你可以编写一个至少可以读取 SPIR-V 程序集的工具,即使它不理解所有的操作码。

这使得 SPIR-V 与其他字节码相比有点笨重,但更容易咀嚼。