为新指令集扩展优化编译的代码的向后兼容性

时间:2017-12-21 05:38:12

标签: c++ optimization x86 simd instruction-set

为了缩小这个问题的范围,让我们只考虑C / C ++中的项目。

x86架构有一整套新的SIMD指令集扩展,但为了从中受益,开发人员应该使用适当的优化标志重新编译代码,并且可能也会相应地修改它。

由于新的指令集扩展相对频繁地出现,因此不清楚在利用可用指令集扩展的好处的同时如何保持向后兼容性。

生成的应用程序是否与不支持新机构集扩展的旧CPU型号保持兼容?如果是,您能否详细说明如何实施此类支持?

2 个答案:

答案 0 :(得分:3)

新的CPU指令需要新硬件才能执行。如果您尝试在不支持这些指令的较旧CPU上运行它们,则程序将因无效操作码错误而崩溃。偶尔操作系统会处理这种情况,但通常不会。

要使用新指令运行,您需要要求它们在硬件中受支持,或者(如果好处足够大)在运行时检查以查看是否支持您需要的新指令。如果是,则运行一段使用它们的代码。如果不是,则运行不使用它们的不同代码段。

通常"向后兼容"指的是运行在旧的,现有的东西上运行的东西的新版本,而不是运行新东西的旧东西。

答案 1 :(得分:2)

历史上,大多数 x86指令集(实际上)是先前集合的严格超集。但是,AVX-512扩展有几种互不兼容的变体,因此需要特别小心。

幸运的是,编译器也越来越聪明。 GCC有__attribute__((simd))__attribute__((target_clones(...)))自动创建给定函数的多个实现,并根据实际CPU支持的内容在加载时选择最佳实现。 (对于较旧的GCC版本,您必须手动使用IFUNC ...并且在古代天,ld.so将根据cmov之类的内容从完全独立的目录加载库。< / p>