作为二进制文件分发的专有程序如何利用它们运行的​​硬件的特性?

时间:2016-01-31 10:38:14

标签: performance assembly x86 hardware

我总是想知道,当你购买专为x86架构设计的视频游戏时(例如),这款视频游戏在使用更好的CPU / GPU时表现得更好......

据我所知,在安装过程中没有编译,因此无论硬件是什么,二进制文件中的指令都应该完全相同。因此,即使CPU / GPU可以处理更多的专用指令,这些也不在程序中,因为它会使程序与其他硬件不兼容。

这个推理我错了吗?

作为二进制文件分发的专有程序如何利用它们运行的​​硬件的特性?

2 个答案:

答案 0 :(得分:2)

他们在运行时检测硬件功能(在目标PC上运行)。通常使用机器代码级别的CPUID - 指令检测CPU功能(请参阅原始概述here)。该指令通常通过内置的编译器 - 内在函数来访问,例如, GCC __builtin_cpu_supports("sse3")(请参阅Intrinsics for CPUID like informations)。

GPU的功能也可以在运行时检测到,通常使用驱动程序提供的相应DirectX / OpenGL-API。例如,DirectX可以使用一些相关信息填充Caps Structure (Microsoft.DirectX.Direct3D)。另一种可能是使用包含每个图形卡功能的数据库(参见DirectX capabilities on different graphics cards)。

  

因此,即使CPU / GPU可以处理更多的专用指令,这些也不在程序中,因为它会使程序与其他硬件不兼容。

事实并非如此。旧硬件不支持的较新指令肯定可以编码在可执行文件中。只要它们不会被执行(运行),这不会造成任何伤害并且不会使程序崩溃。因此,在运行时检测CPU功能 - 程序将根据这些功能选择哪些代码可以安全执行。这些其他指令将被简单地视为任何其他非可执行数据 - 如图片或文本。

  

作为二进制文件分发的专有程序如何利用它们运行的​​硬件的特性?

他们通过多次编码相同的功能来实现这一目标,每个版本针对特定的一组特性/功能进行了优化。然后,在运行时,选择执行速度最快的版本,忽略其他版本。

答案 1 :(得分:1)

GPU实际上具有广泛不兼容的指令集,没有游戏实际上附带预编译着色器(在GPU上运行的程序)。 AMD,Nvidia和Intel的GPU不仅具有不同的指令集,而且还为每一代新芯片完全重新设计它们。相反,游戏附带部分编译的字节码着色器,或者在某些情况下是普通的源代码,它们在运行时由视频驱动程序编译到GPU实际使用的任何指令集中。