缺少 ARM64 上的 vtbl2 内在函数
Posted
技术标签:
【中文标题】缺少 ARM64 上的 vtbl2 内在函数【英文标题】:vtbl2 intrinsics on ARM64 missing 【发布时间】:2015-05-21 13:48:13 【问题描述】:我有一些使用vtbl2_u8
ARM Neon 内在函数的代码。当我使用armv7
或armv7s
架构编译时,此代码可以正确编译(并执行)。但是,当我尝试编译目标 arm64
时,出现错误:
simd.h: error: call to unavailable function 'vtbl2_u8'
我的 Xcode 版本是 6.1,iPhone SDK 8.1。查看arm64_neon_internal.h
,vtbl2_u8
的定义有一个__attribute__(unavailable)
。 vtbl2q_u8
有一个定义,但它采用不同的参数类型。 arm64
的 vtbl2
内在函数是否有直接替代品?
【问题讨论】:
【参考方案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 内在函数的主要内容,如果未能解决你的问题,请参考以下文章
Arm64 中缺少 SSAT 和 USAT 指令的替代方案?
Xcode:MagTek iOS 库中缺少 arm64 符号
使用 Xcode 7 提交应用程序:错误 ITMS-90533 缺少架构。扩展包需要“arm64”的 UIRequiredDeviceCapabilities 值