AArch64支持不对齐访问吗?

问题描述 投票:0回答:1

AArch64 本身支持未对齐访问吗? 我问这个问题是因为目前

ocamlopt
假设“否”。

arm64 memory-alignment
1个回答
16
投票

如果未打开用于严格对齐检查的硬件位(与 x86 一样,实际上没有通用操作系统会这样做),AArch64 确实允许使用常规加载/访问普通(而非设备)内存的未对齐数据访问存储说明。

但是,编译器仍然希望保持对齐数据有几个原因:

  • 读取和写入的原子性:自然对齐的加载和存储保证是原子的,即,如果一个线程读取对齐的内存位置,而另一个线程写入同一位置,则读取将仅返回旧值或新值。如果该位置未与访问大小对齐,则该保证不适用 - 在这种情况下,读取可能会返回两个值的一些未知混合。如果该语言有一个依赖于这种情况不发生的并发模型,它可能不会允许未对齐的数据。
  • 原子读-修改-写操作:如果该语言具有并发模型,其中某些或所有数据类型可以原子地“更新”(不仅仅是读取或写入),那么对于这些操作,代码生成将涉及使用加载用于构建原子读-修改-写序列的独占/存储独占指令,而不是普通的加载/存储。如果地址与访问大小不对齐,独占指令总是会出错。
  • 效率:在大多数内核上,未对齐的访问最多仍比正确对齐的访问多花费至少 1 个周期。在最坏的情况下,单个未对齐的访问可能会跨越缓存行边界(其本身具有额外的开销),并生成“两次”缓存未命中,甚至两个连续的页面错误。除非您处于内存极其有限的环境中,或者无法控制数据布局(例如从网络接收缓冲区中提取数据包),否则最好避免未对齐的数据。
  • 必要性:如果该语言有合适的数据模型,即没有指针,并且来自外部源的任何数据都已经在较低级别编组为适当的数据类型,那么实际上就不需要未对齐的访问,并且它使编译器的寿命完全忽略这个想法要容易得多。
  • 我不知道 OCaml 特别关注什么,但如果它是“以上所有”,我当然不会感到惊讶。
© www.soinside.com 2019 - 2024. All rights reserved.