英特尔/ ARM内在函数等价

A.n*_*chi 2 c arm intrinsics neon gem5

我有一个使用英特尔内在函数的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)
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试修改我的应用程序,以便使用名为Gem5的模拟器使其在ARMv8上运行.所以,我开始寻找ARM内在函数,我发现了这个手册ARM®NEON™内在函数参考

好吧,我找到了算术内在函数,但是我对设置,存储和加载指令有点失落.

有ARM内在函数经验的人可以告诉我正确的内在函数吗?

Pau*_*l R 5

以下是一些可以帮助您入门的内容:

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
Run Code Online (Sandbox Code Playgroud)

至于初始化一个向量,就像_mm_set_ps在SSE中一样,gcc和clang之类的编译器允许你以类似于C的方式使用Neon数据类型,例如:

const float32x4_t v = { 1.0f, 2.0f, 3.0f, 4.0f };
Run Code Online (Sandbox Code Playgroud)

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

  • 像这样的静态初始化实际上并不是NEON内在函数,它是GCC扩展(也由Clang支持).初始化向量的唯一完全可移植的内在方法是来自标量类型数组的"vld*". (4认同)
  • 问题的一部分是不支持扩展的编译器.另一个是big-endian系统上的数据布局,当使用本答案中显示的GCC初始化语法和Neon内在函数时,这可能会有些混乱.始终坚持一个编程模型(GCC扩展或Neon内在函数)是避免混淆的最佳方法. (3认同)