本指南旨在帮助任何将使用霓虹灯内部函数的现有矢量处理代码迁移到氦内部函数的人。我们将研究不同复杂度的霓虹灯代码示例,并研究如何将该霓虹灯代码迁移到氦。通过研究这些示例,您将了解一些通用的迁移原则,这些原则可用于将您自己的Neon代码迁移到氦。迁移是必要的,因为尽管氖和氦之间有相似之处,但它们基于不同的架构。因此,软件不能在两者之间直接移植。
氖和氦的相似之处包括:
•矢量寄存器为128位宽。
•浮点单元(FPU)中的寄存器被重新用作矢量寄存器。
•一些矢量指令在氦和氖之间很常见。
然而,氖和氦之间也存在差异,包括以下方面:
•矢量寄存器的数量。氦支持8个矢量寄存器,而霓虹灯支持16或32个矢量寄存器。•许多氦指令同时使用矢量寄存器和通用寄存器。在霓虹灯中,只有少数指令以这种方式混合使用寄存器。然而,一些Neon指令通过立即值或使用单个矢量元素作为标量来混合矢量和标量值。•氦支持较新的数据类型,如fp16,而旧架构的霓虹灯扩展不支持这种数据类型。•氦的一些特性,如低开销分支和预测,是氦特有的。•Neon为缩小和扩大操作提供了64位半矢量大小。氦气不支持此功能。
•霓虹灯提供交错的三路加载和存储。氦气不支持此功能。•Neon和Helium提供了不同的数据扩展和缩小方案。由于这些差异,没有简单的方法可以自动将Neon内部代码直接转换为Helium。然而,这并不一定意味着您必须从头开始重新设计代码。以下策略可以帮助迁移:
•如果Neon代码已经矢量化,软件中的算法结构可以重复使用,并对氦进行调整。•如果Neon代码使用内部函数,编译器会隐藏所有寄存器差异。•如果Neon代码使用内部函数,那么一些内部函数在Neon和Helium之间是通用的。
本指南提供了示例来说明迁移过程,每个示例都包括以下内容:
•原始霓虹灯代码,以及对霓虹灯内部函数执行功能的高级解释