2011-08-26 95 views
2

NEON是否支持矢量数据类型与其标量组件的混叠?NEON矢量数据类型的混叠

EG(英特尔SSE)

typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); 

以上会允许我这样做:

__m128i* somePtr; 
somePtr++;//advance to the next block 

走样啦英特尔它将允许我指针前进到下一个块我要处理 而不管理额外的计数和索引。

回答

1

NEON内在函数实现不支持向量数据类型与其标量组件混叠。

+0

任何来源/参考? – Antonio

0

当您指定-mfpu_neon时,GCC支持一堆内部函数。我猜测你会感兴趣的是int32x4_t。有关所有可用类型的更多信息,请参阅ARM site

+0

我知道内在因素和可用的矢量类型。我对类型的别名感兴趣。您提到的int32x4_t将作为包含2个类似于struct some {double __private1,__private2;};(您可以在arm_neon.h头文件中检查该类型)的结构包含2个结构。对于Intel SSE,如果我有一个无符号16位值的数组,并且使用问题中描述的类型指向该数组的指针,我可以安全地执行__m128i * nameAlias =(__m128i *)myArray;我不确定我能用ARM类型来做到这一点;我在文档中找不到任何内容。 – celavek

+0

我当然可以尝试强制进行转换,但我很想知道这是否安全,并且可以通过实现这些内部函数和向量类型来支持。 – celavek

+0

int32x4_t被声明为__m128i('typedef __builtin_neon_si int32x4_t __attribute__((__vector_size__(16)));'),但没有'__may_alias__'属性。我最好的猜测是,你会遇到问题做你想做的事情,但我不确定,所以将这作为评论而不是完整的答案。 –

2

__m128i__may_alias__属性应该被看作是一个工作围绕这使得它可以编写严格走样,正确的代码,即使英特尔完全搞砸了一些SEE加载/存储内在的签名。 (8字节加载_mm_loadl_epi64(const __m128i*)是最可笑的例子,但也有其他的)。 ARM得到了他们的内在权利,所以不需要__may_alias__

只需使用指向元素类型的指针,并使用显式加载和存储。根据我的经验,这会导致更好的代码生成,并且可能也更具可移植性。 (ARM C语言规范是否允许指向NEON类型的指针?如果他们不这样做,我不会感到惊讶)。