__builtin_popcountll和_mm_popcnt_u64之间有什么区别?

sto*_*liu 8 c gcc bitcount

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

_mm_popcnt_u64()据说使用CPU介绍SSE4.2,这似乎是最快的,并且__builtin_popcountll()不使用表查找.

所以,我认为__builtin_popcountll()应该慢一些_mm_popcnt_u64().

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

测试结果

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

我也得到了这个 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
Run Code Online (Sandbox Code Playgroud)

所以,我很困惑__builtin_popcountll()地球上的作品

小智 11

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

__builtin_popcountll 是GCC扩展.

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