7

我试图在我的电脑(Fedora 17 32bit)上运行以下程序。如何使我的系统支持popcnt快速人口计数指令?

#include <stdio.h>
#include <nmmintrin.h>

int main(void)
{
    int pop = _mm_popcnt_u32(0xf0f0f0f0ULL);
    printf("pop = %d\n", pop);
    return 0;
}

我编译了程序并运行它,但得到以下异常:

[xiliu@xiliu tmp]$ gcc -Wall -march=corei7 -m32 -msse4.2 popcnt.c -o popcnt
[xiliu@xiliu tmp]$ ./popcnt 
Illegal instruction (core dumped)

以下是我的处理器的信息:

[xiliu@xiliu tmp]$ cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 15
model name  : Intel(R) Pentium(R) Dual  CPU  T2370  @ 1.73GHz
stepping    : 13
microcode   : 0xa4
cpu MHz     : 800.000
cache size  : 1024 KB
physical id : 0
siblings    : 2
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fdiv_bug    : no
hlt_bug     : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 10
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm
bogomips    : 3458.20
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

[... repeated for 2nd core ...]
4

3 回答 3

15

改为使用__builtin_popcount(),它不是特定于平台的。

于 2012-11-11T15:11:45.130 回答
12

第一个支持该POPCNT指令的 CPU 是 Intel 的 Nehalem。看起来您的属于较旧的 Core 系列。Hasturkun 的建议将适用于您的系统,但将通过多个指令而不是单个指令来实施。

如果您想要一个可移植的解决方案而不是特定于 GCC 的解决方案,请查看 Sean Eron Anderson 出色的Bit Twiddling Hacks页面,该页面为此提供了高度优化的代码。

于 2012-11-11T15:18:36.513 回答
1

你的 CPU 不支持POPCNT。(请参阅https://en.wikipedia.org/wiki/SSE4)但是您可以使用这个免费的开源工具来检测它是否受支持: https ://github.com/mgorny/cpuid2cpuflags

例如,它返回 Intel Core i7-3770

CPU_FLAGS_X86: aes avx f16c mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3
于 2017-12-06T02:27:39.083 回答