gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:39:23 25 4
gpt4 key购买 nike

我有一个应用程序旨在针对广泛的英特尔处理器系​​列,从古老的(奔腾、奔腾 ​​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,你就可以在任何地方使用它而无需检查。自动矢量化有时可以做一些好事。如果你使用 float ,你可以让 gcc 使用不同的 ABI,在 SSE 寄存器中传递/返回 float/double,而不是 x87。 (或者可能仍然在堆栈上传递,就像过时的 32 位 x86 ABI 中的其他东西一样。)

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

不过,SSE2 可能是一个合理的基准选择。您将以这种方式排除的最新 CPU 是 AMD AthlonXP CPU,就在第一个 AMD64 k8 内核之前。

关于x86 - 验证与传统英特尔处理器的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32852386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com