32-बिट लूप काउंटर को 64-बिट से बदलने पर Intel CPU पर _mm_popcnt_u64 के साथ अजीब प्रदर्शन उछाल
सभी को नमस्कार! मैं 64-बिट पूर्णांकों की एक बड़ी सरणी में एकल बिट्स (popcount) गिनने के लिए एक उच्च-प्रदर्शन फ़ंक्शन लिख रहा हूँ। मैं SSE4.2 से इंट्रिन्सिक `_mm_popcnt_u64` का उपयोग कर रहा हूँ। कोड सरल है — एक लूप जो प्रत्येक तत्व के लिए popcount जोड़ता है।
मैंने एक अजीब व्यवहार पाया: यदि लूप वेरिएबल को `uint32_t` घोषित किया जाए, तो फ़ंक्शन बहुत तेज़ चलता है। लेकिन इसे `uint64_t` में बदलने पर (बस `i` का प्रकार बदलकर), प्रदर्शन लगभग आधा हो जाता है! मैंने कई Intel Core i7 (Sandy Bridge, Haswell, Skylake) पर जाँच की — प्रभाव दोहराया जाता है। कंपाइलर MSVC 2010 है, हालाँकि GCC 4.6.3 पर भी ऐसी ही स्थिति है। ऑप्टिमाइज़ेशन चालू हैं (/O2 या -O2)।
यहाँ कोड का न्यूनतम उदाहरण है:
```cpp
#include
#include
#include
#include
// 32-बिट काउंटर के साथ तेज़ संस्करण
uint64_t popcnt32(const uint64_t* data, size_t size) {
uint64_t result = 0;
for (uint32_t i = 0; i < size; ++i) { // <-- 32-bit
result += _mm_popcnt_u64(data[i