Question

Je sais que les processeurs modernes peuvent exécuter hors d'usage, mais ils se retirent toujours les résultats en ordre, tel que décrit par wikipedia.

"Out de processeurs Oder remplir ces « machines à sous » dans le temps avec d'autres instructions qui sont prêtes, puis réordonner les résultats à la fin de faire apparaître que les instructions ont été traitées normalement. «

clôtures de mémoire sont dit être nécessaire lors de l'utilisation des plates-formes multi-cœurs, parce que grâce à l'exécution Sur ordre, une mauvaise valeur de x peut être imprimé ici.

Processor #1:
 while f == 0
  ;
 print x; // x might not be 42 here

Processor #2:
 x = 42;
 // Memory fence required here
 f = 1

Maintenant, ma question est, depuis Out of Order Processors (Cores en cas de processeurs multicœurs je suppose) retirer toujours les résultats dans l'ordre, quelle est la nécessité de clôtures mémoire. Ne pas les noyaux d'un processeur multicoeur Sées résultats retirés d'autres noyaux seulement ou ils voient aussi des résultats qui sont en vol?

Je veux dire dans l'exemple ci-dessus j'ai donné, lorsque le processeur 2 finira par retirer les résultats, le résultat de x devrait venir avant f , non? Je sais que pendant de l'exécution de l'ordre, il aurait peut-être modifié f avant x mais il ne doit pas avoir pris sa retraite avant x , non?

Maintenant, avec dans l'ordre de prendre sa retraite des résultats et le mécanisme de cohérence du cache en place, pourquoi voudriez-vous des clôtures de mémoire jamais besoin dans x86?

Était-ce utile?

La solution

Ce tutoriel explique les problèmes: http: // www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-7.pdf

FWIW, où les problèmes de commande de mémoire se produisent sur les processeurs x86 modernes, la raison est que si le modèle de cohérence mémoire x86 offre une cohérence assez forte, les barrières explicites sont nécessaires pour traiter lecture après écriture cohérence. Cela est dû à ce qu'on appelle le « tampon de stockage ».

C'est, x86 est séquentielle cohérente (agréable et facile à raisonner sur), sauf que les charges peuvent être réorganisés WRT magasins plus tôt. Autrement dit, si le processeur exécute la séquence

store x
load y

puis sur le bus de processeur ce qui peut être considéré comme

load y
store x

La raison de ce comportement est le tampon de stockage mentionnée ci-dessus, qui est un petit tampon pour les écritures avant d'aller sur le bus système. temps d'attente de charge est, OTOH, un enjeu crucial pour la performance, et par conséquent les charges sont autorisés à « sauter la file d'attente ».

Voir la section 8.2 http://download.intel.com/design/ processeur / manuels / 253668.pdf

Autres conseils

La clôture de la mémoire garantit que toutes les modifications apportées aux variables avant la clôture sont visibles à tous les autres noyaux, de sorte que tous les noyaux ont une vue à jour des données.

Si vous ne mettez pas une clôture de mémoire, les noyaux peuvent travailler avec des données erronées, cela peut être vu en particulier dans ce scénario, où plusieurs noyaux travailleraient sur les mêmes ensembles de données. Dans ce cas, vous pouvez faire en sorte que lorsque le processeur 0 a fait une action, que tous les changements effectués dans l'ensemble de données sont maintenant visibles à tous les autres noyaux, qui peuvent alors travailler avec des informations à jour.

Certaines architectures, y compris le x86 / x64 omniprésentes, fournissent plusieurs instructions de barrière de mémoire comprenant une instruction parfois appelé « Clôture complète ». Une clôture complète assure que toutes les opérations de chargement et de stockage avant la clôture aura été commis avant les charges et les magasins émis après la clôture.

Si un noyau devait commencer à travailler avec des données obsolètes sur l'ensemble de données, comment pourrait-il jamais obtenir les résultats corrects? Il ne pouvait pas, peu importe si le résultat final devait être présenté comme, si tout a été fait dans l'ordre.

La clé est dans le tampon de stockage, qui se trouve entre le cache et la CPU, et le fait:

tampon invisible magasin aux CPU à distance

tampon Store permet à la mémoire des écritures et / ou des caches soient enregistrés optimiser les accès d'interconnexion

Cela signifie que les choses sont écrites dans ce tampon, puis à un moment donné sera la mémoire tampon est écrit dans le cache. Le cache peut contenir une vue des données qui ne sont pas les plus récentes, et donc une autre CPU, par la cohérence du cache, aura pas non plus les dernières données. Un rinçage de tampon de stockage est nécessaire pour les données les plus récentes soient visibles, cela, je pense est essentiellement ce que la barrière de mémoire se fera au niveau du matériel.

EDIT:

Pour le code utilisé comme exemple, Wikipedia dit ceci:

Une barrière de mémoire peut être insérée avant l'affectation de processeur n ° 2 à f pour faire en sorte que la nouvelle valeur de x est visible à d'autres processeurs à ou avant le changement de la valeur de f.

Juste pour rendre explicite ce qui est implicite dans les réponses précédentes, cela est correct, mais se distingue de la mémoire accès:

CPU peut exécuter hors d'usage, mais ils se retirent toujours les résultats dans l'ordre

La retraite de l'instruction est distincte d'effectuer l'accès à la mémoire, l'accès mémoire peut compléter à un autre moment de la retraite d'instruction.

Chaque noyau agira comme si elle ses propres accès de mémoire se produisent à la retraite, mais d'autres noyaux peuvent voir les accès à différents moments.

(x86 et ARM, je pense que les magasins sont soumis à cette observable, mais par exemple, Alpha peut charger une ancienne valeur de la mémoire. X86 SSE2 a des instructions avec guarentees plus faibles que le comportement x86 normale).

PS. De mémoire, le ROCK Sparc abandonné pourrait en fait se retirer hors de l'ordre, il a passé le pouvoir et les transistors déterminer à quel moment cela était inoffensif. Il a obtenu abandonné à cause de la consommation d'énergie et le nombre de transistors ... Je ne crois pas CPU usage général a été acheté au marché hors ordre retraite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top