繁体   English   中英

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

[英]ARMv4, ARMv5E, ARMv6 assembly usage on iOS devices with ARMv7 and ARMv8-A (arm64) instructions sets

有很多用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的建议略微编辑了我的问题。

编辑2:我想在Notlikethat回答之后提供一些细节。 也许这对阅读这个问题的人有用。

  1. 现在我有一个用C语言编写的库,它有一些用C和ARMv4,ARMv5E汇编编写的函数。 [...]我想知道我是否应该尝试启用它。 - 用汇编语言编写的函数纯粹是为了提高性能,不做任何无法在C中完成的事情。

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

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

现在我有一个用C语言编写的库,它有一些用C和ARMv4,ARMv5E汇编编写的函数。 [...]我想知道我是否应该尝试启用它。

“我在这里有一家工厂,我想知道我是否应该费心去吃它。” 取决于它是莴苣还是冬青树丛,不是吗? 猜测程序集是作为一个纯粹的性能事物,而不是实现一些根本无法用更高级语言表达的东西。 不管它, 它让你的程序可测量更快/更好,如果能吗? 对于v4时代核心的手动调整组件,对于现代15级以上的超标量无序管道来说不太可能是特别优化的,因此编译器可以更好地访问更新的指令并不是不合理的和合适的优化设置 - 它比你或我更了解指令调度和周期时间。 在另一方面,也许一些尴尬的是,优化器不能赶上,但可以用更深奥的说明了一把有效的进行。 做出这样判断的唯一真正方法是尝试并看到

是否可以在具有ARMv7指令集的iOS设备上使用ARMv4,ARMv5E,ARMv6指令集的汇编源代码?

在大多数情况下 除非您使用SWP类的弃用指令,否则可能会或可能不会出现故障,具体取决于设备的设置方式。 或者依赖于v6之前的未对齐访问行为。 或者任何实现定义的功能恰好在以前的设备中保持一致。 或者这些架构的任何其他功能多年来都有微妙的变化。 v6架构是最重要的转变,但有用的是,v7 ARM ARM的附录L和O由102页组成,详细说明了这些更改,一直到v4。 如果不详细了解您的代码, 我们怎么能说出相关的内容(如果有的话)?

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

AArch64是一个全新的架构,新的指令集,新的汇编语言。 许多概念,助记符和语法的一般感觉都很熟悉现在的AArch32,但是指令集是一种根本不同的设计。 对于初学者来说,注册名称是不同的 - 阅读任何类型的手册都会立即告诉你。

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

我们是在谈论最适合该架构的算法的精心选择,由具有管道模型,周期时间等详细知识的专家调整特定的微体系结构实现,还是那种天真的“组装更快,更真实? “ 代码最终比编译器在-O1上吐出的速度慢4倍? (也没有关于这个特定于ARM的特定内容)无论如何, 请参阅问题1

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

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

这种兼容性如何起作用?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM