Avatar ·

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