83 votes

C code de la performance de la boucle [suite]

Cette question continue sur ma question ici (sur les conseils de Mystique):

C code de la performance de la boucle de


Continuant sur ma question, quand j'utilise les paniers des instructions au lieu de scalaire instructions le code à l'aide de intrinsèques serait très proche:

for(int i=0; i<size; i+=16) {
    y1 = _mm_load_ps(output[i]);
    …
    y4 = _mm_load_ps(output[i+12]);

    for(k=0; k<ksize; k++){
        for(l=0; l<ksize; l++){
            w  = _mm_set_ps1(weight[i+k+l]);

            x1 = _mm_load_ps(input[i+k+l]);
            y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
            …
            x4 = _mm_load_ps(input[i+k+l+12]);
            y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
        }
    }
    _mm_store_ps(&output[i],y1);
    …
    _mm_store_ps(&output[i+12],y4);
    }

Les performances mesurées de ce noyau est d'environ 5,6 FP opérations par cycle, bien que je m'attends à ce qu'il soit exactement 4 fois les performances de la version scalaire, c'est à dire 4.1,6=6,4 FP ops par cycle.

En prenant le déplacement du poids du facteur en compte (merci pour cette remarque), le programme ressemble à:

schedule

Il ressemble à l'horaire ne change pas, même si il ya un supplément d'instruction après l' movss opération qui se déplace le scalaire de la valeur de poids pour le XMM registre et l'utilise ensuite shufps pour copier cette valeur scalaire dans l'ensemble du vecteur. Il semble que le poids de vecteur est prêt à être utilisé pour l' mulps de temps en prenant la latence de commutation de charge pour le domaine de virgule flottante en compte, donc il ne devrait pas encourir aucune latence supplémentaire.

L' movaps (aligné, paniers déplacer),addps & mulps instructions qui sont utilisés dans cette noyau (vérifié avec le code d'assemblée) ont le même temps de latence et de débit comme leur scalaire versions, donc il ne devrait pas encourir aucune latence supplémentaire.

Quelqu'un at-il une idée d'où cela supplémentaires cycle par 8 cycles est dépensé, en supposant que le maximum de la performance de ce noyau peut obtenir est de 6.4 FP ops par cycle et il est en cours d'exécution à 5.6 PF ops par cycle?

Merci à l'avance!


Au passage voici ce que les effectifs de l'assemblée ressemble:

…
Block x: 
  movapsx  (%rax,%rcx,4), %xmm0
  movapsx  0x10(%rax,%rcx,4), %xmm1
  movapsx  0x20(%rax,%rcx,4), %xmm2
  movapsx  0x30(%rax,%rcx,4), %xmm3
  movssl  (%rdx,%rcx,4), %xmm4
  inc %rcx
  shufps $0x0, %xmm4, %xmm4               {fill weight vector}
  cmp $0x32, %rcx 
  mulps %xmm4, %xmm0 
  mulps %xmm4, %xmm1
  mulps %xmm4, %xmm2 
  mulps %xmm3, %xmm4
  addps %xmm0, %xmm5 
  addps %xmm1, %xmm6 
  addps %xmm2, %xmm7 
  addps %xmm4, %xmm8 
  jl 0x401ad6 <Block x> 
…

3voto

Krazy Glew Points 2142

Essayez d'utiliser EMON profilage dans Vtune, ou l'équivalent de l'outil comme oprof

EMON (Surveillance des Événements) profilage => comme un temps en fonction de l'outil, mais il peut vous dire quelles sont les performances de l'événement est à l'origine du problème. Même si, vous devriez commencer avec le temps, en fonction du profil d'abord, pour voir si il y a une instruction particulière qui saute. (Et, éventuellement, les événements liés à que vous dire combien de fois il y avait une retraite de décrochage à l'IP.)

Pour utiliser EMON profilage, vous devez exécuter une liste d'événements, allant de "usual suspects" ...

Ici, je voudrais commencer avec le cache, l'alignement. Je ne sais pas si le processeur que vous utilisez a un compteur pour RF port limitations - il - mais j'ai ajouté EMON profilage il y a longtemps, et je ne sais pas comment ils sont en gardant en ajoutant des événements appropriés pour la microarchitecture.

Il peut également être possible que c'est un front-end, l'instruction fetch, à l'étal. Combien d'octets sont dans ces instructions, de toute façon? Il y a EMON événements pour que, trop.


Répondre au commentaire que Nehalem VTune ne pouvez pas voir L3 événements: pas vrai. Ici sont des choses que j'ai été l'ajout de commentaire, mais ne répondait pas:

En fait, il y a des compteurs de performances pour le LL3 / L3$ / soi-disant non nominal. Je serais extrêmement surpris si VTune ne les supporte pas. Voir http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf points de VTune et d'autres outils tels que le PTU. En fait, même sans LL3 événements, comme David Levinthal dit: "le processeur Intel® Core™ i7 processeur a un "temps de latence de l'événement", qui est très similaire à l'Itanium® de la Famille de processeurs de Données de l'OREILLE de l'événement. Cet événement échantillons des charges, de l'enregistrement, le nombre de cycles entre l'exécution de l'instruction et de l'effectif fournir des données. Si la valeur mesurée de la latence est plus grand que le minimum de latence programmé dans MSR 0x3f6, les bits 15:0, alors le compteur est incrémenté. Compteur débordement de bras le PEBS mécanisme et sur le prochain événement satisfaisant à la latence seuil, la mesure de la latence, le virtuel ou linéaire de l'adresse et de la source de données sont copié dans 3 autres registres dans le PEBS tampon. Parce que l'adresse virtuelle est capturé dans un emplacement connu, l'échantillonnage conducteur peut également exécuter une virtuel à physique de la traduction et de capturer l'adresse physique. L'adresse physique identifie l' NUMA domicile et, en principe, permet une analyse des détails de la mémoire cache occupation." Il souligne également, à la page 35, VTune des événements tels que L3 CACHE_HIT_UNCORE_HIT et L3 CACHE_MISS_REMOTE_DRAM. Parfois, vous avez besoin de chercher des codes numériques et le programme en VTune du niveau inférieur de l'interface, mais je pense que dans ce cas, il est visible dans la jolie interface utilisateur.


OK, dans http://software.intel.com/en-us/forums/showthread.php?t=77700&o=d&s=lr un VTune programmeur en Russie (je pense) "explique" que vous ne pouvez pas d'un exemple non nominal des événements.

Il est le problème - vous pouvez, par exemple, permettre à un seul PROCESSEUR, et de l'échantillon de façon significative. Je crois également qu'il est la capacité de marquer L3 données manquantes, de retour à la CPU. En fait, dans l'ensemble, le L3 sait quel est le PROCESSEUR c'est le retour de données, de sorte que vous pouvez certainement l'échantillon. Vous ne pouvez pas savoir qui hyperthread, mais encore une fois, vous pouvez le désactiver, allez dans un seul thread de mode.

Mais il semble que, comme c'est plutôt commun, vous avez à travailler AUTOUR de VTune, pas avec elle, pour ce faire.

Essayez de latence de profilage en premier. C'est entièrement à l'intérieur de la CPU, et la VTune les gens sont peu susceptibles d'avoir tout gâché trop.

Et, je le répète, la probabilité est que votre problème est dans le cœur, pas dans L3. Donc, VTune devrait bne capable de gérer cela.


Essayez le "Cycle de la Comptabilité" par Levinthal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X