问题描述
在某处是否有参考文献可以告诉我哪些处理器本身支持'clz'?我可以假设几乎所有台式机,服务器和移动电话都支持吗?
我尝试改用__builtin_ffs
,因为它在0时没有不确定的行为,这使我在性能关键代码中保存了指令,但在基准测试中,它比__builtin_clz
慢了10倍,这使其认为不是硬件即使__has_builtin(__builtin_ffs)
返回true,也支持。需要有效地在任何处理器上运行。
如何确定clz在某些硬件上不会出现相同的问题?
解决方法
我建议您也许通过某种内联汇编使用BSR / BSF,因为几乎所有x86处理器都支持它。
https://www.felixcloutier.com/x86/bsr https://www.felixcloutier.com/x86/bsf
是的,您将需要处理零输入的未定义行为。
,哪些处理器支持__builtin_clz?
__builtin_clz
是编译器支持的内置函数。没有处理器支持__builtin_clz
-您的编译器支持该内置函数。 Gcc支持许多架构-我相信gcc可以使用__builtin_clz
来为其中的任何一种编译代码。
在某处是否有参考资料可以告诉我哪些处理器本身支持'clz'?
我认为简短的Google搜索应该会导致the nice wikipedia table Find_first_set#Hardware_support。
我可以假定几乎所有台式机,服务器和移动电话都支持吗?
不知道。我建议不要-假设有关环境的某些事情导致编写不可移植的代码。
如何确定clz在某些硬件上不会出现相同的问题?
可以帮助您的简短算法
- 编写一个使用该特定于编译器的内置程序的简短程序。
- 编译“某些硬件”的代码。
- 检查由编译器生成的汇编代码。
- 如果您喜欢生成的汇编代码,
- 这意味着您不会遇到相同的问题,
- 否则,您可能会遇到相同的问题。
我建议只编写特定于您所关心的硬件的特定程序路径,然后回退到您不想处理的任何其他硬件上的某些通用便携式解决方案。特定于硬件和编译器的解决方案很可能会使用__asm__
和__builtin_*
函数。