2010-12-05 59 views
0

Programmation du ARM11MP VFPU, je l'ai regardé sur les documents et je suis préoccupé par le suivant calera mal lorsque vous faites un produit point 4 composants (dans le cadre d'une multiplication de matrice 4x4)Le jeu d'instructions ARM suivant génère-t-il des décrochages?


    fmuls s0, s0, s4 
    fmacs s0, s1, s5 
    fmacs s0, s2, s6 
    fmacs s0, s3, s7 

Est-ce que accumuate étape générer des stands ici? Si c'est le cas, je vais devoir vraiment changer de truc car je n'ai que 32 registres individuels avec lesquels travailler, et j'en prends 9 comme ça. Aussi, je pourrais installer le registre de vecteur pour faire ceci en 1 instruction, mais je me demande si les 3 cycles d'instruction le valent car je devrais le désactiver presque immédiatement pour un magasin en mémoire à moins que je déborde aux registres ARM . Poster de la maison sans mon vrai compte SO ici ...

+1

Est-ce que vous craignez que la multiplication de 's1' et' s5' ne puisse pas commencer tant que l'ajout précédent de 's0' n'est pas terminé? – Gabe

+0

Corriger, ou s2, s6 avec le s0 accumuler ou ... –

Répondre

1

Je ne suis pas du tout familier avec ARM, donc vous devriez prendre cela avec un grain de sel. Cette réponse est juste basée sur environ 20 minutes de recherche autour de la documentation sur mon téléphone. Il pourrait y avoir certaines choses qui me manquent, donc ceci peut ne pas être correct.

Dans tous les cas, je crois que oui, cela devrait causer des arrêts de pipeline. Le coprocesseur VFP a un pipeline à 8 étages, mais en raison du "transfert" (chaque instruction dépend du résultat de l'instruction précédente), le nombre de cycles bloqués doit être réduit à 7 pour chaque instruction. Pourtant, compte tenu des 4 instructions que vous avez, vous seriez bloqué pour environ 28 cycles, ce qui n'est pas très bon. Cela ne tient pas non plus compte du temps requis pour charger les registres, ce qui pourrait exacerber le problème.

Vous pouvez probablement améliorer les performances en intercalant les "instructions fld" avec les instructions fmacs.

consultez les liens suivants pour plus d'informations:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACBBDCE.html

Les résultats d'une instruction "FLD" devrait être disponible dans les 4 cycles, ce qui signifie que si vous pouvez faire quelque chose comme:

fld s0 
fld s4 
fld s1 
fld s5 
fmuls s0, s0, s4 
fld s2 
fld s6 
fld s3 
fld s7 
fmacs s0, s1, s5 
famcs s0, s2, s6 
fmacs s0, s3, s7 

Ensuite, vous pourriez réduire le nombre total de cycles bloqués à 17.

En supposant que vous faites cela en boucle, vous co Probablement en réduisant davantage le décrochage en essayant de commencer à travailler sur la "prochaine" boucle d'itération pendant que l'itération en cours s'exécute (c.-à-d. boucle déroulant). En outre, en fonction de la manière dont vos données sont stockées, une fois que vous avez déroulé la boucle, vous pouvez probablement améliorer encore plus les choses en utilisant fldm au lieu des instructions fld.

Dans tous les cas, il est difficile d'optimiser manuellement le comportement de la conduite. Y a-t-il une raison pour laquelle vous ne pouvez pas laisser le compilateur faire la programmation d'instruction pour vous?

+0

Parce que le compilateur ARM que j'ai pue à elle et cette fonction est un hit de performance 3 haut dans les applications que je cours comme indiqué par le profilage. Je vais regarder plus loin dans le sujet pour être sûr, mais il semble que ce soit exactement le genre de chose que mla/fmac a été conçu pour faire et bloquer. Je vais envisager de rompre le pas d'addition des multiplications puis d'utiliser un registre séparé pour l'accumulation. Avec un peu de soin, je peux probablement le réduire encore plus. Encore faut-il étudier la vectorisation, car le compilateur ARM n'essaiera même pas de le faire. –