12

Programme pour compter les cycles du cortex A8: v0.6

avr
1 Comment » |  Posted by Etienne SOBOLE |  Category:Ccc, Projets

Un compteur de cycle plus complexe

Le fonctionnement de NEON m’a conduit à re-développer le moteur du compteur de cycle. La simulation est à présent plus proche de la réalité, même s’il reste quelques questions auxquelles je n’ai pas trouvé de réponses et sur lesquelles j’ai du faire quelques spéculations.

Le nouveau moteur, est composé de deux étapes:

  • L’analyse du code chargé de trouver les expressions régulières qui correspondent aux instructions
  • Le calcul du temps pris le code

Le fonctionnement en parallèle des unités ARM et NEON a posé quelques problèmes. Dans une boucle lorsque le temps pris par les instructions NEON est supérieur au temps pris par le code ARM, la première itération n’est pas représentative du fonctionnement réel de la boucle puisque l’ARM va envoyer vers la file d’attente NEON les instructions NEON à raison de 2 par cycle sans se soucier du temps qu’elles vont réellement prendre pour s’exécuter. De ce fait, le compteur de cycle n’est pas capable de réellement calculé le temps pris par le code NEON.

Durant l’étape de parsing, j’en ai profité pour détecter les boucles. J’appelle boucle, tout couple label – branchement dont le label précède le branchement.
J’ai ensuite ajouté dans le compteur de cycles des cycles d’attente “virtuels” (c’est à dire n’existant pas réellement dans le Cortex) avant les labels ou les branchements dont le but est d’attendre que le file d’attente de NEON soit vide.
Ces cycles d’attente virtuels sont notifiés par le message : “Wait for NEON & VPf Queue are empty.

Concrètement, cela donne un résultat correct dans la majeure partie des cas.
En attendant que le compteur de cycles soit capable d’exécuter les boucles (la v0.8 peut-être), je n’ai pas trouvé mieux pour indiquer le temps pris par un code NEON.

Le nouveau moteur gère le parallélisme des instructions NEON. Pour le moment, je n’ai pas activé le parallélisme des instructions mémoire tant que je n’ai pas fait de test additionnels.

Enfin, à défaut d’avoir eu le temps de réaliser des tests plus poussés sur VPf, j’ai considéré que VPf fonctionne plus ou moins comme NEON (ce qui est probablement faux).
Les seules différences que j’ai appliquées sont:

  • VPf n’est pas pipeliné et ne peut pas exécuter 2 instructions dans le même cycles.
  • La file d’instruction VPf ne peut contenir qu’une seule instruction.

Sinon, il y a eu quelques petites corrections et évolutions dont voici la liste:

  • Ajout d’un mode de rendu par colonne
  • Correction d’un bug sur les instruction TST, TEQ, CMP, CMN qui ne bloquaient pas le registre de FLAG
  • Correction d’un bug sur l’instruction LDR (et STR) qui ne testait pas la disponibilité du registre d’adresse
  • Ajout de l’instruction ADR
  • Ajout de variantes manquante de VCEQ, VCGE, VCGT, VCLE, VCLT
  • Ajout des instruction VPADD, VPADDL, VPADAL
  • Ajout d’un nombre important de variantes sur les instruction VLDx et VSTx
  • Gestion de différentes syntaxes pour l’alignement mémoire des instructions VLDx et VSTx ([r0:128] et [r0, :128])

Remarque: même si les expressions régulières n’ont pas changés, il est possible que des problèmes précédemment corrigés réapparaissent.
N’hésitez pas à me remonter tout les problème rencontrés.

 | Tags:

One Response to “Programme pour compter les cycles du cortex A8: v0.6”

  1. [...] This post is a translation of « Programme pour compter les cycles du cortex A8: v0.6« . [...]

Répondre

Human control : 2 + 4 =