缺少 ARM64 上的 vtbl2 内在函数

Posted

技术标签:

【中文标题】缺少 ARM64 上的 vtbl2 内在函数【英文标题】:vtbl2 intrinsics on ARM64 missing 【发布时间】:2015-05-21 13:48:13 【问题描述】:

我有一些使用vtbl2_u8 ARM Neon 内在函数的代码。当我使用armv7armv7s 架构编译时,此代码可以正确编译(并执行)。但是,当我尝试编译目标 arm64 时,出现错误:

simd.h: error: call to unavailable function 'vtbl2_u8'

我的 Xcode 版本是 6.1,iPhone SDK 8.1。查看arm64_neon_internal.hvtbl2_u8 的定义有一个__attribute__(unavailable)vtbl2q_u8 有一个定义,但它采用不同的参数类型。 arm64vtbl2 内在函数是否有直接替代品?

【问题讨论】:

【参考方案1】:

如 ARM NEON 内在函数参考 (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf) 中所述,vtbl2_u8 预计将由为 ARMv8-A 中的 AArch64 状态提供 ARM C 语言扩展实现的编译器提供。请注意,同一文档会建议 vtbl2q_u8 是 Xcode 扩展,而不是 ACLE 编译器预期支持的内在函数。

那么,您的问题的答案是,不需要替换 vtbl2_u8,因为它应该提供。但是,这并不能帮助您解决真正的问题,即如何将指令与不提供该指令的编译器一起使用。

查看您在 Xcode 中可用的内容,以及记录要映射到的 vtbl2_u8 的内容,我认为您应该能够模拟预期的行为:

uint8x8_t vtbl2_u8 (uint8x8x2_t a, uint8x8_t b)

  /* Build the 128-bit vector mask from the two 64-bit halves.  */
  uint8x16_t new_mask = vcombine_u8 (a.val[0], a.val[1]);
  /* Use an Xcode specific intrinsic.  */
  return vtbl1q_u8 (new_mask, b);

虽然我没有要测试的 Xcode 工具链,但您必须确认它是否符合您的预期。

如果这出现在性能关键代码中,您可能会发现vcombine_u8 是不可接受的额外指令。基本上,uint8x8x2_t 存在于两个连续的寄存器中,这在 AArch64 和 AArch32 之间提供了不同的布局(其中 Q0 是 D0:D1)。vtbl2_u8 内在函数需要 16 位掩码。

重写uint8x8x2_t 数据的生产者以生成uint8x16_t 是解决此问题的唯一其他解决方法,并且可能是最有效的解决方法。请注意,即使在提供 vtbl2_u8 内在函数(撰写本文时主干 GCC 和 Clang)的编译器中,也会插入执行 vcombine_u8 的指令,因此您可能仍会在幕后看到额外的移动指令。

【讨论】:

你不能用下标索引a,你需要做a.val[x],否则这个解决方案提供了正确的执行。我的问题是,现在每次我调用 vtbl2 时都会插入一条额外的指令。这是在性能关键代码(因此是汇编)中,即使没有分析,这也让我感到不舒服。它是我的 shuffle 'emulation' 的一部分,它在我的 SIMD 代码中使用。 我已经修正了你指出的错误,谢谢。至于解决性能问题。从根本上讲,uint8x8x2_t 存在于两个连续的寄存器中,这在 AArch64 和 AArch32 之间提供了不同的布局(其中 Q0 是 D0:D1)。vtbl2_u8 内在函数需要 16 位掩码。重写uint8x8x2_t 数据的生产者以生成uint8x16_t 是解决此问题的唯一其他解决方法。请注意,即使在提供此内在函数(主干 GCC 和 LLVM)的编译器中,也会插入执行 vcombine_u8 的指令。有了编译器支持,您的性能问题仍然存在。 所以,事实证明,我可以在函数中走得更远,并拥有a 的组合版本,正如您所暗示的那样,这对我来说是一个更好的解决方案,因为它避免了vcombine。但是,我认为这可能最好地回答了这个问题。另外,顺便说一句:我最近也更新到 XC 6.3,似乎 vtbl1q_u8 -> vqtbl1_u8。谢谢!

以上是关于缺少 ARM64 上的 vtbl2 内在函数的主要内容,如果未能解决你的问题,请参考以下文章

缺少掩码的 AVX-512 内在函数?

缺少所需的架构 arm64

Arm64 中缺少 SSAT 和 USAT 指令的替代方案?

Xcode:MagTek iOS 库中缺少 arm64 符号

使用 Xcode 7 提交应用程序:错误 ITMS-90533 缺少架构。扩展包需要“arm64”的 UIRequiredDeviceCapabilities 值

kylin银河麒麟飞腾等arm64国产系统缺少jdk报错解决