_mm_storeu_si128和_mm_loadu_si128之间的区别

时间:2018-07-10 13:06:02

标签: c intrinsics

我只是想知道这两个内在函数之间的区别是什么?英特尔内部指南没有太大帮助:

  • _mm_storeu_si128:将128位整数数据从a存储到内存中。 mem_addr不需要在任何特定边界上对齐。
  • _mm_loadu_si128:将内存中的128位整数数据加载到dst中。 mem_addr不需要在任何特定边界上对齐。

所有区别都在单词storeload上,但是区别对我来说还不清楚。

1 个答案:

答案 0 :(得分:1)

用C表示:

  • load =读取指针指向的数据。

  • store =通过指针写入。

对于像int这样的简单类型,加载和存储函数如下所示:

int load(int *p) { return *p; }

void store(int *p, int val) { *p = val; }

__m128i的加载/存储函数主要用于与已对齐或未对齐的编译器进行通信,以及直接对__m128i*进行解引用。或者对于float / double,它们也避免强制类型转换,因为_mm_loadu_ps需要一个const float* arg。


用asm术语来说,负载将数据从内存中读取到寄存器中(或作为ALU指令的源操作数)。商店将数据写入内存。

C局部变量通常保存在寄存器中,但是您的编译器当然可以像优化int *的解引用一样自由地优化内部加载/存储。例如它可能会优化存储/重新加载,因此自动柜员机不会包含执行此操作的指令。