NEON 矢量数据类型的别名

Posted

技术标签:

【中文标题】NEON 矢量数据类型的别名【英文标题】:Aliasing of NEON vector data types 【发布时间】:2011-08-26 13:02:50 【问题描述】:

NEON 是否支持矢量数据类型及其标量分量的别名?

例如(英特尔 SSE)

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

以上将允许我这样做:

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

别名为 la Intel 将允许我的指针前进到我要处理的下一个块 无需管理额外的计数和索引。

【问题讨论】:

【参考方案1】:

__m128i 上的 __may_alias__ 属性应该被视为一种变通方法,即使英特尔完全搞砸了一些SEE 加载/存储内在函数。 (8 字节加载 _mm_loadl_epi64(const __m128i*) 是最搞笑的例子,但还有其他例子)。 ARM 的内在函数是正确的,因此不需要 __may_alias__

只需使用指向元素类型的指针,并使用显式加载和存储。根据我的经验,这会导致生成更好的代码,并且可能也更便携。 (ARM C 语言规范甚至允许指向 NEON 类型的指针吗?如果他们没有,我不会感到惊讶。

【讨论】:

【参考方案2】:

NEON 内在函数实现不支持向量数据类型及其标量组件的别名。

【讨论】:

任何来源/参考?【参考方案3】:

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

【讨论】:

我知道内在函数和可用的向量类型。我对类型的别名感兴趣。您提到的 int32x4_t 最终将成为一个包含 2 个双精度的结构,类似于 struct some double __private1, __private2;;(您可以在 arm_neon.h 标头中检查)。使用英特尔 SSE,如果我有一个无符号 16 位值的数组,并且使用问题中描述的类型指向该数组的指针,我可以安全地执行 __m128i* nameAlias = (__m128i*)myArray;我不确定我可以用 ARM 类型做到这一点。我在文档中找不到任何关于此的内容。 我当然可以尝试强制转换,但我很想知道这是否安全和\或这些内在函数和向量类型的实现是否支持。 int32x4_t 的声明方式与 __m128i (typedef __builtin_neon_si int32x4_t __attribute__ ((__vector_size__ (16)));) 类似,但没有 __may_alias__ 属性。我最好的猜测是,您在做自己想做的事情时会遇到问题,但我不确定是否会将此作为评论而不是完整答案。

以上是关于NEON 矢量数据类型的别名的主要内容,如果未能解决你的问题,请参考以下文章

arm NEON 数据类型中的 I8(未指定类型的整数)是啥?

ARM NEON 数据类型导致编译器崩溃

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

ArcGIS中的字段名称可以修改吗?

C 语言数据类型本质 ( 数据类型别名 | typedef 关键字 | 为复杂数据类型设置别名 | 为简单数据类型设置别名 )

性能优化篇:NEON快速入门指南