验证与旧版英特尔处理器的兼容性

时间:2015-09-29 19:37:27

标签: x86 compatibility executable intel backwards-compatibility

我的应用程序旨在针对广泛的英特尔处理器系​​列,从古老的(奔腾,奔腾II)到现代(Haswell,Skylake)。它具有针对x86指令集(SSE,AVX等)的各种扩展而定制的特定代码路径。但是,我只能访问可追溯到Sandy Bridge的计算机,无法验证应用程序是否实际运行在支持的最旧的体系结构上。虽然旧的CPU不太可能用于任何目的,但从代码质量的角度来看,知道名为my_routine_sse2的函数不会意外地使用来自SSE3的指令等,这是正确的。< / p>

面对这类问题时,人们通常会采取什么方法?是否有自动化工具可以扫描功能并确保不存在非法指令?是否有服务(Web或其他)提供对传统计算机体系结构的访问以进行测试和调试?

1 个答案:

答案 0 :(得分:2)

进行可在bochs下运行的单元测试,以测试所有my_routine_sse2等功能。

您仍然需要偶尔测试整个应用程序,以确保您没有搞砸CPU调度程序,或者在调度程序控制的功能之外包含一些非基线指令。

BTW,函数指针非常适合CPU调度。在启动时,检查CPUID并设置一些函数指针。后来的函数调用函数指针来获取调度程序为该主机选择的函数的任何版本。然后,除了您想要使用具有可用优化版本的函数之外,您还没有条件分支树。 x264(开源h.264视频编码器)使用这种技术来广泛收集asm例程。

你是对的,你的sse2功能不应该超越sse2,但如果你在SSE2设置你的基线,你可以在任何地方使用它而不检查。自动矢量化有时可以做很好的事情。如果你使用浮点,你可以让gcc使用不同的ABI,其中float / double在SSE寄存器中传递/返回,而不是x87。 (或者可能仍然在堆栈中传递,就像过时的32位x86 ABI中的其他东西一样。)

过去〜10年的所有CPU都可以运行64位代码,尽管有些人在新CPU上拥有32位Windows CPU。不幸的是,它仍然通常需要为具有遗留系统的人提供32位构建。

但是,SSE2可能是基线的合理选择。您排除这种方式的最新CPU是AMD AthlonXP CPU,就在第一批AMD64 k8核心之前。