X86 如何指定与_mm_mul_ps对齐

X86 如何指定与_mm_mul_ps对齐,x86,sse,simd,memory-alignment,intrinsics,X86,Sse,Simd,Memory Alignment,Intrinsics,我使用一个SSE内在函数,其中一个参数作为内存位置(\u mm\u mul\u ps(xmm1,mem)) 我怀疑哪个会更快: xmm1 = _mm_mul_ps(xmm0,mem) // mem is 16 byte aligned 或: 有没有办法指定与\u mm\u mul\u ps()内在的对齐方式?没有\u mm\u mul\u ps(reg,mem)表单,即使存在mulps reg,mem指令表单- 你可以做的是\u mm\u mul\u ps(reg,\u mm\u load\

我使用一个SSE内在函数,其中一个参数作为内存位置(
\u mm\u mul\u ps(xmm1,mem)

我怀疑哪个会更快:

xmm1 = _mm_mul_ps(xmm0,mem)  // mem is 16 byte aligned
或:


有没有办法指定与
\u mm\u mul\u ps()
内在的对齐方式?

没有
\u mm\u mul\u ps(reg,mem)
表单,即使存在
mulps reg,mem
指令表单-

你可以做的是
\u mm\u mul\u ps(reg,\u mm\u load\u ps(mem))
,它将与写在两行中完全相同

您可以使用
\u mm\u load\u ps
\u mm\u loadu\u ps
指定您是否希望数据对齐。顺便说一句,对从Haswell Microach开始的对齐数据执行未对齐加载不会有任何惩罚

另一方面,编译器应该足够聪明,能够弄清楚是先加载然后执行乘法,还是从内存执行乘法更好


在某些情况下,提前一点加载以改进软件管道可能是有意义的,但通常这将是下一个优化级别。

这可能没有任何区别-让编译器处理繁重的工作,不要太担心次要的细节-当然,您应该对代码进行基准测试/评测,看看真正重要的是什么。gcc接受使用任意表达式的代码
\uuuu m128
键入内部函数的参数,包括数组查找或指针解引用。如果您想告诉编译器需要未对齐的加载,或者其他什么,那么只需要加载内部函数。其他编译器是否有类似
\u mm\u mul\u ps(var,vec\u array[i])
的问题?据我所知,这应该是合法的,但它不是
mem
表单。另一个缺点是,如果编译器不能确定缓冲区对齐方式(在一般情况下这是很难做到的),那么它很可能会使用未对齐的加载。是的,或者它会放置一个标量序言,直到到达对齐点为止。我的观点是,您不需要具有
mem
形式的内在函数,因为您可以在内存中的任何向量上使用指针解引用操作符
*
。如果您正在为AVX目标编译,那么编译器可以从内部函数生成VEX编码的指令,从而消除对齐要求。但除此之外,我同意,显式使用对齐的加载指令有一些用处,因为这应该告诉编译器,未对齐上的segfault就是您想要的。我同意不需要
mem
forms。但是:1。当使用内部函数时,编译器不进行prolog,用户必须处理它。它只发生在自动矢量化的情况下。2.VEX编码并没有消除对齐加载的对齐要求,但它很好地消除了对对齐数据使用未对齐加载的惩罚,所以编译器(至少ICC)在编译AVX2.1时总是会生成未对齐加载。是的,德普,我在考虑自动矢量化。2.VEX意味着编译器可以将未对齐的加载作为内存操作数折叠成非
mov
指令。
xmm0 = _mm_load_ps(mem);
xmm1 = _mm_mul_ps(xmm1,xmm0);