Comment activer le support pour les POPCNT instruction / intrinsèque sur mon ordinateur?
J'ai essayé d'exécuter le programme suivant dans mon ordinateur (Fedora 17 32 bits). Comment puis-je activer mon système de soutien du popcnt
instruction rapide de la population?
#include <stdio.h>
#include <nmmintrin.h>
int main(void)
{
int pop = _mm_popcnt_u32(0xf0f0f0f0ULL);
printf("pop = %d\n", pop);
return 0;
}
J'ai compilé le programme et l'exécuter, mais j'ai reçu l'exception suivante:
[xiliu@xiliu tmp]$ gcc -Wall -march=corei7 -m32 -msse4.2 popcnt.c -o popcnt
[xiliu@xiliu tmp]$ ./popcnt
Illegal instruction (core dumped)
Ce qui suit est l'information de mon processeur:
[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 ...]
C'est un mauvais exemple; si vous compiler avec gcc avec l'optimisation activée, il ne sera pas un
popcnt
instruction dans le binaire, parce que la constante de propagation va le transformer en mov esi, 16
(godbolt.org/z/h5ObTj). MSVC échoue, mais, et émet tout de même une popcnt instruction.OriginalL'auteur afancy | 2012-11-11
Vous devez vous connecter pour publier un commentaire.
Utilisation
__builtin_popcount()
au lieu de cela, Il n'est pas spécifique à une plateforme.OriginalL'auteur Hasturkun
Le premier PROCESSEUR à l'appui de la
POPCNT
instruction, Intel Nehalem. Il ressemble à la vôtre est de la ligne de Base, ce qui est plus âgé. Hasturkun la suggestion fonctionne sur votre système, mais sera mis en œuvre avec des instructions multiples au lieu d'un seul.Si vous voulez une solution portable plutôt qu'un GCC-spécifique, découvrez Sean Eron Anderson excellent Peu Se Tourner Les Hacks page, qui a hautement optimisé le code pour cela.
popcnt
a été ajouté dans le cadre de SSE4 (et les OP T2370 prend uniquement en charge complémentaire SSE3).POPCNT
a été introduit en même temps que SSE4.2, mais n'est pas partie. Il a son propreCPUID
peu.Malgré le danger de l'apparition de la vieille école, Ibm POWER5 déjà présenté
POPCNT
. www-01.ibm.com/support/knowledgecenter/ssw_aix_71/...Malgré le risque d'apparition de cette ANCIENNE école, les Données de Contrôle des mainframes comme la CDC 7300 que j'ai utilisé au programme dans les années 1970, avait un popcount instruction. Il a travaillé sur 60 bits des mots et a pris plusieurs fois plus longtemps que des instructions simples comme AJOUTER.
tu m'as là 🙂 Le Cray-1 pourrait également faire popcnt (1975)
OriginalL'auteur Cory Nelson
Votre CPU ne prend pas en charge
POPCNT
. (voir https://en.wikipedia.org/wiki/SSE4)Mais vous pouvez utiliser ce programme gratuit et open source de l'outil, afin de détecter s'il est pris en charge:
https://github.com/mgorny/cpuid2cpuflags
Qu'elle renvoie pour Intel Core i7-3770 par exemple
OriginalL'auteur Jonas Stein