c – 使用union(封装在结构中)绕过霓虹灯数据类型的转换

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

首先,我很热情(更容易找到在所需数据类型上运行的确切函数),然后我看到了想要以不同方式处理数据时的混乱.使用specific casting operators将永远带我.这个问题也在here中得到解决.然后我提出了一个封装成结构的联合的想法,以及一些转换和赋值运算符.

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(在这种情况下仅作为输入).如果需要,我可以使用更多数据类型扩展它.
注意:数组是为了轻松打印变量的内容.

这是正确的进行方式吗?
有任何隐藏的缺陷吗?
我重新改造了车轮吗?
(对齐的属性是否必要?)

解决方法:

根据C标准,这种数据类型几乎没用(当然也是如此).这是因为从联合的非活动成员读取是未定义的行为.

但是,您的编译器可能会承诺使其工作.但是,您没有询问任何特定的编译器,因此无法对此进行进一步评论.

上一篇:android – ARM汇编程序NEON – 提高性能


下一篇:android – ARM Neon Assembler – 奇怪的管道问题