如何在我的计算机上启用对POPCNT指令/内在函数的支持?

afa*_*ncy 6 c x86 gcc sse4 population-count

我试图在我的电脑上运行以下程序(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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

[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 ...]
Run Code Online (Sandbox Code Playgroud)

Has*_*kun 15

__builtin_popcount()相反,请使用它不是特定于平台的.


Cor*_*son 12

第一个支持该POPCNT指令的CPU 是英特尔的Nehalem.它看起来像你的Core系列,它更老.Hasturkun的建议适用于您的系统,但将使用多个指令而不是单个指令来实现.

如果您想要一个可移植的解决方案而不是GCC特定的解决方案,请查看Sean Eron Anderson的优秀Bit Twiddling Hacks页面,该页面具有高度优化的代码.

  • 确实.换句话说,"popcnt"被添加为SSE4的一部分(OP的T2370仅支持补充SSE3). (3认同)
  • "POPCNT"与SSE4.2同时被引入,但不是它的一部分.它有自己的`CPUID`位. (3认同)
  • 尽管出现旧学校的危险,但IBM的POWER5已经推出了"POPCNT".http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.alangref/idalangref_popcntbd.htm?lang=it (2认同)
  • @jupp0r:尽管存在出现古老学校的危险,但我在 1970 年代编程的控制数据大型机(例如 CDC 7300)具有 popcount 指令。它适用于 60 位字,并且花费的时间是 ADD 等简单指令的几倍。 (2认同)
  • @BrendanMcKay 你让我明白了:) Cray-1 也可以做 popcnt (1975) (2认同)