【问题标题】:ARMv4, ARMv5E, ARMv6 assembly usage on iOS devices with ARMv7 and ARMv8-A (arm64) instructions sets在带有 ARMv7 和 ARMv8-A (arm64) 指令集的 iOS 设备上使用 ARMv4、ARMv5E、ARMv6 程序集
【发布时间】:2014-05-09 12:25:03
【问题描述】:

有很多用 C 语言编写的库,其中包含一些函数的汇编(用于 ARMv7)优化版本,这些函数显着提高了性能(其中一些使用了 NEON)。在这种情况下,我知道我应该更好地使用它们的优化版本。

现在我有一个用 C 编写的库,其中有一些用 C 和 ARMv4、ARMv5E 程序集编写的函数。使用默认编译配置,它不会尝试在 iOS 设备上使用此汇编代码。我想知道我是否应该费心尝试启用它。

是否可以在带有 ARMv7 和 ARMv8-A (arm64) 指令集的 iOS 设备上使用 ARMv4、ARMv5E、ARMv6 指令集的汇编源代码?

如果是,与用 C 编写并为 ARMv7 和 ARMv8-A (arm64) 编译的类似代码相比,它是否能提高性能?

还有一个问题:是否需要 ARMv8-A (arm64) 优化的 NEON 汇编代码?这种兼容性一般是如何工作的?这里我的意思是只有 AArch64 而不是 AArch32。对于这个问题,假设我必须为 AArch64 构建二进制文件,它应该是真正的 64 位并且不包含任何 32 位代码。

如果有人能提供兼容性表或指向该表的链接,我将不胜感激。

编辑:我根据 Notlikethat 的建议稍微编辑了我的问题。

EDIT2:我想在 Notlikethat 回答之后提供一些细节。也许对阅读此问题的人有用。

  1. 现在我有一个用 C 编写的库,其中有一些用 C 和 ARMv4、ARMv5E 程序集编写的函数。 [...] 我想知道我是否应该费心尝试启用它。 - 用汇编编写的函数纯粹是为了性能,不会做任何用 C 语言做不到的事情。

  2. 是否需要 ARMv8-A (arm64) 优化的 NEON 汇编代码? - 如果一个人有针对 ARMv7 的 NEON 优化代码,他/她是否需要为 ARMv8-A 采用/更改它?

【问题讨论】:

  • 我的回答大致是“这取决于;这取决于;在什么意义上?”这表明问题需要更加具体。当您说“ARMv8-A (arm64)”时,您是只考虑 AArch64 状态(这是一个全新的架构)还是 AArch32 状态(几乎完全向后兼容 v7) ?
  • @Notlikethat - 您能否在单独的答案中描述“这取决于;这取决于;在什么意义上?”。我非常感谢您提供如此详细的答案,而且我认为不仅是我。
  • @dwelch - 我曾尝试在 infocenter.arm.com 上搜索兼容性表,但找不到。您能否提供直接链接或告诉我应该在哪里看?
  • 获取每个处理器的文档并将它们并排比较。必须自己做一些工作,不能指望它交给你。如果您已经了解 armv8 之前的架构,那么您所要做的就是查看 armv8 文档以了解发生了什么变化。或者至少将你拥有的 asm 代码与你想要运行它的架构进行比较,或者更简单的是尝试组装它,让工具告诉你哪里出了问题。到目前为止,您本可以多次这样做,到目前为止您尝试过什么?
  • 好的,我期待有该领域经验的人提供快速的小答案或详细的答案(这对阅读此问题的任何人都非常有用)或根本没有答案(如果您不知道或不想分享)。像“自己做”这样的答案帮助不大。如果我现在有专业知识可以自己做(在合理的时间内),我不会发布这个问题。

标签: ios assembly arm


【解决方案1】:

好的,我会咬的。这与其说是一个答案,不如说是随机选择的细节和观点,以说明为什么这个问题仍然从根本上无法回答,但它可能包含一些关于该主题的有用信息。有趣地过度使用强调。

现在我有一个用 C 编写的库,其中有一些用 C 和 ARMv4、ARMv5E 程序集编写的函数。 [...] 我想知道我是否应该费心尝试启用它。

“我这里有一株植物,我不知道我是否应该费心去吃它。” 取决于它是莴苣还是冬青树,不是吗?我猜测组装是纯粹的性能,而不是实现某些东西这根本无法用高级语言表达。无论它做什么,如果您确实启用它,它是否会使您的程序明显更快/更好?v4 时代内核的手动调整组装不太可能特别无论如何,对于现代 15 级以上的超标量乱序流水线来说都是最佳的,因此编译器可能会在访问更新的指令和合适的优化设置方面做得更好,这并非不合理 - 它比您更了解指令调度和周期时序,或者我愿意。另一方面,也许它 是一些优化器无法捕捉到的尴尬,但可以通过一些更深奥的指令有效地完成。要做出这样的判断,唯一真正的方法是试试看。

是否可以在带有 ARMv7 [...] 指令集的 iOS 设备上使用 ARMv4、ARMv5E、ARMv6 指令集的汇编源代码?

在大多数情况下。除非您使用不推荐使用的指令,如 SWP,这可能会或可能不会出错,具体取决于设备的设置方式。或者取决于 v6 之前的未对齐访问行为。或者在以前的设备中恰好是一致的任何实现定义的功能。或者架构的任何其他特征,这些特征多年来发生了微妙的变化。 v6 架构是最重要的转变,但有益的是,the v7 ARM ARM 的附录 L 和 O 由 102 页组成,详细介绍了从 v4 开始的变化。 在不详细了解您的代码的情况下,我们怎么能说出其中的相关内容(如果有)?

是否可以在带有 [...] ARMv8-A (arm64) 指令集的 iOS 设备上使用 ARMv4、ARMv5E、ARMv6 指令集的汇编源代码?

没有。 AArch64 是一种全新的架构、新的指令集、新的汇编语言。许多概念、助记符和语法的一般 感觉 与现在的 AArch32 相似,但指令集是完全不同的设计。对于初学者来说,寄存器名称是不同的——阅读any kind of manual 会立即告诉你的那种事情。

如果是,与用 C 编写并为 ARMv7 和 ARMv8-A (arm64) 编译的类似代码相比,它是否能提高性能?

我们是在谈论仔细选择最适合架构的算法,由对流水线模型、周期时间等有详细了解的专家针对特定微架构实施进行调整,还是那种天真的“组装速度更快” ,尼特?”最终比编译器在-O1 上输出的代码慢 4 倍? (这也与 ARM 无关)无论如何,请参阅问题 1。

是否需要 ARMv8-A (arm64) 优化的 NEON 汇编代码?

你不需要它,你总是可以有慢代码。当然,如果您正在执行 SIMD 类型的操作,那么不使用 NEON 会有点愚蠢,但您不一定需要直接进行组装 - 如果您正在做简单的基于循环的东西,那么自动矢量化编译器可能会处理它。对于更复杂的事情,我看到的数据(来自绝对知道他们在做什么的人)表明,内在函数可以让您以更少的工作量获得大约 70-95% 的手动调整组装速度。为了获得绝对的最佳性能,是的,启动汇编程序并花费数周时间对缓存未命中和寄存器停顿进行微基准测试,同时将其调整至完美。

这种兼容性一般如何运作?

什么兼容性?那个因为是不同的指令集而不存在?

【讨论】:

  • 感谢您的详细解答。基本上它涵盖了我想知道的大约 95%。我现在看到你不得不在某些地方猜测我真正想问的问题,但幸运的是你猜对了:)。
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多