AArch64是否支持未对齐的访问



AArch64本机支持未对齐访问吗?我之所以这么问,是因为目前ocamlopt假设"否"。

如果没有打开用于严格对齐检查的硬件位(就像在x86上一样,没有任何通用操作系统会这样做),AArch64确实允许使用常规加载/存储指令对普通(而不是设备)内存进行未对齐的数据访问。

然而,编译器仍然希望维护对齐数据的原因有几个:

  • 读取和写入的原子性:自然对齐的加载和存储保证是原子性的,即如果一个线程同时读取对齐的内存位置,而另一个线程写入相同的位置,则读取将只返回旧值或新值。如果位置与访问大小不一致,则这种保证不适用——在这种情况下,读取可能会返回两个值的未知混合。如果该语言有一个依赖于不发生这种情况的并发模型,那么它可能不会允许未对齐的数据
  • 原子读-修改-写操作:如果该语言有一个并发模型,其中某些或所有数据类型可以被原子地更新(而不仅仅是读或写),那么对于这些操作,代码生成将涉及使用加载-独占/存储-独占指令来建立原子读-写序列,而不是简单的加载/存储。如果地址与访问大小不一致,独占指令将始终出错
  • 效率:在大多数内核上,未对齐的访问最多仍需要比正确对齐的访问长至少1个周期。在最坏的情况下,单个未对齐的访问可能会跨越缓存线边界(这本身就有额外的开销),并生成两个缓存未命中,甚至两个连续的页面错误。除非您处于内存受限的环境中,或者无法控制数据布局(例如,从网络接收缓冲区中提取数据包),否则最好避免未对齐的数据
  • 必要性:如果该语言有一个合适的数据模型,即没有指针,并且来自外部源的任何数据都已经在较低级别整理成合适的数据类型,那么实际上就不需要进行未对齐的访问,而且完全忽略这个想法会让编译器的生活变得容易得多

我不知道OCaml特别关注什么,但如果是"以上所有内容",我当然不会感到惊讶。

最新更新