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

3
我有一个应用程序,旨在针对从古老的(奔腾,奔腾II)到现代的(Haswell,Skylake)各种英特尔处理器。它具有专门为x86指令集的各种扩展量身定制的代码路径(SSE,AVX等)。然而,我只能访问追溯到Sandy Bridge的计算机,无法验证该应用程序是否实际运行在支持的最古老的体系结构上。虽然这些老CPU很可能不会用于任何目的,但从代码质量的角度来看,知道名为 my_routine_sse2 的函数不会意外使用来自SSE3或类似指令是很好的。
当面临这种问题时,人们通常采取哪些方法?是否有自动化工具可以扫描函数并确保不存在非法指令?是否有提供测试和调试遗留计算机架构访问的服务(Web或其他)?

1
http://bochs.sourceforge.net/ - Eric J.
实际上,在 Bochs 下运行应用程序可能会因为速度过慢而不适合进行主动开发。但是可以用于发布验证。 - 68ejxfcj5669
1
我想象在现代CPU上运行Bochs至少与在过时的本地CPU上运行一样快(如您所提到的验证)。不过我也不确定。 - Eric J.
英特尔Xeon Phi协处理器(骑士角)基于约1995年的P54C核心... - Jeff Hammond
1
x264使用手写汇编而不是C内置函数来实现SSE。他们使用带有.cpu宏的YASM来检查声称仅支持SSE2的函数是否意外地使用了任何后续指令。这个检查发生在汇编时期。同样,我认为gcc通常会抱怨如果你使用矢量内置函数,而目标编译器不支持。我不确定这种缺乏内置函数定义的鲁棒性如何。在至少一个案例中,相同的内置函数可以生成具有不同要求的指令:AVX1:VBROADCASTSS x/ymm, m32。AVX2:VBROADCASTSS x/ymm, xmm - Peter Cordes
1个回答

2
创建可以在bochs下运行的单元测试,以测试所有my_routine_sse2等函数。您仍然需要偶尔测试整个应用程序,以确保您没有搞砸CPU分派程序或包含一些不受您的分派程序控制的非基线指令的函数。
顺便说一下,函数指针非常适合CPU分派。在启动时,检查CPUID并设置一些函数指针。稍后,函数通过函数指针调用以获取分派程序为此主机选择的函数版本。然后您就不必在每次想要使用具有可用优化版本的函数时都有一个条件分支树。x264(开源H.264视频编码器)对其广泛的汇编例程使用了这种技术。
您说得对,您的sse2函数不应超出sse2,但是如果将基线设置为SSE2,则可以在无需检查的情况下在任何地方使用它。自动向量化有时可以做出很好的事情。如果使用浮点数,您可以让gcc使用不同的ABI,在其中float / double在SSE寄存器中传递/返回,而不是在x87中。 (或者可能仍然在堆栈上传递,就像过时的32位x86 ABI中的其他东西一样。)
过去约10年的所有CPU都可以运行64位代码,尽管某些人在较新的CPU上使用32位Windows。不幸的是,通常仍需要为具有遗留系统的人提供32位版本。
SSE2可能是一个合理的基线选择。通过这种方式排除的最新CPU是第一批AMD64 k8核心之前的AMD AthlonXP CPU。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接