Question

Je cherche le meilleur moyen de PopCount sur une grande mémoire tampon de 512 octets ou plus. Je peux vous garantir tout alignement nécessaire, et la taille de la mémoire tampon est toujours une puissance de 2. Les correspond tampons pour bloquer les allocations, donc généralement les bits sont soit tous ensemble, aucun jeu, ou mettre principalement en faveur de la « gauche » du tampon, avec trous occasionnels.

Quelques solutions que j'ai pris en compte sont les suivants:

Je suis intéressé par la solution la plus rapide, il faut travailler sur 32bit chipset x86 appartenant à Core2 ou plus récent. SSE et SIMD sont d'un grand intérêt. Je vais tester sur le CPU quad core suivant:

matt@stanley:~/anacrolix/public/stackoverflow$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 1600.000
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
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 vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority
bogomips        : 4800.21
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:
Était-ce utile?

La solution 3

Je présente les meilleurs C / assemblage des fonctions que j'ai trouvé pour de grande des tampons ci-dessous.

Le plus rapide est fonction assemblage ssse3_popcount3 , décrit ici . Il nécessite SSSE3 , disponible sur Intel Core 2 et plus tard, et les chipsets AMD arriver en 2011. Il utilise SIMD instructions à PopCount dans 16 blocs d'octets et déroule 4 itérations de boucle à la fois.

Le plus rapide de la fonction C est popcount_24words , décrit ici . Il utilise l'algorithme de découpage en tranches de bits. Il est à noter que je trouve que clang pourrait effectivement générer des instructions d'assemblage antivectorielle, qui ont donné des gains de performances impressionnantes. Ceci mis à part, l'algorithme est encore extrêmement rapide.

Autres conseils

Voir une version 32 bits dans le Guide de AMD Software Optimization , la page 195 pour une mise en œuvre. Cela vous donne du code assembleur pour un x86 directement.

Voir une variante à Stanford bit-hacks tripotant Les regards version Stanford aiment le meilleur pour moi. Il est très facile à coder comme x86 asm.

Aucune de ces instructions de branchement d'utilisation.

peuvent être généralisées à versions 64 bits.

Avec les 32 ou les versions 64 bits, vous pourriez envisager de faire une version SIMD. SSE2 fera 4 doubles mots ou deux quadwords (soit 128 bits façon) immediatement. Ce que vous voulez faire est de mettre en œuvre le PopCount 32 ou 64 bits dans chacun des 2 ou 4 entrées disponibles. Vous vous retrouverez avec 2 ou 4 ensembles de popcounts dans les registres XMM quand tu as fini; étape finale consiste à stocker et ajouter les popcounts ensemble pour obtenir la réponse finale. Devinant, Je vous attends le faites faire un peu mieux 4 parallèle 32 bit popcounts plutôt que 2 popcounts de bits parallèles 64, comme celle-ci est susceptible de prendre 1 ou 2 instructions supplémentaires à chaque itération, et il est facile d'ajouter 4, des valeurs 32 bits ensemble la fin.

Je suggère la mise en œuvre l'un des 32 bits optimisés routines POPCNT de Hacker , mais le faire pour 4 x 32 bits entier éléments dans un vecteur SSE. Vous pouvez ensuite traiter 128 bits par itération, qui devrait vous donner un débit d'environ 4 x par rapport à une optimisation de routine scalaire 32 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top