具有ARMv7和ARMv8-A(arm64)指令集的iOS设备上的ARMv4,ARMv5E,ARMv6程序集用法

时间:2014-05-09 12:25:03

标签: ios assembly arm

有很多用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中完成的事情。

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

1 个答案:

答案 0 :(得分:3)

好的,我会咬人的。这不是一个答案,而是随机选择细节和意见来说明为什么这个问题仍然根本无法解决,但可能切向包含有关该主题的一些有用信息。而且有趣地过度使用重点。

  

现在我有一个用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%的手动调整组装速度,而且工作量少得多。为了获得绝对最高的性能,那么,启动汇编程序并花费数周的时间对您的缓存未命中进行微基准测试,并在调整到完美时注册档位。

  

这种兼容性如何起作用?

兼容性?由于它是一个不同的指令集而不存在的那个?