在运行时,有没有一种方法可以检测iOS设备是否支持VFP/NEON/Thumb等技术?

4
因此,通过查询 sysctlbyname("hw.cpusubtype", ...),很容易确定iOS设备所运行的CPU类型,但似乎没有明显的方法来确定CPU实际具有的功能(如VFP、NEON、Thumb等)。有人能想到一种方法吗?
基本上,我需要类似于Linux/Android上的getauxval(AT_HWCAP)的东西,它返回由CPU支持的特性的位掩码。
需要注意的几点:
  1. 必须从操作系统中在运行时检索信息,不能使用预处理器定义。
  2. Fat二进制文件不是解决方案。我真的需要在ARM v6二进制文件中了解这些内容。
提前感谢!

我查看了man sysctl,但没有发现什么有用的信息。使用fat二进制文件不是解决方案的原因是:(a)它会显著增加文件大小;(b)确定在应用程序中使用哪些架构版本实际上不是由我决定的,而是由客户决定的。因此,如果他们选择要有一个ARM v6二进制文件,那个二进制文件必须能够在v7和v7s上运行。同样,带有ARM v6和v7s代码的fat二进制文件必须能够在v7上运行,以此类推。 - user438034
鉴于iOS设备数量相当合理,您可能希望通过了解每个设备的可用CPU功能列表来简化问题,并在运行时使用UIDevice类检测您所在的设备以检索可用功能列表。 - mbrenon
3个回答

2

sysctlbyname 拥有“hw.optional.neon”选项,但我没有看到VFP的名称,除了“hw.optional.vfp_shortvector”之外,这是一个已经过时的功能。


1

通过accelerate.framework执行矩阵浮点乘法并测量执行时间。在Neon和VFP驱动的数学之间巨大的差异是非常明显的,你绝对不会错过。

Thumb始终存在,而NEON的存在意味着armv7 = Thumb2。


0

首先,仔细考虑一下是否真的需要支持iOS的armv6二进制文件。根据已发布的版本份额统计数据,大约98.5%的iOS设备正在运行iOS 5.0或更高版本,这些版本不支持armv6设备(显然,armv6二进制文件仍将在当前iOS版本上运行,但所有新应用程序实际上都应该针对armv7进行定位;今天,您的客户没有理由为iOS发货armv6二进制文件)。

同样,您对代码大小的担忧是错误的。如果您提供了一个fat库,并且您的客户针对它构建了一个armv6二进制文件,则只有您库中的armv6位将被构建到他们的应用程序中。此外,代码大小通常只占应用程序包大小的极小部分;应用程序的大部分大小来自其他资源。

好的。除此之外,如果您真的想追求这个目标:VFP和thumb在所有iOS设备上都受支持,因此无需检查支持情况。您可以使用Eric Postpischil建议的方法检查NEON和thumb-2(所有armv7 iOS设备都具有NEON支持,因此NEON的可用性与thumb-2的可用性完全一致)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接