2017-01-10 1 views
0

Les instructions de mémoire telles que ldr, str ou b prennent chacune 4 cycles dans l'assemblage ARM. Est-ce parce que chaque emplacement de mémoire a une longueur de 4 octets?Pourquoi les instructions de mémoire prennent-elles 4 cycles dans l'assemblage ARM?

+0

Cela dépend beaucoup de la CPU, certains processeurs ARM peuvent probablement exécuter plus d'une instruction LDR ou STR dans un cycle. –

+1

Non, cela ne fonctionne probablement pas (lecture d'un octet/cycle, donc prendre 4 cycles), c'est probablement juste la latence pour toute l'opération. – harold

+0

La largeur des données fait rarement une grande différence de performance, car vous pouvez lancer "simplement" plus de transistors pour gérer une plus grande largeur, au lieu de 8 bits en parallèle vous travaillez avec 16 ou 32 en parallèle. Cela ne coûte «que» quelques millions de transistors supplémentaires sur tout le cœur, et c'est ainsi que les processeurs passent de 4, 8, 16, 32 à 64 bits modernes (avec des unités d'instructions SIMD 128-512 bits dédiées à la parallélisation). Mais il est difficile de "tricher" (le cache en est un) toute la complexité logique de la mise en contact de différentes puces (mémoire) du processeur pour aller chercher/stocker des données sur le bus. C'est comme voyager. – Ped7g

Répondre

2

ARM a une architecture pipelinée. Chaque cycle d'horloge avance le pipeline d'une étape (par exemple, fetch/decode/execute/read ...). Puisque le pipeline est alimenté en continu, le temps global pour exécuter chaque instruction peut approcher 1 cycle, mais le temps réel pour une instruction individuelle de 'aller chercher' jusqu'à la fin peut être de 3 cycles et plus. ARM a une bonne explication sur leur site web:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0222b/ch01s01s01.html

latence de la mémoire ajoute une autre couche de complication à cette idée. ARM utilise un système de cache à plusieurs niveaux qui vise à avoir les données les plus fréquemment utilisées disponibles dans le moins de cycles. Même une lecture à partir du cache le plus rapide (L0) implique plusieurs cycles de latence. Le pipeline inclut des fonctionnalités permettant aux demandes de lecture de se terminer plus tard si les données ne sont pas utilisées immédiatement. Il est plus facile de comprendre à titre d'exemple:

LDR R0,[R1] 
MOV R2,R3 // Allow time for memory read to occur 
ADD R4,R4,#200 // by interleaving other instructions 
CMP R0,#0 // before trying to use the value 

// By trying to access the data immediately, this will cause a pipeline 
// 'stall' and waste time waiting for the data to become available. 
LDR R0,[R1] 
CMP R0,#0 // Wastes at least 1 cycle due to pipeline not having the data 

L'idée est de cacher les latences inhérentes à la conduite et, si vous pouvez, cacher latences supplémentaires dans l'accès à la mémoire en retardant les dépendances sur les registres (aka instruction entrelacer) .

+0

Points supplémentaires? Il n'y a pas de latence avec un magasin. En outre, les choses sont plus rapides avec un cache à la fois le code et les données. Le code sera initialement en concurrence avec les accès aux données. Il y a l'instruction 'PLD'. Les succursales peuvent compliquer les choses. –

+0

@artlessnoise - Principalement vrai. Il n'y a que 4 tampons d'écriture qui ne coalescent pas les écritures séquentielles. Une mauvaise utilisation des tampons d'écriture (par exemple l'écriture d'un octet à la fois) provoquera des blocages supplémentaires sur les écritures. – BitBank