1
votes

comment les instructions sont récupérées dans les processeurs cortex M

Autant que je sache, les processeurs Cortex M0 / M3 n'ont qu'un seul espace mémoire qui contient des instructions et des données et que l'accès se fait uniquement via l'interface du bus mémoire. Ainsi, si je comprends bien, à chaque cycle d'horloge, le processeur doit lire une nouvelle instruction pour entrer dans le pipeline, mais cela signifie que le bus sera toujours occupé à lire les instructions afin de savoir comment les données peuvent être lues simultanément (pour charger des instructions de mot / stocker des instructions de mot pour exemple)? De plus, quelle est la latence de lecture d'une instruction à partir de la mémoire? car s'il ne s'agit pas d'un seul cycle, alors le processeur doit constamment s'arrêter jusqu'à ce que l'instruction suivante soit récupérée, alors comment est-elle gérée?

Merci


2 commentaires

à chaque cycle d'horloge, le tuyau veut une nouvelle instruction vs a besoin d'une nouvelle instruction. comme avec n'importe quel processeur en pipeline, le processeur se bloque parce que nous ne pouvons pas le nourrir, les mcus ont moins de "trucs" autour d'eux qu'un plus gros, donc on s'attend à ce qu'ils stagnent beaucoup plus.


Un espace mémoire n'implique pas un bus et donc un conflit de bus. Et un "bus" dans le monde ARM n'est pas un bus ... Avant qu'il ne quitte l'IP ARM, il se termine par plusieurs bus avec plusieurs bus dans chaque bus. Il se retrouve ensuite entre les mains du fournisseur de puces pour savoir comment ils séparent ou fusionnent parfois les bus dans leur produit.


3 Réponses :


0
votes

Ce que vous avez décrit est connu comme le «goulot d'étranglement de von Neumann», et dans les machines avec une architecture pure de von Neumann avec des données partagées et de la mémoire programme, les accès sont généralement entrelacés. Cependant, vous voudrez peut-être consulter l '«architecture Harvard modifiée», car c'est essentiellement ce qui est utilisé ici. Le stockage de support est partagé comme dans une machine von Neumann, mais les chemins de récupération des instructions et des données sont séparés comme dans une machine de Harvard et, de manière cruciale, ils ont des caches séparés. Donc, si une instruction ou une récupération de données entraîne un accès au cache, une récupération de mémoire n'a pas lieu et il n'y a pas de goulot d'étranglement.

La deuxième partie de votre question n'a pas beaucoup de sens, je le crains, car cela n'a pas de sens de parler des temps de récupération des instructions en termes de cycles d'instruction. Par définition, si une extraction d'instruction est retardée pour une raison quelconque, l'exécution de cette instruction (et des instructions suivantes) doit être retardée. En règle générale, cela se fait en insérant des NOP dans le pipeline jusqu'à ce que l'instruction suivante soit prête (appelée «bullage» du pipeline).


12 commentaires

Il est certainement significatif de parler de latence de récupération des instructions. Cela fait partie de la latence des branches: des cycles jusqu'à ce que des octets d'instructions utiles arrivent après qu'une branche change de PC. (Sans prédiction de branche, AFAIK ne tente pas de cacher cette latence dans un simple pipeline comme Cortex-M3. C'est ce qui fait que les branches prises coûtent des cycles supplémentaires.)


ce n'est pas vraiment harvard, ce qui est évident, ils peuvent avoir plusieurs transactions et types de transactions en même temps sur le même bus et je pense qu'ils veulent utiliser le nom harvard là-dessus. Il s'agit d'un goulot d'étranglement de bus indépendant des étiquettes que les gens veulent utiliser. Et pour un certain nombre de ces implémentations cortex-m, le flash est à la moitié de la vitesse d'horloge du processeur, de sorte que le processeur passe beaucoup de temps à attendre. pour ne pas mentionner comme documenté les récupérations sont soit des demi-mots ou des mots et sur certains noyaux déterminés au moment de la compilation (du noyau).


st a une chose de cache avec un nom sophistiqué qui aide à approcher l'état d'attente zéro, les plus grands numérotés (m4, m7) ont des caches i optionnels pour aider même si le fournisseur de puces ne le fait pas. Mais ce n'est pas comme les bras de grande taille de grand frère / sœur où 4, 8 ou plus d'instructions sont récupérées en une seule transaction.


