簡體   English   中英

__builtin_popcountll 和_mm_popcnt_u64 有什么區別?

[英]what's the difference between __builtin_popcountll and_mm_popcnt_u64?

我試圖在 512MB 內存中有多少個 1,我在gcc內置_mm_popcnt_u64()找到了兩種可能的方法, _mm_popcnt_u64()__builtin_popcountll()

_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

所以,我很困惑__builtin_popcountll()在地球上是如何工作的

_mm_popcnt_u64<nmmintrin.h>一部分,這是英特爾為訪問 SSE 4.2 指令的實用函數設計的頭文件。

__builtin_popcountll是 GCC 擴展。

_mm_popcnt_u64可移植到非 GNU 編譯器,而__builtin_popcountll可移植到非 SSE-4.2 CPU。 但是在兩者都可用的系統上,兩者都應該編譯為完全相同的代碼。

如果你編譯時沒有進行 March 標志,那么在 x86_64 默認情況下,builtin 應該會更慢,因為它需要在不同的體系結構之間分派函數選擇。 這將導致沒有內聯和附加條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM