Alignement de la mémoire sur un 32 bits processeur Intel
Intel processeurs 32 bits tels que les Pentium 64 bits du bus de données et, par conséquent, chercher de 8 octets par accès. Sur cette base, je suis en supposant que les adresses physiques de ces processeurs émettre sur le bus d'adresse sont toujours des multiples de 8.
Premièrement, est-ce la conclusion correcte?
Deuxièmement, si elle est correcte, alors on devrait aligner la structure de données des membres sur 8 octets limite. Mais j'ai vu des gens à l'aide de 4 octets au lieu de l'alignement sur ces processeurs.
Comment peuvent-elles être justifiées?
Je n'ai aucune idée de ce que signifie cette question, mais je suis intrigué au sujet de comment cela se rapporte à la programmation, et comment cela peut m'affecter. Où puis-je lire une base d'intro à ce faible niveau type de choses?
Voir "Ce que Chaque Programmeur Doit Savoir à Propos de la Mémoire": people.redhat.com/drepper/cpumemory.pdf
Comment puis-yo uget de "demande de lectures sont toujours des multiples de 8" à "vos données doit toujours commencer sur une limite de 8 octets"? Je ne vois pas le lien logique entre ces. Tant que les données n'est pas la croix une limite de 8 octets, que nous sommes bons, n'est-ce pas?
Voir "Ce que Chaque Programmeur Doit Savoir à Propos de la Mémoire": people.redhat.com/drepper/cpumemory.pdf
Comment puis-yo uget de "demande de lectures sont toujours des multiples de 8" à "vos données doit toujours commencer sur une limite de 8 octets"? Je ne vois pas le lien logique entre ces. Tant que les données n'est pas la croix une limite de 8 octets, que nous sommes bons, n'est-ce pas?
OriginalL'auteur Frederick The Fool | 2009-06-28
Vous devez vous connecter pour publier un commentaire.
La règle habituelle de pouce (directement à partir de Intels et AMD optimisation des manuels), c'est que chaque type de données doit être aligné par sa propre taille. Un
int32
devrait être alignée sur une frontière de 32 bits, unint64
sur une limite de 64 bits, et ainsi de suite. Un char en place n'importe où.Une autre règle de base est, bien sûr, "le compilateur a été dit à propos de l'alignement des exigences". Vous n'avez pas besoin de s'inquiéter à ce sujet parce que le compilateur sait ajouter le droit de rembourrage et les décalages pour permettre un accès efficace aux données.
La seule exception est lorsque vous travaillez avec des instructions SIMD, où vous devez vérifier manuellement l'alignement sur la plupart des compilateurs.
Je ne vois pas en quoi cela fait une différence. Le CPU peut simplement émettre un lire pour le bloc de 64 bits qui contient ces 4 octets. Cela signifie qu'il obtient 4 octets supplémentaires avant que les données demandées, ou après. Mais dans les deux cas, il ne faut qu'une seule lecture. 32-bits d'alignement de 32 bits de données à l'échelle assure de ne pas franchir une limite de 64 bits.
comment cela se passerait si elle est alignée sur une limite de 4 octets?
Je ne peux pas croire que j'ai manqué ce simple raisonnement. Pourquoi gaspiller de 4 octets 8 octets d'alignement lorsque vous d'obtenir la même performance avec 4 octets? Grâce Jalf.com. Vous avez parfaitement logique.
J'ai posté une autre question qui est également liée à l'alignement (dans ce cas, sur les mots dont la taille est moindre que celui de l'architecture), et je ne sais pas si le raisonnement appliqué dans votre réponse peut être appliqué à ma question: stackoverflow.com/questions/22820576/...
OriginalL'auteur jalf
Physique du bus 64 bits de large ...multiple de 8 --> oui
CEPENDANT, il y a deux facteurs à prendre en compte:
Pourquoi aurait-il besoin de deux extractions? Il serait tout simplement demander toutes les données de 0x000044440 à 0x000044447, et depuis, nous nous intéressons au 0x000044444-0x000044447, quel est le problème?
Pourquoi parlons instructions d'alignement, qui n'a pas de sens. Rembourrage des instructions à sa limite avec l'Opr, en ne réalise rien.
OriginalL'auteur J-16 SDiZ
Ils ont le droit de le faire parce que changer d'alignement de 8 octets constituerait une ABI changement, et l'amélioration du rendement marginal n'est pas la peine.
Que quelqu'un d'autre l'a déjà dit, cachelines question. Tous les accès à la mémoire réelle de bus sont en termes de lignes de cache (64 octets sur x86, IIRC). Voir la "Ce que chaque programmeur a besoin de savoir à propos de la mémoire" doc qui a été déjà mentionné. Donc la mémoire de la circulation est de 64 octets aligné.
OriginalL'auteur janneb
La version 64 bits de bus, vous vous référez à des flux les caches. Comme un PROCESSEUR, il faut toujours lire et écrire ensemble de lignes de cache. De la taille d'une ligne de cache est toujours un multiple de 8, et son adresse physique est en effet aligné à 8 octets décalages.
Cache-à-registre des transferts de ne pas utiliser le bus de données externe, de sorte que la largeur de ce bus n'est pas pertinent.
OriginalL'auteur MSalters
Pour un accès aléatoire et aussi longtemps que les données ne sont pas alignées (par exemple, le franchissement d'une frontière), je ne pense pas que cela importe beaucoup; la bonne adresse et de décalage dans les données peut être trouvé avec un simple ET de construire dans le matériel. Il est au ralenti lors d'un accès en lecture n'est pas suffisante pour obtenir une valeur. C'est aussi pourquoi les compilateurs habitude de mettre des petites valeurs (octets etc.) ensemble, parce qu'ils n'ont pas à être à un certain décalage; les shorts doivent être sur la même adresses de 32 bits sur 4 octets des adresses et 64 bits sur 8 octets d'adresses.
Notez que si vous avez de la mise en cache involed et linéaire d'accès aux données, les choses seront différentes.
OriginalL'auteur Lucero