Une réponse plus ancienne indique que aarch64 prend en charge les lectures / écritures non alignées et dispose d'un mentionner le coût des performances, mais il n'est pas clair si la réponse ne couvre que les opérations ALU ou SIMD (registre 128 bits).

Par rapport aux charges et stockages NEON 128 bits alignés, à quel point les charges et les stockages NEON 128 bits non alignés sont-ils plus lents (voire pas du tout) sur aarch64?

Existe-t-il des instructions séparées pour les charges et les magasins SIMD non alignés (comme c'est le cas avec SSE2) ou les charges / magasins alignés connus sont-ils les mêmes instructions que les charges / magasins potentiellement non alignés?

7
hsivonen 16 août 2017 à 16:11

2 réponses

Meilleure réponse

Selon le Guide d'optimisation logicielle Cortex-A57 dans la section 4.6 Alignement de chargement / magasin il est dit:

L'architecture ARMv8-A permet d'aligner arbitrairement de nombreux types d'accès de chargement et de stockage. Le processeur Cortex-A57 gère la plupart des accès non alignés sans pénalités de performances. Cependant, il existe des cas qui réduisent la bande passante ou entraînent une latence supplémentaire, comme décrit ci-dessous:

  • Charger les opérations qui traversent une limite de ligne de cache (64 octets)
  • Opérations de stockage qui traversent une limite de 16 octets

Cela peut donc dépendre du processeur que vous utilisez, en panne (A57, A72, A-72, A-75) ou en ordre (A-35, A-53, A-55). Je n'ai trouvé aucun guide d'optimisation pour les processeurs en ordre, mais ils ont un compteur de performances matérielles que vous pouvez utiliser pour vérifier si le nombre d'instructions non alignées affecte les performances:

    0xOF_UNALIGNED_LDST_RETIRED Unaligned load-store

Cela peut être utilisé avec l'outil perf.

Il n'y a pas d'instructions spéciales pour les accès non alignés dans AArch64.

6
Guillermo 29 août 2017 à 11:36

Les conseils d'alignement ne sont pas utilisés sur aarch64. Ils sont transparents. Si le pointeur est aligné sur la taille du type de données, l'avantage en termes de performances est automatique.

En cas de doute, pour GCC / Clang, utilisez __attribute__((__aligned__(16))) sur les déclarations de variables.

0
Rauli Kumpulainen 3 avril 2019 à 20:27