32-बिट लूप काउंटर को 64-बिट से बदलने पर Intel CPU पर _mm_popcnt_u64 के साथ अजीब प्रदर्शन गिरावट
सभी को नमस्ते! मैं बड़े डेटा ऐरे में बिट्स की गिनती के लिए C++ प्रोग्राम लिख रहा हूँ। मैं SSE4.2 सेट से इनबिल्ट इंट्रिन्सिक _mm_popcnt_u64 का उपयोग कर रहा हूँ। कोड सरल है: मैं uint64_t ऐरे पर लूप चलाता हूँ और परिणाम जमा करता हूँ।
सब कुछ ठीक काम करता है, लेकिन मैंने एक अजीब चीज़ देखी: यदि मैं लूप काउंटर के प्रकार को 32-बिट (unsigned int) से 64-बिट (size_t) में बदलता हूँ, तो प्रदर्शन 2-3 गुना गिर जाता है! जबकि डेटा वही है, ऐरे का आकार वही है, कंपाइलर वही है (MSVC 2019, फ्लैग /O2 /arch:AVX2)।
यहाँ सरलीकृत कोड है:
#include
#include
#include
#include
int main() {
const size_t N = 1'000'000;
std::vector data(N, 0xFFFFFFFFFFFFFFFF); // सभी बिट्स = 1
// संस्करण 1: 32-बिट काउंटर
unsigned int sum32 = 0;
auto t1 = std::chrono::high_resolution_clock::now();
for (unsigned int i = 0; i < data.size(); ++i) {
sum32 += _mm_popcnt_u64(data[i]);
}
auto t2 = std::chrono::high_resolution_clock::now();
}