2

以下功能是否在单个时钟周期内执行?

__builtin_popcount
__builtin_ctz
__builtin_clz

同样的ll(64位)版本的时钟周期数是多少。它们是便携式的吗?为什么或者为什么不?

4

2 回答 2

7

这些功能是否在单个时钟周期内执行?

不必要。在可以使用单个指令实现它们的架构上,它们通常是计算该函数的最快方法(但仍不一定是单个时钟周期)。在它们不能作为单个指令实现的架构上,它们的性能不太确定。

在我的处理器(Core 2 Duo)上,__builtin_ctz可以__builtin_clz用一条指令(位扫描正向和位扫描反向)来实现。但是,__builtin_popcount不能用我的处理器上的一条指令来实现。对于__builtin_popcount,gcc 4.7.2 调用一个库函数,而 clang 3.1 生成一个内联指令序列(实现这个bit twiddling hack)。显然,这两种实现的性能是不一样的。

它们是便携式的吗?

它们不能跨编译器移植。它们起源于 GCC(据我所知),并且也在 Clang 等其他一些编译器中实现。

支持这些功能的编译器可能会为多种架构提供它们,但实现质量(性能)可能会有所不同。

__builtin像这样的函数用于以比使用内联汇编更容易的方式访问特定的机器指令。如果您需要实现最高性能并且愿意为此牺牲可移植性,或者为未提供这些功能的编译器或平台提供替代实现,那么使用它们是有意义的。如果最佳低级性能是您的目标,您还应该检查编译器的汇编输出,以确定它是否真的生成了您期望它使用的指令。

于 2012-11-22T18:02:13.233 回答
3

-O3 -march=native -S通过将其编译成汇编代码,您可以初步了解编译器对它的作用。在那里你可以检查这是否只解析为一个汇编语句。如果是这样,这不能保证在一个周期内完成。要知道真正的成本,你必须衡量。

于 2012-11-22T17:56:07.737 回答