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 内在问题的主要内容,如果未能解决你的问题,请参考以下文章
使用内在函数测试 128 位 NEON 寄存器的值为 0 的最快方法?
使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”