我使用 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_u32
、vuzp_u8
、vget_low_u8
(在本例中仅作为输入)。如果需要,我可以使用更多数据类型来扩展它。
注意:数组是为了轻松打印变量的内容。
这是正确的处理方式吗?
是否有隐藏的缺陷?
我是不是重新发明了轮子?
(aligned属性有必要吗?)
最佳答案
根据 C++ 标准,这种数据类型几乎没有用(对于您想要的目的来说当然也是如此)。这是因为从 union 体的非事件成员中读取数据是未定义的行为。
但是,您的编译器有可能 promise 使此工作正常进行。但是,您没有询问任何特定的编译器,因此无法对此进行进一步评论。
关于c++ - 使用 union (封装在结构中)绕过 neon 数据类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29208668/