【问题标题】:Aliasing of NEON vector data typesNEON 矢量数据类型的别名
【发布时间】: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 将允许我的指针前进到我要处理的下一个块 无需管理额外的计数和索引。

【问题讨论】:

    标签: c++ c sse simd neon


    【解决方案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__ 属性。我最好的猜测是,您在做自己想做的事情时会遇到问题,但我不确定是否会将此作为评论而不是完整答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 2015-02-26
      • 2012-07-08
      • 2014-10-09
      相关资源
      最近更新 更多