vreinterpret NEON 内在问题

Posted

技术标签:

【中文标题】vreinterpret NEON 内在问题【英文标题】:vreinterpret NEON Intrinsics Problem 【发布时间】:2010-11-22 18:37:32 【问题描述】:

好的,我在最后一天一直在敲我的头,我确定这很简单,所以就这样吧。为什么这段代码不起作用?我正在使用 Xcode 3.2.5 和 LLVM,当我尝试编译这样的东西时:

uint16x8_t          testUnsigned = 1,2,3,4,5,6,7,8;
int16x8_t           testSigned;

testSigned = vreinterpretq_s16_u16(testUnsigned);

我收到错误消息:“从不兼容的类型 'int' 分配给 'int16x8_t'”我所有其他内在函数都可以正常工作,但由于某种原因我无法重新解释向量。有任何想法吗?提前致谢。

【问题讨论】:

【参考方案1】:

正如 Hiroshi 指出的那样,这个特定调用似乎存在错误。但是,由于它只是在幕后进行转换,因此您可以通过任何其他类型进行操作,而不会造成任何运行时损失。例如,我测试过,这是可行的:

testSigned = vreinterpretq_s16_f32(vreinterpretq_f32_u16(testUnsigned));

【讨论】:

【参考方案2】:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/lib/gcc/arm-apple-darwin10/4.2.1/include/arm_neon_gcc.h:6947

#define vreinterpretq_s16_u16(__a) \
  (int16x8_t)__builtin_neon_vreinterpretv8hiv8hi ((int16x8_t) __a)

这似乎参数的类型是有符号整数。它闻起来像虫子。 我不确定,但你应该试试

testSigned = vreinterpretq_s16_u16((int16x8_t)testUnsigned);

【讨论】:

编译器禁止这样的 c 风格转换,唉。

以上是关于vreinterpret NEON 内在问题的主要内容,如果未能解决你的问题,请参考以下文章

用于 C++/SSE 代码的高效 NEON 内在函数

如何在 Neon 内在函数中使用 if 条件进行并行操作?

使用内在函数测试 128 位 NEON 寄存器的值为 0 的最快方法?

使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”

Android neon内在函数中“加法”和“成对加法”之间的区别?

如何使用 ARM Neon 内在函数对 IF 块进行矢量化?