7

私は自分のコンピューター(Fedora 17 32ビット)で次のプログラムを実行しようとしました。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

この命令をサポートした最初のCPUは、 POPCNTIntelのNehalemでした。古いコアラインのもののようです。Hasturkunの提案はシステムで機能しますが、単一の命令ではなく複数の命令で実装されます。

GCC固有のソリューションではなく、ポータブルソリューションが必要な場合は、SeanEronAndersonの優れたBitTwiddlingHacksページを確認してください。このページには、このために高度に最適化されたコードがあります。

于 2012-11-11T15:18:36.513 に答える
1

お使いのCPUはをサポートしていませんPOPCNT。(https://en.wikipedia.org/wiki/SSE4を参照)ただし、この無料のオープンソースツールを使用して、サポートされているかどうかを検出できます: https ://github.com/mgorny/cpuid2cpuflags

たとえば、IntelCorei7-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 に答える