les documents amba / axi / ahb / apb sont disponibles et les schémas de principe montrent ce qui va où, ce n'est pas tellement harvard (harvard est vraiment une notion académique, vous ne pouvez pas avoir un produit pratique qui est vraiment harvard sans lien entre I et D ), les cortex-ms ont plusieurs bus et les perpherals sont suspendus à certains et enfoncent et clignotent sur d'autres. Pas harvard, juste plusieurs bus, comme nous l'avons fait avec une implémentation von Neumann.


@PeterCordes D'accord, il est significatif de parler de latence de récupération d'instructions bien sûr. Mais l'OP semblait s'embrouiller en essayant de penser à la latence en termes d'un certain nombre d' instructions plutôt que d'un certain nombre de cycles d'horloge, et c'est ce que je suggérais sans signification.


@old_timer Que vous aimiez la terminologie ou non, «Harvard modifié» est un surnom très courant pour l'approche «mécanismes d'extraction séparés, probablement des caches séparés, un espace mémoire» qui est presque omniprésente de nos jours.


@cooperised: La question n'utilise pas le terme "cycles d'instructions". Je pense que la question a du sens si vous interprétez chaque utilisation de «cycles» comme des «cycles d'horloge», et je ne vois pas d'implication du contexte qui entre en conflit avec cela. La seule hypothèse éventuellement invalide est que l'extraction d'instructions se produit en termes d'instructions uniques, au lieu de mots alignés. Sur les machines avec un bus 32 bits, Fetch peut extraire deux instructions de pouce en un seul cycle.


Mais la latence entre la demande et la réception des données est toujours une chose à moins qu'il n'y ait un tampon de prélecture. (Ce qui, pour des raisons évidentes, entraîne un goulot d'étranglement sur la récupération de la bande passante, pas de latence, dans le code sans branchement, et laisse les cycles libres pour l'accès aux données sans caler autant, au cas où le code s'exécute à partir de la même mémoire physique que la charge ou boutique.)


@cooperised modifié harvard est indiscernable de von Neumann modifié, mais le marketing ne choisira jamais qu'un terme en raison de la notion perçue d'un terme sur l'autre basée uniquement sur quelques minutes dans une salle de classe un jour plutôt que sur les réalités de la conception du processeur et la mise en œuvre de la puce. La salle de classe couvre à peine les bases à ce sujet et à peu près tous les autres sujets liés au processeur (tubes, caches, prélecture, etc.). Et cela conduit à des questions comme celle-ci et aux entreprises qui, au lieu de choisir d'éduquer et d'être exactes, essaient plutôt d'attirer les clients en modifiant les termes.


Le plus gros problème est que ces termes sont mentionnés à tous pour une raison quelconque en dehors d'une salle de classe, cela pose des problèmes et non des solutions. Cette question et ses réalités ont à voir avec les pipelines et l'espace d'adressage et encore une fois les limites des manuels et des salles de classe. Les processeurs à usage général ne peuvent pas maintenir le tuyau alimenté, même avec toutes les astuces, il se bloque simplement parce qu'il ne peut pas obtenir d'instructions à temps. Période, fin d'histoire, taille réelle ou taille mcu. Cela a été le cas depuis la création des noyaux pipelined.


Des noyaux spécialisés, non vendus comme IP, bien sûr, ont vu que vous pouvez garder ce tuyau alimenté (tant qu'il n'y a pas d'accès périphériques, et qu'il existe des moyens de travailler dessus). cela n'a rien à voir avec von Neumann, cela a à voir avec le fait d'être une architecture en pipeline et les choix des fournisseurs de puces avec les cœurs qu'ils créent et / ou achètent et comment ils implémentent leur conception de puce.


@PeterCordes Très bien - ce n'est pas ainsi que je lis la question mais je comprends votre interprétation.



0
votes

re: partie 2: L'extraction d'instructions peut être pipelinée pour masquer une partie / la totalité de la latence d'extraction. Cortex-M3 a une unité de prélecture avec un FIFO de 3 mots. https://developer.arm.com/documentation/ddi0337/e/introduction/prefetch-unit (Cela peut contenir jusqu'à six instructions Thumb 16 bits.)

