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

如何在我的计算机上启用对POPCNT指令/内部命令的支持?,c,gcc,x86,sse4,population-count,C,Gcc,X86,Sse4,Population Count,我尝试在我的计算机上运行以下程序(Fedora1732位)。如何使我的系统支持快速人口计数的popcnt指令 #包括 #包括 内部主(空) { int pop=_mm_popcnt_u32(0xf0ull); printf(“pop=%d\n”,pop); 返回0; } 我编译并运行了该程序,但出现以下异常: [xiliu@xiliu tmp]$ gcc -Wall -march=corei7 -m32 -msse4.2 popcnt.c -o popcnt [xiliu@xiliu tmp]

我尝试在我的计算机上运行以下程序(Fedora1732位)。如何使我的系统支持快速人口计数的
popcnt
指令

#包括
#包括
内部主(空)
{
int pop=_mm_popcnt_u32(0xf0ull);
printf(“pop=%d\n”,pop);
返回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 ...]

相反,它不是特定于平台的。

第一个支持
POPCNT
指令的CPU是Intel的Nehalem。看起来你的是旧的核心产品线。Hasturkun的建议将适用于您的系统,但将通过多个指令而不是单个指令来实现


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

您的CPU不支持
POPCNT
。(见附件) 但您可以使用此免费开源工具来检测是否支持:

例如,它返回Intel Core i7-3770

CPU_FLAGS_X86: aes avx f16c mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3

的确措辞不同,
popcnt
作为SSE4的一部分添加(OP的T2370仅支持补充SSE3)。
popcnt
与SSE4.2同时引入,但不是其一部分。它有自己的
CPUID
位。尽管有显得老派的危险,ibmspower5已经具备了
POPCNT
@jupp0r:尽管看起来像是古老的学校,但我在20世纪70年代用来编程的控制数据大型机(如CDC7300)有一条popcount指令。它可以处理60位的单词,花费的时间比简单的指令(如ADD)长好几倍。@Brendanmakay你把我带到那里:)Cray-1也可以处理popcnt(1975年)。这是一个非常糟糕的例子;如果使用启用了优化的gcc进行编译,二进制文件中将不会有
popcnt
指令,因为不断传播会将其转换为
movesi,16
()。但是,MSVC失败,仍然发出popcnt指令。