Alignés de mémoire alignés et non alignés?
Quelle est la différence entre aligné et non aligné d'accès à la mémoire?
Je travail sur un TMS320C64x DSP, et je veux utiliser les fonctions intrinsèques (fonctions C pour les instructions de montage) et il a
ushort & _amem2(void *ptr);
ushort & _mem2(void *ptr);
où _amem2
ne l'alignement de l'accès de 2 octets et _mem2
n'a pas d'allégeance accès.
Quand dois-je utiliser?
source d'informationauteur Can Bal | 2009-06-30
Vous devez vous connecter pour publier un commentaire.
L'alignement de l'accès à la mémoire signifie que le pointeur (un nombre entier) est un multiple d'un type spécifique de la valeur dite de l'alignement. L'alignement est le naturel de l'adresse de plusieurs, dont le type doit être, ou devrait être stockées (par exemple, pour des raisons de performances) sur un PROCESSEUR. Par exemple, un PROCESSEUR peut exiger que tous les deux octets de charge ou les magasins sont fait par le biais des adresses qui sont des multiples de deux. Pour les petits types primitifs (moins de 4 octets), l'alignement est presque toujours la taille du type. Pour les structures, l'alignement est généralement le maximum de l'alignement d'un membre.
Le compilateur C met toujours des variables que vous déclarez à des adresses satisfaire les "corriger" l'alignement. Donc, si ptr points, par exemple uint16_t variable, il sera aligné et vous pouvez utiliser _amem2. Vous avez besoin d'utiliser _mem2 seulement si vous accédez par exemple, des paniers-tableau d'octets reçus via I/O, ou d'octets dans le milieu d'une corde.
Grand nombre d'architectures de stockage de mémoire dans "les mots" de plusieurs octets chacun. Par exemple, les processeurs Intel 32-bit architecture magasins de mots de 32 bits, chacun de 4 octets. La mémoire est adressée à l'octet niveau, cependant; par conséquent, une adresse peut être "aligné", le sens qu'il commence à une limite de mot, ou "non alignés", ce qui signifie qu'il n'est pas.
Sur certaines architectures de certaines opérations de mémoire peut être plus lent ou même pas du tout permis sur la non alignés adresses.
Donc, si vous connaissez vos adresses sont alignés sur la droite d'adresses, vous pouvez utiliser _amem2(), pour la vitesse. Sinon, vous devez utiliser _mem2().
_mem2 est plus général. Cela fonctionnera si ptr est aligné ou pas. _amem2 est plus stricte: elle exige que les ptr être aligné (mais en est sans doute légèrement plus efficace). Donc, utiliser _mem2 sauf si vous pouvez garantir que le ptr est toujours aligné.
Nombre de processeurs ont l'alignement des restrictions sur l'accès à la mémoire. Non alignés d'accès génère une interruption de l'exception (par exemple, BRAS), ou c'est juste plus lent (par exemple x86).
_mem2
est probablement mis en œuvre comme l'extraction de deux octets à l'aide de décalage et de la ou des opérations au niveau du bit pour faire un 16 bits ushort._amem2
probablement juste le lit de la 16-bits ushort à partir de cette ptr.Je ne sais pas TMS320C64x en particulier, mais je suppose qu'il exige de 16 bits à l'alignement pour les 16 bits les accès à la mémoire. Ainsi, vous pouvez utiliser
_mem2
toujours, mais avec l'exécution de la peine, et_amem2
quand vous pouvez garantir que le ptr est une même adresse.Aligné adresses sont ceux qui sont des multiples de l'accès de la taille en question.
Il est très probable que le _mem2 la fonction qui va travailler également pour des non alignés accède sera moins optimale pour obtenir les alignements corrects de travail dans son code. Cela signifie que le _mem2 la fonction est susceptible d'être plus coûteux alors son _amem2 version.
Donc, lorsque vous avez besoin de performances (en particulier lorsque l'on sait que la latence d'accès est élevé), il serait prudent de déterminer quand vous pouvez utiliser l'harmonisation de l'accès. Le _amem2 il existe dans ce but-pour vous donner des performances lorsque vous savez que l'accès est aligné.
Quand il s'agit de 2 octets accès, l'identification aligné opérations est très simple.
Si toutes les adresses pour le fonctionnement sont 'même' (LSB est égale à zéro), vous avez 2 octets d'alignement. Ceci peut être facilement vérifié avec,
Je sais que c'est une vieille question avec une réponse sélectionnée, mais ne voit pas quelqu'un d'expliquer la réponse à quelle est la différence entre aligné et non aligné d'accès à la mémoire...
Être il dram et sram ou flash ou autres. Prendre un sram comme un simple exemple, il est construit à partir de bits spécifique sram sera construit à partir d'un nombre fixe de bits de large et d'un nombre fixe de lignes de profondeur. disons 32 bits de large et plusieurs/un grand nombre de lignes de profondeur.
si je fais un 32 bits écrire à l'adresse 0x0000 dans ce sram, le contrôleur de mémoire autour de ce sram peut se contenter de faire un seul cycle d'écriture à la ligne 0.
si je fais un 32 bits écrire à l'adresse 0x0001 dans ce sram, en supposant que c'est autorisé, le contrôleur sera nécessaire pour faire une lecture de la ligne 0, de modifier trois octets, préserver, et de l'écrire à la ligne 0, alors lisez la ligne 1 modifier un octet laissant les trois autres, comme l'a constaté et de l'écrire en arrière. qui les octets de la modification ou de ne pas avoir à faire avec l'endianness pour le système.
L'ancien alignement et le dernier non alignés, clairement une différence de performance plus besoin de la logique supplémentaire pour être en mesure de faire les quatre cycles de mémoire et de fusion de l'octet voies.
Si je devais lire les 32 bits de l'adresse 0x0000 alors une seule lecture de la ligne 0, c'est fait. Mais lire de 0x0001 et je dois faire deux lectures row0 et row1 et en fonction de la conception du système, suffit d'envoyer ces 64 bits du processeur, peut-être deux horloges bus au lieu d'un. ou le contrôleur de mémoire supplémentaire de la logique de sorte que les 32 bits sont alignés sur le bus de données dans un bus de cycle.
16 bit lit sont un peu mieux, une lecture de la 0x0000, 0x0001 et 0x0002 ne serait qu'une lecture de row0 et pourrait basée sur le système/modèle de processeur envoyer ces 32 bits et le processeur d'extraits ou de les transférer dans la mémoire du contrôleur afin qu'ils atterrissent sur des octets voies, afin que le processeur n'a pas à tourner autour. L'un ou l'autre si pas les deux. Une lecture de la 0x0003 est bien comme ci-dessus, vous avez qu'à lire la ligne 0 et la row1 comme l'un de vos octets dans chaque et ensuite envoyer 64 bits du processeur, de l'extrait ou de la mémoire contrôleur combine les bits dans un de 32 bits de bus de réponse (en supposant que le bus entre le processeur et le contrôleur mémoire est de 32 bits de large pour ces exemples).
Un 16 bits écrire mais finit toujours avec au moins une lecture-modification-écriture dans cet exemple, sram, adresse 0x0000, 0x0001 et 0x0002 lire row0 modifier deux octets et écrire de nouveau. adresse 0x0003 lire deux lignes de modifier un octet chacun et écrire de nouveau.
8 bits, vous avez seulement besoin de lire une ligne contenant que des octets, écrit, mais sont d'une lecture-modification-écriture d'une ligne.
La armv4 na pas non alignés comme bien que vous pouvez désactiver le piège et le résultat n'est pas comme vous vous attendez ci-dessus, pas important, les armes permettent non alignés et vous donner ce comportement, vous pouvez modifier un bit dans un registre de contrôle, puis il s'arrêtera non alignés transferts. mips utilisé pour ne pas permettre, vous ne savez pas ce qu'ils font maintenant. x86, 68 K, etc, a été autorisée et le contrôleur de mémoire peut-être dû faire le plus de travail.
Les dessins qui ne permettent clairement de performances et moins de logique à ce que certains disent est un fardeau pour les programmeurs d'autres pourraient dire que c'est pas un travail supplémentaire sur le programmeur ou plus facile sur le programmeur. aligné ou pas, vous pouvez également voir pourquoi il peut être préférable de ne pas essayer de sauver la mémoire en faisant des 8 bits des variables, mais aller de l'avant et de gravure de 32 bits mot ou quelle que soit la taille normale d'un registre ou le bus. Il peut aider votre performance à un coût modique de quelques octets. Pour ne pas mentionner le code supplémentaire le compilateur serait nécessaire d'ajouter pour rendre le disons 32 bits du registre d'imiter une 8 bits variable, de masquage et, parfois, l'extension du signe. Où à l'aide de registre natif tailles de ces instructions supplémentaires ne sont pas nécessaires. Vous pouvez aussi mettre plusieurs choses dans un bus mémoire de grande place et de faire un mémoire de cycle de recueillir ou de les écrire ensuite utiliser quelques instructions supplémentaires pour manipuler entre les registres ne coûte rien de ram et un lavage possible sur le nombre d'instructions.
Je ne suis d'accord que le compilateur toujours aligner les données à droite de la cible, il y a des moyens de le casser. Et si la cible ne supporte pas non alignés, vous frappez à la faute. Les programmeurs n'aurait pas besoin d'en parler si le compilateur a toujours fait droit fondé sur le juridique, le code que vous pourriez venir avec, il n'y aurait aucune raison pour que cette question, si c'était pour la performance. si vous n'avez pas de contrôle sur le vide ptr adresse pour être aligné ou pas, alors vous devez utiliser le mem2() non alignés accès tout le temps ou que vous avez à faire un if-then-else dans votre code en fonction de la valeur de la ptr nik souligné. en déclarant que l'annulation de la C compilateur n'a aucun moyen de traiter correctement votre alignement et il ne sera pas garanti. si vous prenez un char *prt et de le nourrir à ces fonctions, tous les paris sont éteints sur le compilateur juste sans vous ajouter du code supplémentaire soit enterré dans le mem2() la fonction ou à l'extérieur de ces deux fonctions. donc, comme écrit dans votre question mem2() est la seule réponse correcte.
DRAM dire utilisé dans votre ordinateur de bureau/ordinateur portable a tendance à être 64 ou 72 (avec ecc) bits de large, et tous les accès sont alignées. Même si les bâtons de mémoire sont en fait composé de 8 bits ou 16 ou 32 bits de large jetons. (cela peut être en train de changer avec les téléphones/tablettes pour diverses raisons) le contrôleur de mémoire et, idéalement, au moins un cache se trouve en face de ce dram, de sorte que les non alignés ou même aligné les accès qui sont plus petits que la largeur du bus de lecture-modification-écriture est traitée dans le cache sram qui est plus rapide, et le dram accès sont tous aligné sur toute la largeur du bus d'accès. Si vous n'avez pas de cache en face de la dram et le contrôleur est conçu pour toute la largeur accède alors que c'est la pire performance, conçu pour l'éclairage de l'octet voies séparément (en supposant que les 8 bits de large puces), alors vous n'avez pas la lecture-modification-écrit mais plus compliqué contrôleur. si le cas d'utilisation typique est avec un cache (si il y en a un dans la conception), alors il ne peut pas faire de sens que des travaux supplémentaires dans le contrôleur pour chaque octet de lane, mais juste de savoir comment faire la pleine largeur du bus de la taille des transferts ou des multiples de.