C _mm_storeu_si128和_mm_loadu_si128之间的差异

C _mm_storeu_si128和_mm_loadu_si128之间的差异,c,intrinsics,C,Intrinsics,我只是想知道这两个内在函数之间有什么区别。《英特尔内部指南》帮助不大: \u mm\u storeu\u si128:将128位整数数据从存储区存储到内存中。mem\u addr无需在任何特定边界上对齐 \u mm\u loadu\u si128:将128位整数数据从内存加载到dst。mem\u addr无需在任何特定边界上对齐 所有的区别都在单词store或load上,但我不清楚区别 用C表示: load=读取指针指向的数据 store=通过指针写入 对于像int这样的简单类型,加载和

我只是想知道这两个内在函数之间有什么区别。《英特尔内部指南》帮助不大:

  • \u mm\u storeu\u si128
    :将128位整数数据从存储区存储到内存中。
    mem\u addr
    无需在任何特定边界上对齐
  • \u mm\u loadu\u si128
    :将128位整数数据从内存加载到dst。
    mem\u addr
    无需在任何特定边界上对齐
所有的区别都在单词
store
load
上,但我不清楚区别

用C表示:

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

  • store=通过指针写入

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

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

void store(int *p, int val) { *p = val; }
\uuuum128i
加载/存储函数主要用于与编译器进行对齐与未对齐的通信,而不是直接取消引用
\uuuum128i*
。或者对于
float
/
double
,它们也避免强制转换,因为
\u mm\u loadu\u ps
采用
常量float*
参数


在asm术语中,加载将数据从内存读入寄存器(或作为ALU指令的源操作数)。存储器将数据写入存储器


C局部变量通常保存在寄存器中,但当然,编译器可以自由地优化内部加载/存储,就像它可以优化
int*
的解引用一样。e、 g.它可能会优化存储/重新加载,以便asm不会包含执行此操作的指令。

store
用于将数据从寄存器移动到内存。在这里,将128位从寄存器移动到内存<代码>加载则相反,将128位从内存移动到寄存器。寄存器是一个类似于uuum128i/uuuuum64/uuuuuum512/…的变量。。。内存是无符号字符、无符号整数等?因此,如果我想用16个无符号字符填充uu m128i结构,我';我将使用_mm_loadu_si128,相反的是_mm_storeu_si128,它用_m128i结构填充无符号字符数组。我说得对吗?