【问题标题】:Intel / ARM intrinsics equivalenceIntel / ARM 内在函数等效性
【发布时间】:2016-12-19 13:38:09
【问题描述】:

我有一个使用 Intel 内部函数的 C 应用程序,例如:

__m128 _mm_add_ps (__m128 a, __m128 b)
__m128 _mm_sub_ps (__m128 a, __m128 b)
__m128 _mm_mul_ps (__m128 a, __m128 b)
__m128 _mm_set_ps (float e3, float e2, float e1, float e0)
void _mm_store_ps (float* mem_addr, __m128 a)
__m128 _mm_load_ps (float const* mem_addr)

现在,我正在尝试修改我的应用程序,以便使用名为 Gem5 的模拟器使其在 ARMv8 上运行。所以,我开始四处寻找 ARM 内部函数,并找到了这本手册 ARM® NEON™ Intrinsics Reference

好吧,我找到了算术内在函数,但我对设置、存储和加载指令有点迷茫。

任何有 ARM 内部函数经验的人都可以告诉我正确的内部函数吗?

【问题讨论】:

标签: c arm intrinsics neon gem5


【解决方案1】:

这里有一些等价物可以帮助您入门:

SSE             ARM

__m128          float32x4_t     // 4 x 32 bits floats in a vector

_mm_load_ps     vld1q_f32       // load float vector from memory

_mm_store_ps    vst1q_f32       // store float vector to memory

_mm_add_ps      vaddq_f32       // add float vectors

至于初始化一个向量,就像你可能使用的那样。 _mm_set_ps 在 SSE 中,gcc 和 clang 等编译器允许您以稍微类似于 C 的方式处理 Neon 数据类型,例如

const float32x4_t v = { 1.0f, 2.0f, 3.0f, 4.0f };

但是,如果您的编译器不支持此方法,那么您可能必须使用等效的 Neon 内在函数。

【讨论】:

  • 这样的静态初始化实际上不是 NEON 内在函数,它是 GCC 扩展(Clang 也支持)。初始化向量的唯一完全可移植的内在方法是来自标量类型数组的vld*
  • @Notlikethat:好的 - 谢谢 - 我认为它只是由 Neon SIMD 类型的定义方式决定的,没有意识到它依赖于编译器 - 我会更新答案。
  • 问题的一部分是不支持扩展的编译器。另一个是大端系统上的数据布局,当同时使用此答案中显示的 GCC 初始化语法和 Neon 内在函数时,可能会有些混乱。始终坚持使用一种编程模型(GCC 扩展或 Neon 内在函数)是避免混淆的最佳方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多