GCC __builtin_函数

时间:2012-11-22 17:01:26

标签: c++ c gcc

以下功能是在一个时钟周期内执行的吗?

__builtin_popcount
__builtin_ctz
__builtin_clz

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

2 个答案:

答案 0 :(得分:6)

这些功能是在一个时钟周期内执行的吗?

不一定。在可以使用单个指令实现它们的体系结构中,它们通常是计算该功能的最快方式(但仍然不一定是单个时钟周期)。在无法将其作为单个指令实现的体系结构中,它们的性能不太确定。

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

可移植吗?

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

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

像这样的

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

答案 1 :(得分:3)

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