__builtin_popcountll和_mm_popcnt_u64之间的区别是什么?

时间:2016-06-30 03:02:17

标签: c gcc bitcount

我正在尝试512 MB内存中有多少1个,我在_mm_popcnt_u64()内置版中找到了两种可能的方法__builtin_popcountll()gcc

据说

_mm_popcnt_u64()使用CPU介绍SSE4.2,这似乎是最快的,__builtin_popcountll()除了使用表查找。

所以,我认为__builtin_popcountll()应该比_mm_popcnt_u64()慢一点。

但是我得到了这样的结果:

Test result

两种方法花了几乎相同的时间。我非常怀疑他们用同样的方式工作。

我也在popcntintrin.h

中得到了这个
/* Calculate a number of bits set to 1. */
extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial___))
_mm_popcnt_u32 (unsigned int __X)
{
  return __builtin_popcount (__X);
}

#ifdef __x86_64__
extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_popcnt_u64 (unsigned long long __X)
{
  return __builtin_popcountll (__X);
}
#endif

所以,我对__builtin_popcountll()在地球上的作用感到困惑

2 个答案:

答案 0 :(得分:11)

_mm_popcnt_u64<nmmintrin.h>的一部分,是英特尔针对访问SSE 4.2指令的实用程序功能设计的标题。

__builtin_popcountll是GCC扩展程序。

_mm_popcnt_u64可移植到非GNU编译器,__builtin_popcountll可移植到非SSE-4.2 CPU。但是在两者都可用的系统上,两者都应该编译为完全相同的代码。

答案 1 :(得分:0)

如果编译时没有进行标记,那么默认情况下使用x86_64,内置应该会比较慢,因为它需要在不同体系结构之间分派功能选择。这将不会导致内联和附加条件。