c++ - 使用 union (封装在结构中)绕过 neon 数据类型的转换

标签 c++ gcc arm vectorization neon

我使用 SSE 实现了向量化内在函数的第一种方法,其中基本上只有一种数据类型 __m128i。切换到 Neon 我发现数据类型和函数原型(prototype)更加具体,例如uint8x16_t(由 16 个无符号字符组成的 vector )、uint8x8x2_t(2 个 vector ,每个 vector 有 8 个无符号字符)、uint32x4_t(具有 4 个 uint32_t 的 vector )等。

首先我很热情(更容易找到对所需数据类型进行操作的确切函数),然后我发现当想要以不同的方式处理数据时是多么的困惑。使用specific casting operators会带走我永远。该问题也得到解决here 。然后我想到了将 union 封装到结构中的想法,以及一些转换和赋值运算符。

struct uint_128bit_t { union {
        uint8x16_t uint8x16;
        uint16x8_t uint16x8;
        uint32x4_t uint32x4;
        uint8x8x2_t uint8x8x2;
        uint8_t uint8_array[16] __attribute__ ((aligned (16) ));
        uint16_t uint16_array[8] __attribute__ ((aligned (16) ));
        uint32_t uint32_array[4] __attribute__ ((aligned (16) ));
    };

    operator uint8x16_t& () {return uint8x16;}
    operator uint16x8_t& () {return uint16x8;}
    operator uint32x4_t& () {return uint32x4;}
    operator uint8x8x2_t& () {return uint8x8x2;}
    uint8x16_t& operator =(const uint8x16_t& in) {uint8x16 = in; return uint8x16;}
    uint8x8x2_t& operator =(const uint8x8x2_t& in) {uint8x8x2 = in; return uint8x8x2;}

};

这种方法对我有用:我可以使用 uint_128bit_t 类型的变量作为参数并使用不同的 Neon 内在函数进行输出,例如vshlq_n_u32vuzp_u8vget_low_u8(在本例中仅作为输入)。如果需要,我可以使用更多数据类型来扩展它。 注意:数组是为了轻松打印变量的内容。

这是正确的处理方式吗?
是否有隐藏的缺陷?
我是不是重新发明了轮子?
(aligned属性有必要吗?)

最佳答案

根据 C++ 标准,这种数据类型几乎没有用(对于您想要的目的来说当然也是如此)。这是因为从 union 体的非事件成员中读取数据是未定义的行为。

但是,您的编译器有可能 promise 使此工作正常进行。但是,您没有询问任何特定的编译器,因此无法对此进行进一步评论。

关于c++ - 使用 union (封装在结构中)绕过 neon 数据类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29208668/

相关文章:

c++ - 更改版本后降级 g++

c - 如何在 Linux 上使用另一个 libC 进行编译? (海湾合作委员会)

linux - 如何测量我的算法消耗的功率?

c - 这 ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE ) 是什么意思?

c++ - std::bit_cast 与 std::array

c++ - 变量在临时存储中存在多长时间?

c++ - 我可以在#include 指令中使用预处理器变量吗?

macos - 分离编译和链接 - 在 D 中

embedded - 有没有人成功地将 Prex 移植到 Stellaris 芯片?

c++ - 列表容器 - 使用不相关的类型存储和移除