为新指令集扩展优化编译的代码的向后兼容性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为新指令集扩展优化编译的代码的向后兼容性相关的知识,希望对你有一定的参考价值。
为了缩小这个问题的范围,让我们只考虑C / C ++中的项目。
x86架构有一整套新的SIMD指令集扩展,但是为了从中受益,开发人员应该使用适当的优化标志重新编译代码,并且可能也相应地修改它。
由于新的指令集扩展相对频繁地出现,因此不清楚在利用可用指令集扩展的好处的同时如何保持向后兼容性。
生成的应用程序是否与不支持新机构集扩展的旧CPU型号保持兼容?如果是,您能否详细说明如何实施此类支持?
从历史上看,大多数x86指令集(实际上)都是先前集合的严格超集。但是,AVX-512扩展有几种互不兼容的变体,因此需要特别小心。
幸运的是,编译器也越来越聪明。 GCC有__attribute__((simd))
和__attribute__((target_clones(...)))
自动创建给定函数的多个实现,并根据实际CPU支持的内容在加载时选择最佳实现。 (对于较旧的GCC版本,您必须手动使用IFUNC ...在古代,ld.so将根据cmov
等内容从完全独立的目录中加载库。
新的CPU指令需要新硬件才能执行。如果您尝试在不支持这些指令的较旧CPU上运行它们,则程序将因无效操作码错误而崩溃。 OS偶尔会处理这种情况,但通常不会。
要使用新指令运行,您需要要求它们在硬件中受支持,或者(如果好处足够大)在运行时检查以查看是否支持所需的新指令。如果是,则运行一段使用它们的代码。如果不是,则运行不使用它们的不同代码段。
通常,“向后兼容”是指运行在旧的,现有的东西上运行的东西的新版本,而不是运行新东西的旧东西。
以上是关于为新指令集扩展优化编译的代码的向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章
AutoCloseable.close() 方法是不是破坏了 Java 的向后兼容规则
如何保持从 Blender 导出的 Three.js JSON 文件的向后兼容性
Mac SDK:使用最新的SDK,但确保与早期部署目标的向后兼容性