验证与传统英特尔处理器的兼容性

Verifying compatibility with legacy Intel processors

我有一个应用程序旨在针对广泛的 Intel 处理器系列,从古老的(Pentium、Pentium II)到现代的(Haswell、Skylake)。它具有为 x86 指令集(SSE、AVX 等)的各种扩展量身定制的特定代码路径。但是,我只能访问可追溯到 Sandy Bridge 的计算机,无法验证该应用程序实际上 运行 在支持的最旧架构上。虽然旧的 CPU 不太可能用于任何目的,但从代码质量的角度来看,知道名为 my_routine_sse2 的函数不会意外使用来自 SSE3 等的指令会很好。

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

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

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

顺便说一句,函数指针非常适合 CPU 调度。在启动时,检查 CPUID 并设置一些函数指针。后面的函数通过函数指针进行调用,以获取调度程序为此主机选择的任何版本的函数。这样一来,您就不会在任何想要使用具有可用优化版本的函数的地方都有条件分支树。 x264(开源 h.264 视频编码器)将此技术用于其广泛的 asm 例程集合。


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

过去 ~10 年的所有 CPU 都可以 运行 64 位代码,尽管有些人在更新的 CPU 上有 32 位 Windows CPUs。不幸的是,它通常仍然需要为使用遗留系统的人提供 32 位版本。

不过,SSE2 可能是一个合理的基准选择。您要排除的最新 CPUs 是 AMD AthlonXP CPUs,就在第一个 AMD64 k8 内核之前。