这是从 NEON uint8x16_t 向量中提取字节的正确方法吗?
Is this a proper way to extract a byte from a NEON uint8x16_t vector?
我是 NEON 内部函数的初学者,我想使用 uint8x16_t
和 uint8x16x4_t
。
在使用它时,我遇到了一种情况,我想从 uint8x16_t
中提取一个字节。由于不了解细节,我不小心开始在运行时使用 []
运算符从中提取字节。但是我的编译器 CLANG 愉快地编译了代码,没有给出任何错误或警告,我得到了想要的输出。
我搜索了 ARM 参考指南,似乎从未找到任何关于在 uint8x16_t
向量上使用 []
运算符的参考,毕竟它是一个 128 位寄存器而不是数组! ? (如果我错了,请纠正我)。
因此,为了解决这个问题,我在头文件 arm_neon.h
中跟踪了矢量 uint8x16_t
的来源,我发现了这个:
typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;
这是如何存储在计算机内存中的?
为什么我可以直接在它上面使用 []
运算符,我应该在哪里
正在使用:
uint8_t 获取(uint8x16_t *r, int index) {
无符号字符 u[16];
vst1q_u8(u, *r);
return你[指数];
}
而不是:
uint8_t 获取(uint8x16_t *r, int index){
return (*r)[索引];
} // 这在性能上要快得多!
非常感谢您的帮助!
Why am I able to use the []
operator on it directly
因为 gcc / clang 根据 GNU C 本机向量 (https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html) 定义它,它确实有明确定义的运算符规则。
ARM 的文档可能不保证 []
可以工作,并且可能有一些 ARM 编译器无法工作。
它与任何其他类型一样存储在内存中(或不存储,如果只是在寄存器中或优化掉)。对象表示在最低地址处具有最低元素。 uint8x16_t
对象在大多数方面都类似于 int
对象,编译器能够决定将它们保存在哪里,并将它们优化掉等等。
我是 NEON 内部函数的初学者,我想使用 uint8x16_t
和 uint8x16x4_t
。
在使用它时,我遇到了一种情况,我想从 uint8x16_t
中提取一个字节。由于不了解细节,我不小心开始在运行时使用 []
运算符从中提取字节。但是我的编译器 CLANG 愉快地编译了代码,没有给出任何错误或警告,我得到了想要的输出。
我搜索了 ARM 参考指南,似乎从未找到任何关于在 uint8x16_t
向量上使用 []
运算符的参考,毕竟它是一个 128 位寄存器而不是数组! ? (如果我错了,请纠正我)。
因此,为了解决这个问题,我在头文件 arm_neon.h
中跟踪了矢量 uint8x16_t
的来源,我发现了这个:
typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;
这是如何存储在计算机内存中的?
为什么我可以直接在它上面使用
[]
运算符,我应该在哪里 正在使用:uint8_t 获取(uint8x16_t *r, int index) { 无符号字符 u[16]; vst1q_u8(u, *r); return你[指数]; }
而不是:
uint8_t 获取(uint8x16_t *r, int index){ return (*r)[索引]; } // 这在性能上要快得多!
非常感谢您的帮助!
Why am I able to use the
[]
operator on it directly
因为 gcc / clang 根据 GNU C 本机向量 (https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html) 定义它,它确实有明确定义的运算符规则。
ARM 的文档可能不保证 []
可以工作,并且可能有一些 ARM 编译器无法工作。
它与任何其他类型一样存储在内存中(或不存储,如果只是在寄存器中或优化掉)。对象表示在最低地址处具有最低元素。 uint8x16_t
对象在大多数方面都类似于 int
对象,编译器能够决定将它们保存在哪里,并将它们优化掉等等。