以下功能是在一个时钟周期内执行的吗?
__builtin_popcount
__builtin_ctz
__builtin_clz
Run Code Online (Sandbox Code Playgroud)
同样的ll(64位)版本的时钟周期是多少.他们是便携式的吗 为什么或者为什么不?
这些功能是在一个时钟周期内执行的吗?
不必要.在可以使用单个指令实现它们的体系结构中,它们通常是计算该功能的最快方式(但仍然不一定是单个时钟周期).在不能将其作为单个指令实现的体系结构中,它们的性能不太确定.
在我的处理器(酷睿2),__builtin_ctz并且__builtin_clz可以与单个指令来实现(位向前扫描和位反向扫描).但是,__builtin_popcount在我的处理器上使用单个指令无法实现.因为__builtin_popcount,gcc 4.7.2调用库函数,而clang 3.1生成内联指令序列(实现这个位错误的hack).显然,这两种实现的性能将不尽相同.
它们便携吗?
它们不能跨编译器移植.它们起源于GCC(据我所知),并且也在其他一些编译器中实现,例如Clang.
支持这些功能的编译器可以为多种架构提供它们,但实现质量(性能)可能会有所不同.
__builtin像这样的函数用于以比使用内联汇编更简单的方式访问特定的机器指令.如果您需要实现最高性能并且愿意牺牲可移植性来执行此操作,或者为未提供这些功能的编译器或平台提供替代实现,那么使用它们是有意义的.如果最佳低级性能是您的目标,您还应检查编译器的汇编输出,以确定它是否真正生成您希望它使用的指令.
| 归档时间: |
|
| 查看次数: |
4145 次 |
| 最近记录: |