例如,是否可以有一个可执行文件使用 Core 2 处理器的功能,然后有选择地使用旧处理器的其他功能?还是需要编译不同的可执行文件?如果不是,那么在所有情况下都是如此吗?
答案1
这是完全有可能的,根据您所指的特征,方法略有不同。
例如,对于数学应用程序,您可以检测处理器和/或核心的数量,然后让每个核心处理计算的不同部分。然后,困难的部分是确保数据是同步的还是异步的,具体取决于手头的任务。
并且,如前所述,可以检查 MMX、SSE2 之类的东西,然后通过不同的代码路径运行,例如:
if (CPU.Supports SSE2) {then use SSE2 Libraries}
else if (CPU.Supports SSE) {Then use SSE Libraries}
else {use pre-SSE LIbraries}
此外,对于架构(x86 与 x64)等问题,几乎没有办法可以解决。例如,如果您使用 JAVA 或 C#,JIT 编译器可以在应用程序启动时针对任一架构优化代码,它可能不会像原生且经过良好优化的 C++ 应用程序那样快,但代价是使用 C++ 时您必须拥有 x64 和 x86 版本。
答案2
您可以拥有一个可执行文件,它在运行时检测使用哪个 CPU,然后选择最佳使用方式。当然,这些“最佳方式”都是预编译的。因此,您基本上是在使用一个已准备好以最佳方式使用少数处理器/指令集的程序。
似乎没有多少程序可以做到这一点,或者至少没有多少程序会告诉用户这一点。不过,至少有一些,例如德网可执行文件。
如果您愿意,您可以将它与一本书或一张传单进行比较,其中的索引说明:
第 10-20 页:英文
第 21-42 页:荷兰语
第 43-54 页:美国英语
第 55-70 页:丹麦语
...
您必须使用适合每种语言/指令集进行编写。
答案3
Linux 内核使用了诸如修补正在运行的内核之类的可怕技术来为一些常用的功能选择最佳算法。