【发布时间】:2015-12-27 10:19:36
【问题描述】:
我有一个应用程序旨在针对广泛的英特尔处理器系列,从古老的(奔腾、奔腾 II)到现代(Haswell、Skylake)。它具有为 x86 指令集(SSE、AVX 等)的各种扩展量身定制的特定代码路径。但是,我只能访问可追溯到 Sandy Bridge 的计算机,并且无法验证该应用程序是否真的可以在支持的最旧架构上运行。虽然确实旧的 CPU 不太可能用于任何用途,但从代码质量的角度来看,知道名为 my_routine_sse2 的函数不会意外使用来自 SSE3 等的指令是一件好事。
面对此类问题,人们通常会采取哪些方法?是否有可以扫描功能并确保不存在非法指令的自动化工具?是否有服务(网络或其他)提供对旧计算机架构的访问以进行测试和调试?
【问题讨论】:
-
实际在 Bochs 下运行应用程序对于积极开发来说可能太慢了。不过,它可以用于发布验证。
-
我想在现代 CPU 上运行 Bochs 至少与在过时的本机 CPU 上运行一样快(如您所述,用于验证)。不过不确定。
-
英特尔至强融核协处理器(Knights Corner)基于大约 1995 年的 P54C 内核...
-
x264 对 SSE 使用手写 asm,而不是 C 内部函数。他们使用带有 .cpu 宏的 YASM 来检查声称仅 SSE2 的函数是否不会意外使用任何后续指令。该检查发生在组装时。同样,我认为 gcc 通常会抱怨如果您使用要编译的目标不支持的向量内在函数,我不确定这种不应该提供的内在函数的缺乏定义有多强大。在一种情况下(至少),相同的内在函数可以生成具有差异要求的指令:AVX1:
VBROADCASTSS x/ymm, m32。 AVX2:VBROADCASTSS x/ymm, xmm
标签: x86 compatibility executable intel backwards-compatibility