为了缩小这个问题的范围,让我们只考虑C/ C++中的项目。
x86体系结构有一整套新的SIMD指令集扩展,但是为了从中受益,开发人员应该使用适当的优化标志重新编译代码,并可能相应地对其进行修改。
由于新指令集扩展的出现相对频繁,因此不清楚如何在利用可用指令集扩展的好处的同时保持向后兼容性。
结果应用程序是否与不支持新机构集扩展的旧CPU模型保持兼容?如果是,请详细说明这种支助是如何实施的吗?
发布于 2017-12-21 06:20:35
历史上,大多数x86指令集(实际上)都是以前集合的严格超集。然而,AVX-512扩展有几个相互不兼容的变体,因此需要特别小心。
幸运的是,编译器也变得越来越聪明。GCC使用__attribute__((simd))和__attribute__((target_clones(...)))自动创建给定函数的多个实现,并根据实际的CPU支持情况在加载时选择最佳的实现。(对于老GCC版本,你必须手动使用IFUNC .在古代,ld.so会从一个完全独立的目录中加载库,具体取决于cmov)。
发布于 2017-12-21 06:09:57
新的CPU指令需要新的硬件来执行。如果您尝试在不支持这些指令的旧CPU上运行它们,您的程序将因Opcode错误而崩溃。偶尔OSes会处理这种情况,但通常不会。
要运行新指令,要么需要在硬件中支持它们,要么(如果好处足够大)在运行时检查是否支持所需的新指令。如果是,则运行一段使用它们的代码。如果不是,则运行不使用它们的另一段代码。
通常,“向后兼容”指的是运行在旧的、现有的东西上的东西的新版本,而不是用新的东西运行的旧东西。
https://stackoverflow.com/questions/47918575
复制相似问题