LRU vs FIFO vs Aléatoire
Quand il y a une défaillance de page ou un cache miss, nous pouvons utiliser soit la Moins Récemment Utilisée (LRU), d'Abord en Poing Sorti (FIFO) ou remplacement Aléatoire des algorithmes. Je me demandais, qui fournit les meilleures performances aka le moins possible futur de cache miss " /défauts de page?
Architecture: processeur Coldfire
Il y a sûrement des livres consacrés à l'analyse des différentes approches dans différents environnements?
est-il une réponse générale/consensus? Je ne suis pas à la recherche pour obtenir des détails...
N'est pas l'endroit pour poser des certains questions. Répondre à ce serait très dépendante de l'environnement.
J'ai ajouté une architecture spécifique de sorte que la question doit être assez précis maintenant.
est-il une réponse générale/consensus? Je ne suis pas à la recherche pour obtenir des détails...
N'est pas l'endroit pour poser des certains questions. Répondre à ce serait très dépendante de l'environnement.
J'ai ajouté une architecture spécifique de sorte que la question doit être assez précis maintenant.
OriginalL'auteur rrazd | 2011-08-03
Vous devez vous connecter pour publier un commentaire.
Pas de politique de mise en cache existe parce qu'il nécessiterait la connaissance de l'avenir (comment un programme d'accès mémoire).
Mais, certains sont sensiblement meilleurs que d'autres dans la commune d'accès à la mémoire de modèle d'affaires. C'est le cas avec la LRU. LRU a toujours donné de très bonnes performances en utilisation globale.
Mais, pour ce que vous êtes en train de faire, une autre politique peut-être mieux. Il y a toujours certains d'accès à la mémoire modèle qui sera la cause d'une politique de mise en cache des performances médiocres.
Vous pouvez trouver ce thread utile (et plus élaboré!)
Pourquoi est-LRU mieux que FIFO?
aléatoire donne de meilleurs des cas les pires performances que LRU. L'exemple classique où le hasard est mieux que la LRU et de la FIFO est répétée à balayage linéaire à travers la mémoire légèrement plus grand que la taille du cache. Dans ce cas, les deux LRU et FIFO sera pessimal, en laissant tomber de chaque entrée juste avant il est nécessaire...
+1 pour un excellent post.
OriginalL'auteur adu
L'expression "Il n'y a pas de questions stupides" s'adapte si bien. C'était une bonne question, j'ai dû créer un compte et poster sur il et partager mon point de vue comme de quelqu'un qui a modelé les caches sur un couple de Processeurs.
Vous spécifiez l'architecture d'un 68000, qui est un PROCESSEUR plutôt que d'un GPU ou un contrôleur USB, ou d'un autre morceau de matériel qui peut accéder à un cache cependant...
Donc le code que vous exécutez sur le 68000, fera une énorme différence pour la partie de la question "le moins possible à l'avenir de cache miss "/défauts de page".
Dans ce de vous différencier entre le cache et les défauts de page, je ne suis pas sûr exactement ce qui coldfire architecture l'on se réfère à mais je suppose que ce n'est pas un matériel TLB de remplacement, il utilise un logiciel mecanisme (de sorte que le cache sera partagé avec les données des applications).
Dans la politique de remplacement le facteur le plus important est le nombre d'associations (ou les moyens).
Direct de cache de la carte (1), est directement corrélée (tous plus toujours) avec les bits de poids faibles de l'adresse (le nombre de bits de définir la taille du cache) et 32 ko de cache serait la moindre 15bits. Dans ce cas, le remplacement algorthims LRU, FIFO ou Aléatoire serait inutile puisqu'il n'existe qu'un seul choix possible.
Cependant écriture Différée ou "Writethrough" sélection de la mémoire cache aurait plus d'effet. Pour les écritures de la mémoire "Writethrough" signifie que la ligne de cache n'est pas réparti comme revêtue de l'écriture différée cache où la ligne actuellement dans le cache qui partage la même inférieur à 15 bits est éjecté hors du cache et de la lecture en puis modifié, à utiliser SI le code en cours d'exécution sur le PROCESSEUR utilise ces données).
Pour les opérations d'écriture et de ne pas effectuer de multiples opérations sur les données, puis "writethrough" est généralement beaucoup mieux, aussi sur les processeurs modernes (et je ne sais pas si cette architecture prend en charge), mais "Writethrough" ou d'écriture Différée peut être sélectionné sur une TLB/Page. Cela peut avoir beaucoup greator effet sur le cache de la politique, vous pouvez programmer le système pour l'adapter au type de données de chaque page, surtout dans un direct de cache de la carte 😉
Donc directement de cache de la carte est assez facile à comprendre, il est également facile de comprendre la base de la cache dans le pire des cas, dans le meilleur des cas et de la moyenne des cas.
Banque imagin un memcpy routine qui copie les données qui correspond à la taille du cache. Par exemple, un 32k direct mapped cache, avec deux 32k tampons alignés sur une 32k boundry....
Ici, vous voyez les lire et à écrire comme ils copie de chaque mot de données, de l'avis de la baisse de 15 bits sont les mêmes pour chaque opération en lecture et écriture.
Directement mappé cache à l'aide de l'écriture différée (souvenez-vous de l'écriture différée alloue les lignes de la suivante)
Comme vous le voyez, beaucoup d'opérations de mémoire de continuer, c'est en fait appelé "raclée" et est le meilleur exemple d'une pire des cas scenairo.
Maintenant, imaginez que nous utilisons un "writethrough" cache, ce sont les opérations:
Comme vous pouvez le voir une différence énorme que nous avons maintenant n'est pas du thrash, en fait, nous sommes dans le meilleur des cas dans cet exemple.
Ok, donc c'est le cas simple d'écrire par le biais de vs écrire de nouveau.
Direct carte caches sont cependant pas très commun de la plupart des gens utilisent, 2,4 ou 8 chemin du cache, c'est il y a 2, 4 ou 8 différentes possibilités d'affectations en ligne. Donc, on pourrait stocker 0x0000, 0x8000, 0x1000, 0x1800 tous dans le cache en même temps dans un 4 ou 8 voies, de cache (bien évidemment, une façon 8 peut également stocker 0x2000, 0x2800, 0x3000, 0x3800 ainsi).
Cela permettrait d'éviter cette surcharge question.
Juste pour préciser le numéro de la ligne dans un 32k direct mapped cache le bas de 15 bits de l'adresse.
Dans un 32k 2 voies c'est le fond 14 bits.
Dans un 32k 4 voies, c'est le fond 13 bits.
Dans un 32k 8 c'est le fond de 12 bits.
Et entièrement associatve cache c'est les lignes de la taille (ou le bas 5 bits avec 32 octets de la ligne). Vous ne pouvez pas avoir moins de un ligne. 32 octets est généralement la plupart des conditions de fonctionnement optimales dans un DDR système de mémoire (il y a d'autres raisons, someimes 16 ou parfois de 64 octets peut être mieux, et 1 octet serait optimale dans le algorthmic cas, permet de utilise 32 car c'est très fréquent)
Pour l'aider à comprendre la LRU, FIFO et Aléatoire envisager de la cache est plein associatif, dans un 32k de 32 octets de la ligne de cache c'est 1024 lignes.
Un remplacement aléatoire, d'une politique sur le hasard de provoquer un pire des cas, frapper chaque 1024 remplacements (ie. 99,9% de succès), soit dans la loi LRU ou FIFO je pourrais toujours écrire un programme qui permettrait de "thrash" ie. toujours causer une pire des cas behavouir (ie. 0% hit).
Clairement si vous aviez entièrement associatif cache vous ne choisissez LRU ou FIFO si le programme est connu, et qu'il était connu à l'exact behavouir du programme.
Pour TOUT ce qui n'était pas à 99,9% prévisible de choisir au HASARD, c'est tout simplement le meilleur pas être pire, et l'un des meilleurs pour se situer dans la moyenne, mais que diriez-dans le meilleur des cas (où j'ai d'obtenir les meilleures performances)...
Eh bien, il repose essentiellement sur le nombre de façons...
2 façons et je peux optimiser des choses comme memcpy et d'autres algorthims pour faire un bon travail. Aléatoire serait se tromper de la moitié du temps.
4 moyens et quand je switch entre autres tâches, je ne pourrais pas endommager le cache tellement que leurs données sont toujours locales. Aléatoire serait se tromper quater du temps.
8 façons maintenant les statistiques peuvent prendre effet à une 7/8% taux de succès sur un memcpy n'est pas aussi bon que d'un 1023/1024% (totalement associatif ou optimisé le code), mais pour les non optimisé le code qu'il fait une différence.
Alors pourquoi ne pas les gens de faire totalement associatif de la cache, avec remplacement aléatoire politiques!
Bien ce n'est pas parce qu'ils ne peuvent pas générer des nombres aléatoires, en fait un pseudo random number generator est tout aussi bon et oui je peux écrire un programme pour obtenir 100% de manquer de rythme, mais qui n'est pas le point, je ne pouvais pas écrire un programme utile qui aurait 100% de miss, que j'ai pu avec un LRU ou FIFO algo.
Un 32k de 32 octets de la ligne Entièrement associatve de la cache, vous obliger à comparer 1024 valeurs, dans le matériel, cela se fait via une CAM, mais c'est une pièce coûteuse de matériel, et aussi que c'est juste pas possible de comparer ce nombre de valeurs dans un "RAPIDE" temps de traitement, je me demande si un ordinateur quantique pourrait....
De toute façon, pour répondre à votre question qui est le meilleur:
Références:
OriginalL'auteur user3713380
De nombreuses architectures j'ai étudié l'utilisation LRU, comme c'est généralement fournit non seulement de l'efficacité dans la mise en œuvre, mais aussi est très bonne, en moyenne, à la prévention des accidents. Cependant, dans les dernières architectures x86, je pense qu'il y a encore compliqué les choses se passent. LRU est une sorte de modèle de base.
Cela dépend vraiment de ce genre d'opérations que vous effectuez sur votre appareil. Selon les types d'opérations, les différents évacuation des politiques fonctionnent mieux. Par exemple, FIFO fonctionne bien avec de la traversée de la mémoire de manière séquentielle.
Espère que cette aide, je ne suis pas vraiment une architecture gars.
Remplacement aléatoire est une sorte de shoot merde. Aussi vraiment facile et efficace pour mettre en œuvre, mais il a la possibilité d'évacuer quelque chose que vous utilisez souvent. Il ne prend pas en compte toute heuristique sur ce que vous avez l'habitude de faire. Alors que d'autres, je n'en savons pas beaucoup sur le sujet.
OriginalL'auteur Chad La Guardia
Entre les trois, je vous recommande LRU. Tout d'abord, c'est une bonne approximation de planification optimale lorsque la localité est assumé (ce qui s'avère être une bonne hypothèse). Aléatoire de la planification ne peut pas bénéficier de la localité. Deuxièmement, il ne souffre pas de Belady l'anomalie (comme FIFO); c'est, plus gros caches signifie de meilleures performances, ce qui n'est pas forcément le cas avec FIFO.
Seulement si votre problème spécifique de domaine suggère fortement d'utiliser quelque chose d'autre, LRU va être dur à battre dans le cas général.
OriginalL'auteur Patrick87
Des trois, LRU est généralement le meilleur alors que FIFO est le pire et le hasard vient de quelque part entre les deux. Vous pouvez construire des modèles d'accès de n'importe lequel des trois est supérieure à d'autres, mais c'est un peu délicat. Curieusement, cet ordre est aussi à peu près comment cher ils sont à mettre en œuvre -- LRU est la plus chère et la FIFO est le moins cher. Va juste pour montrer, il n'y a pas de repas gratuit
OriginalL'auteur Chris Dodd
Si vous voulez le meilleur des deux mondes, envisager une approche adaptative qui modifie la stratégie basée sur l'utilisation réelle des modèles. Regardez, par exemple, l'algorithme d'IBM Adaptative De Remplacement De Cache: http://code.activestate.com/recipes/576532-adaptive-replacement-cache-in-python/
OriginalL'auteur Raymond Hettinger