Ce tampon peut également fournir des instructions pendant le chargement / stockage des données, dans une configuration où celles-ci se font concurrence (pas de bus partagé Harvard, et sans cache de données ou d'instructions).

Cette prélecture est bien entendu spéculative ; jeté sur les branches. (C'est simple et suffisamment petit pour ne pas valoir la peine de faire une prédiction de branche pour essayer de récupérer au bon endroit avant que le décodage ne sache même que le flux d'instructions à venir contient une branche.)


0 commentaires

1
votes

Oui c'est comme ça que ça se passe, le processeur cale beaucoup, cela se passe aussi bien avec les gros processeurs que les petits, difficile au mieux d'alimenter un processeur en pipeline (bien que certains de ces tuyaux soient peu profonds sur cortex-ms, mais néanmoins pipelined).

La plupart des pièces que j'ai utilisées et que j'ai touchées à la plupart des fournisseurs, le flash est à la demi-vitesse d'horloge du noyau, donc même à zéro état d'attente, vous ne pouvez obtenir une instruction qu'une horloge sur deux (en moyenne naturellement avec des frais généraux intégrés ) si vous récupérez un demi-mot à la fois, si vous récupérez un mot à la fois que la plupart des cœurs offrent, alors c'est idéalement deux instructions par deux horloges ou une par. thumb2 bien sûr, vous prenez le coup. ST a définitivement une chose de prefetcher / cacher avec un nom marketing sophistiqué qui fait un très bon travail. D'autres peuvent offrir cela aussi ou simplement se fier aux offres de bras qui varient.

Les différents cortex-ms ont différents mélanges de bus. Je déteste les références von-Neumann / Harvard car il y a peu d'utilité pratique pour une architecture Harvard réelle, donc l'adjectif «modifié» qui signifie qu'ils peuvent tout faire et essayer d'attirer les gens qui ont appris à l'école que Harvard signifie performance. Les bus peuvent avoir plusieurs transactions en vol et il y a un nombre différent de bus, ce qui est assez évident lorsque vous entrez et relâchez les horloges d'un périphérique, apb1 clock control ahb2 clock control, etc. Périphériques, flash, etc. Mais nous pouvons courir code de sram, donc ce n'est pas Harvard. Oubliez les termes de Harvard et von-Neumann et concentrez-vous uniquement sur la mise en œuvre réelle.

La documentation du bus est aussi facilement disponible que la documentation de base. Si vous achetez la bonne carte fpga, vous pouvez demander une évaluation gratuite d'un noyau que vous pouvez ensuite avoir une vue rapprochée et personnelle de son fonctionnement réel.

En fin de compte, il y a un certain parallélisme, mais sur de nombreuses puces, le flash est à demi-vitesse, donc si vous n'en récupérez pas deux par personne ou que vous n'avez pas une autre solution, vous le faites à peine et vous bloquez souvent si vous avez d'autres accès au même bus. De même, sur beaucoup de ces puces, les périphériques ne peuvent pas fonctionner aussi vite que le cœur, de sorte que cela seul entraîne un blocage, mais même si le périphérique fonctionne sur la même horloge, cela ne signifie pas qu'il tourne autour d'un csr ou d'un accès aux données aussi vite que sram, donc vous encourez un décrochage là aussi.

Il n'y a aucune raison de supposer que vous obtiendrez une instruction par performance d'horloge de ces pièces, pas plus qu'un bras de taille normale ou x86 ou autre.

Bien que certains détails importants ne soient pas documentés et ne soient visibles que lorsque vous obtenez le noyau, il existe une documentation sur chaque noyau et bus pour avoir une idée approximative de la façon d'ajuster votre code pour qu'il fonctionne mieux ou d'ajuster vos attentes sur la façon dont il fonctionnera vraiment. . Je sais que j'ai démontré cela ici et ailleurs, il est assez facile même avec un ST de voir une différence de performance entre flash et sram et de voir qu'il faut plus d'horloges que d'instructions pour effectuer un benchmark.

Votre question est trop large à certains égards, le cortex-m0 et le m3 sont assez différents, l'un était le premier et regorgeait de fonctionnalités, l'autre était réglé pour la taille et a juste moins de choses en général pas nécessairement censé rivaliser. par ici. Alors, combien de temps dure la latence, etc., qui est strictement la société de puces et la famille au sein de la société de puces, de sorte que des questions extrêmement larges sur tous les produits cortex-m existent, des dizaines de réponses différentes à cette question. ARM fabrique des cœurs et non des puces, les vendeurs de puces fabriquent des puces et achètent des IP à divers endroits et en fabriquent certaines, une petite partie de cette puce peut être une IP qu'ils achètent à un fournisseur de processeurs.


1 commentaires

Point intéressant: j'ai historiquement corrigé l'orthographe des "bus" car mon correcteur orthographique ne l'aime pas. Cependant, j'ai appris aujourd'hui qu'elle était considérée comme correcte . Dans un souci de compromis, je vais essayer de me souvenir de laisser celui-ci en place.