【问题标题】:Is there a way to detect VFP/NEON/Thumb/... on iOS at runtime?有没有办法在运行时在 iOS 上检测 VFP/NEON/Thumb/...?
【发布时间】:2013-07-18 00:33:33
【问题描述】:

因此,通过查询sysctlbyname("hw.cpusubtype", ...) 可以很容易地确定 iOS 设备运行哪种 CPU,但似乎没有明显的方法可以确定 CPU 实际具有哪些功能(想想 VFP、NEON、Thumb、. ..)。有人能想出办法吗?

基本上,我需要的是类似于 Linux/Android 上的 getauxval(AT_HWCAP) 的东西,它返回 CPU 支持的功能的位掩码。

需要注意的几点:

  1. 信息必须在运行时从操作系统中检索。没有预处理器定义。
  2. 胖二进制文件不是解决方案。我真的确实需要了解 ARM v6 二进制文件中的这些内容。

提前致谢!

【问题讨论】:

  • 我查看了man sysctl,但我自己没有找到任何东西。胖二进制文件不是解决方案的原因是(a)它的大小显着增加(b)在应用程序中使用哪些架构版本的决定实际上不是由我做出的,而是由客户做出的。因此,如果他们选择使用 ARM v6 二进制文件,则该二进制文件必须适用于 v7 和 v7s。同样,带有 ARM v6 和 v7s 代码的胖二进制文件必须在 v7 上运行,依此类推。
  • 鉴于 iOS 设备的数量非常合理,您可能希望通过记录每个设备的可用 CPU 功能、列出它们并简单地检测您使用的设备来简化您的问题运行时使用UIDevice 类检索可用功能列表。

标签: ios floating-point arm neon thumb


【解决方案1】:

sysctlbyname 有“hw.optional.neon”。我没有看到 VFP 的名称,除了“hw.optional.vfp_shortvector”,这是一个已弃用的功能。

【讨论】:

    【解决方案2】:

    通过Accelerator.framework 进行矩阵浮点乘法并测量执行时间。 Neon 和 VFP 驱动的数学之间的差异将足够大,您绝对不能错过。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2018-08-18
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        相关资源
        最近更新 更多