使用 x86-64 指令时,在不消除其全部性能优势的情况下检查其可用性的最佳方法是什么

When using x86-64 instructions what is the best way to check for their availability without wiping out their entire performance benefit

提问人:Cecil Ward 提问时间:5/30/2023 最后编辑:Peter CordesCecil Ward 更新时间:11/1/2023 访问量:52

问:

我正在使用内联 asm 围绕各种x86_64指令编写一些简单的 D (DLang) 包装例程。这运行良好,但是如果我想为缺少任何指令的旧处理器提供替代路径,那么检查和分支的开销将完全消除操作码可用的好处。我甚至在预主的一次性初始化例程中实现了对 cpuid 指令测试结果的缓存,以设置 cpuid 查询缓存/记忆。

我不知道其他人是怎么做到的,也许是修复可执行文件或共享库?这可能吗?除了 main() 的一个选择操作外,如何在可用与不可用的指令之间切换,开销为零?

否则,我将不得不给出两个版本的库例程,一个用于较旧的机器,一个用于较新的机器,并希望用户选择导入正确的模块。

程序 x86 机器代码 指令集 CPUID

评论

2赞 Erik Eidt 5/30/2023
如果最终性能是您的目标,请只检查一次,然后根据答案使用一组备用代码。否则,如果您愿意容忍某些条件,请检查一次,设置一个全局变量以稍后进行测试,然后以您认为可接受的任何级别和/或频率使用发散的代码路径。
4赞 prl 5/30/2023
我认为在初始化时将函数指针设置为基于 CPUID 选择的函数是典型的。如果预期的节省小于间接函数调用,那么可能不值得使用新指令。
1赞 Peter Cordes 5/30/2023
通常,您希望对包含循环的函数进行间接调用,因此内部循环中没有间接函数调用。这往往会扼杀收益。或者对于到处都有小好处的指令,例如 BMI1 / BMI2(或用于标量 FP 数学的 AVX),请对程序进行两个构建,一个用于 x86-64 基线,一个用于 x86-64-v3(AVX2+FMA+BMI2,即 Haswell 功能集)。
0赞 Cecil Ward 5/31/2023
谢谢。我考虑过所有这些方法。三十年前,我注意到 JPI C 通过修补操作码来处理 x87 指令,要么是真正的 x87 指令,要么是其他类型的短指令(也许是 int ?)指令。不幸的是,我不记得细节了。但那将是理想的。像“andn”这样的东西将是最困难的挑战,因为好处很小,而且很容易失去。在某些地方,我确实提供了额外的库函数,其中有循环,这是有道理的。但这不是一个程序,而是一个库。
0赞 phuclv 11/2/2023
使用较新的 CPU 指令支持构建向后兼容的二进制文件

答: 暂无答案