[英]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.