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

how proprietary programs distributed as binaries do exploit the specificities of hardware they run on?

我一直想知道,当您购买专为 x86 架构设计的视频游戏(例如)时,这款视频游戏的表现通常会更好 CPU/GPU...

据我了解,安装过程中没有编译,所以二进制文件中的指令应该与硬件完全相同。因此,即使 CPU/GPU 可以处理更大的专用指令集,这些指令也不能出现在程序中,因为这会使程序与其他硬件不兼容。

我这个推理错了吗?

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

他们在 运行 时间检测硬件功能(运行 在目标 PC 上)。 CPU 特征通常在机器代码级别使用 CPUID 指令检测(参见原始概述 here). This instruction is generally accessed via built-in compiler-intrinsics, e.g. __builtin_cpu_supports("sse3") for GCC (see Intrinsics for CPUID like informations 作为示例)。

GPU 的功能也会在 运行 时检测到,通常由驱动程序提供适当的 DirectX/OpenGL-APIs。例如DirectX可以填一个Caps Structure (Microsoft.DirectX.Direct3D) with some relevant information. Another possibility may be the usage of a database containing the capabilities of each graphics card (see DirectX capabilities on different graphics cards).

Therefore even if a CPU/GPU can handle a larger set of specialized instructions, these could not be in the program, because it would make the program incompatible with other hardware.

事实并非如此。旧硬件不支持的新指令肯定可以在可执行文件中编码。这不会造成任何伤害,只要它们不被执行 (运行) 就不会导致程序崩溃。因此 CPU-在 运行 时进行特征检测 - 程序将根据这些特征选择可以安全执行的代码。这些其他指令将像任何其他不可执行的数据一样简单地处理 - 如图片或文本。

How proprietary programs distributed as binaries do exploit the specificities of hardware they run on ?

他们通过多次编码相同的功能来做到这一点,每个版本都针对一组特定的 features/capabilities 进行了优化。然后,在 运行 时间,选择最快的版本执行,其他版本将被忽略。

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