我在一款Windows C应用程序中频繁使用汉明重量(population count)函数,并需要尽可能地优化它以提高性能。我使用该函数的超过一半情况下,只需要知道最大值为15。该软件将在各种处理器上运行,包括新老处理器。当Intel的SSE4.2或AMD的SSE4a存在时,我已经利用了POPCNT指令,但希望尽可能地优化软件实现(作为后备,如果没有SSE4)。
目前,我在64位(平台)模式下拥有以下函数的软件实现:
目前,我在64位(平台)模式下拥有以下函数的软件实现:
int population_count64(unsigned __int64 w) {
w -= (w >> 1) & 0x5555555555555555ULL;
w = (w & 0x3333333333333333ULL) + ((w >> 2) & 0x3333333333333333ULL);
w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
return int((w * 0x0101010101010101ULL) >> 56);
}
总结一下:
(1) 我想知道是否有可能在我只需要最大值为15的情况下对其进行优化。
(2) 是否有比上述函数更快的软件实现(适用于Intel和AMD CPU的无符号64位整数)?
return int(w * 0x0101010101010101ULL) >> 56
会过早地将乘法的结果截断为int
,而int
可能只有32位宽。 - j_random_hacker