AccueilđŸ‡«đŸ‡·Chercher

Alignement en mémoire

En informatique, les contraintes d'alignement en mĂ©moire limitent Ă  certains multiples d'adresse mĂ©moire, oĂč certaines donnĂ©es et instructions machine peuvent ĂȘtre enregistrĂ©es. En outre, les optimisations d'alignement mĂ©moire permettent d'influencer la vitesse d'exĂ©cution d'un programme uniquement en choisissant bien les adresses.

Principe

Pour augmenter leurs performances, les processeurs sont souvent reliĂ©s Ă  la mĂ©moire vive par un bus de donnĂ©es plus large que la granularitĂ© de leur adressage : par exemple un processeur est capable d'adresser individuellement des octets (8 bits), reliĂ© Ă  la mĂ©moire par un bus de 4 octets (32 bits). Si une donnĂ©e de 4 octets ne se trouve pas Ă  une adresse divisible par 4, alors, selon le modĂšle de processeur, il y a :

  • violation de contrainte : une erreur d'alignement interrompt l'exĂ©cution des instructions ;
  • alignement non optimal : deux fois 4 octets bien alignĂ©s sont lus, puis les 4 octets mal alignĂ©s sont extraits de ces 8 octets, ce qui prend bien plus de temps que lire 4 octets bien alignĂ©s.

La rĂšgle gĂ©nĂ©ralement applicable pour qu'une donnĂ©e soit bien alignĂ©e, est qu'elle se trouve Ă  une adresse divisible par sa taille. Ainsi, une donnĂ©e occupant un seul octet est toujours bien alignĂ©e, une donnĂ©e de deux octets est bien alignĂ©e si elle est Ă  une adresse paire, une donnĂ©e de 4 octets est bien alignĂ©e si elle est Ă  une adresse divisible par 4, etc. Toutefois, la contrainte d'alignement n'excĂšde pas le matĂ©riel sous-jacent.

Les contraintes d'alignement en mémoire dépendent de l'architecture du processeur. L'optimisation de l'alignement est plus subtil, car il peut dépendre de la mémoire cache du processeur, de la pagination de la mémoire virtuelle, et autres caractéristiques de l'accÚs à la mémoire. Certains compilateurs permettent d'influencer l'alignement des données.

Pratique

Instructions

Les processeurs RISC n'ont gĂ©nĂ©ralement qu'une seule taille d'instruction machine, et ces instructions doivent ĂȘtre bien alignĂ©es. En revanche, les processeurs CISC ont des instructions de tailles variables. Il peut donc parfois ĂȘtre bĂ©nĂ©fique pour les performances d'insĂ©rer une opĂ©ration sans effet (souvent appelĂ©e nop) afin que les instructions suivantes soient mieux alignĂ©es.

Données

Lorsque des donnĂ©es de tailles diffĂ©rentes sont enregistrĂ©es en mĂ©moire les unes Ă  la suite des autres, il peut ĂȘtre utile, voire nĂ©cessaire, de laisser des trous entre elles afin qu'elles soient toutes bien alignĂ©es. Cela s'observe notamment sur la pile d'exĂ©cution et dans les types de donnĂ©e composĂ©s.

Type de donnée composé en C

Soient deux types de donnĂ©e composĂ©s en langage C en considĂ©rant un matĂ©riel disposant d'un bus d'adressage de 64 bits (8 octets) :

struct no_align
{
    char c;
    double d;
    int i;
    char c2[3];
};
struct align
{
    double d;
    int i;
    char c2[3];
    char c;
};

Les deux structures contiennent les mĂȘmes membres. On pourrait donc en dĂ©duire qu'elles ont la mĂȘme taille. Ainsi, en faisant l'hypothĂšse que :

  • le type char fait 1 octet ;
  • le type int fait 4 octets ;
  • le type double fait 8 octets.

la taille totale serait de 1 + 8 + 4 + 3 × 1 = 16 octets.

Or si l'on affiche la taille avec l'instruction printf("%zu %zu\n", sizeof(struct no_align), sizeof(struct align)); on a de bonnes chances d'obtenir 24 et 16 octets. En effet les membres de la structure align sont bien alignĂ©s, mais pas ceux de no_align. Le compilateur rajoute des octets de remplissage (padding en anglais) pour respecter l'alignement. Une fois compilĂ©, no_align ressemble Ă  ceci :

struct no_align_compile
{
    char c;
    char __pad1[7];
    double d;
    int i;
    char c2[3];
    char __pad2;
};

On remarque que __pad1 permet à d de débuter à une adresse multiple de 8, et __pad2 complÚte la structure pour atteindre 24, un multiple de 8.

Options de compilation

Avec GCC, l'option -Wpadded permet de savoir si une structure nĂ©cessite du padding pour ĂȘtre alignĂ©e. Voici les messages obtenus lors de la compilation de struct no_align :

Warning padding struct to align 'd' 
Warning padding struct size to alignment boundary

Bibliographie

  • (en) C A Reference Manual, 5e Ă©dition, Samuel P. Harbison III, Guy L. Steel Jr., Prentice Hall, 2002
    • §6.1.3 Alignement Restrictions
    • §5.6.7 Sizes of Structures
  • (en) GCC 4.9.2 Manual, §3.8 Options to Request or Suppress Warnings
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.