我只是想知道这两个内在函数之间的区别是什么?英特尔内部指南没有太大帮助:
_mm_storeu_si128
:将128位整数数据从a存储到内存中。 mem_addr
不需要在任何特定边界上对齐。_mm_loadu_si128
:将内存中的128位整数数据加载到dst中。 mem_addr
不需要在任何特定边界上对齐。所有区别都在单词store
或load
上,但是区别对我来说还不清楚。
答案 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 *
的解引用一样自由地优化内部加载/存储。例如它可能会优化存储/重新加载,因此自动柜员机不会包含执行此操作的指令。