将32位循环计数器替换为64位导致Intel CPU上_mm_popcnt_u64出现奇怪的性能下降
大家好!我正在用C++编写一个程序,用于计算大数据数组中1的位数。我使用了SSE4.2中的内置intrinsic函数_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();
std::cout <