作者:Ker Liu 2022年6月27日
随着近年来Arm服务器的使用越来越广泛,越来越多的云提供商开始提供基于Arm的云实例,越来越多开发人员正在为Arm平台编写软件。
同步是软件迁移过程中的一个热门话题。基于Arm的服务器通常比其他体系结构具有更多的CPU核,强调了理解同步的重要性。
Arm和X86 CPU之间最显著的差异之一是它们的内存模型:Arm体系结构具有弱内存模型,不同于X86体系结构TSO(完全存储定序)模型。不同的内存模型可能会导致程序在一种架构上运行良好,但在另一种架构中会遇到性能问题或故障。Arm服务器更宽松的内存模型允许更多的编译器和硬件优化,以提高系统性能。但代价是,它更难理解,并且可能更容易编写错误代码。
我们制作本文档是为了分享Arm体系结构的同步专业知识,这可以帮助其他体系结构的开发人员在Arm系统上进行开发。
本文档首先介绍了Armv8-A体系结构上的同步方法,包括原子指令、Arm内存排序和数据访问屏障指令。
接下来,为了帮助读者更好地理解,我们选择了三个典型案例并进行深入分析。由于与同步相关的编程非常复杂,我们必须仔细平衡其正确性和性能。我们建议从用较重的指令纠正逻辑开始,然后通过移除一些冗余屏障或在必要时切换到较轻的屏障来提高性能。对Arm内存模型和相关指令的深入理解是实现精确高性能同步的必要条件。
在附录部分,我们首先介绍了内存模型工具(litmus测试套件),它可以帮助理解内存模型并在各种架构上验证程序。然后,我们简要概述了C++内存模型及其与Armv8-a实现之间的映射。这里我们想强调的是,在大多数开发案例中,开发人员不需要编写依赖于体系结构的汇编代码。相反,他们应该依赖定义良好的编程语言级内存模型来编写高质量代码,而不必担心架构差异。
白皮书下载地址:https://developer.arm.com/documentation/107630/1-0/?lang=en