【问题标题】:Some certain neon instruction in <arm_neon.h> is not available in Jetson Xavier (ARMv8.2)<arm_neon.h> 中的某些特定霓虹灯指令在 Jetson Xavier (ARMv8.2) 中不可用
【发布时间】:2021-10-12 02:55:10
【问题描述】:

存在于 中的“vld1q_u16_x2”在 Jetson Xavier (ARMv8.2) 中不可用。示例代码与附加代码相同。我已经在 M1、A53 和 A72 上尝试过代码,一切正常。

但是,Jetson Xavier 会给出以下警告和错误: “警告:函数 'vld1q_u16_x2' 的隐式声明”和“错误:从类型 'int' 分配给类型 'uint16x8x2_t {aka struct uint16x8x2_t}' 时类型不兼容。src1 = vldlq_u16_x2(&origin )" .

ARMv8.2 不支持这条指令吗?我们想知道一个解决方案。

#include <arm_neon.h>

int main()
{
    uint16x8x2_t src1, src2;
    uint16_t origin = 0x33;

    src1 = vld1q_u16_x2(&origin);

    return 0;
}

【问题讨论】:

  • 根据 Jake 在下面的回答,问题是缺乏对 Aarch32 的 gcc 支持。你可以在gcc.gnu.org/bugzilla 提交一个错误,但看起来你的平台也可以只针对 Aarch64

标签: gcc compiler-errors arm neon armv8


【解决方案1】:

这不是关于 ARMv8.2,而是 GCC。 GCC's 32-bit arm_neon.h 目前是missing 相当多的功能应该在那里。

这些也是a fairly recent addition to clang;它们在版本 9 之前不可用。

GCC 上的 AArch64 支持往往更好; GCC's 64-bit arm_neon.h 中存在许多这些功能,尽管它们确实应该存在于两者中。上次我查看 32 位模式下存在一些函数但 64 位标头中缺少一些函数,32 位和 64 位都缺少一些函数,但 64 位中存在几十个函数但在 32 位中缺失。

FWIW,clang 这边的情况比较好;它们只是缺少一些功能...如果您可以使用 clang 代替,那可能是一个不错的选择。

【讨论】:

    【解决方案2】:

    无论工具链如何,aarch32 模式都不支持所有这些 x2/x3/x4 足够,尽管由于 ARM32 neon 具有适当的指令,这很有可能。

    您应该将目标限制为aarch64

    这很愚蠢,NEON 内在函数急需改进:没有 vtbl1qvtbl2qvtbl3qvtbl4q,即使 ARM64 具有接受 128 位向量的 tbl/tbx 指令。

    MS Visual Studio 已经自带(?)arm64_neon.h,支持上述所有功能。

    PS: 걍 어셈블리로 짜세요。

    【讨论】:

    • 您在寻找vqtbl1q/vqtbx3q instructions吗?
    • @BenClark 什么??????谢谢你。但是q 是干什么用的???
    • q 代表“四字”,即 128 字节。通常它只是在指令之后,因为输出是 128 字节,但有时如果有一个需要 128 字节的中间步骤(特别是用于处理溢出等饱和命令),则在开头会有一个 q
    • 我说的是第一个q,它通常是饱和标志。而且我不知道它有什么用,因为说明 tbltbx 没有任何标志。
    猜你喜欢
    • 2013-03-06
    • 2013-11-07
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多