x86 - 如何使用 _mm_mul_ps 指定对齐方式

标签 x86 sse simd memory-alignment intrinsics

我使用 SSE 内在函数,其中一个参数作为内存位置 (_mm_mul_ps(xmm1,mem))。

我怀疑哪个会更快:

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

或者:

xmm0 = _mm_load_ps(mem);
xmm1 = _mm_mul_ps(xmm1,xmm0);

有没有办法指定与_mm_mul_ps()内在对齐?

最佳答案

即使存在 mulps reg,mem 指令形式,也不存在 _mm_mul_ps(reg,mem) 形式 - https://msdn.microsoft.com/en-us/library/22kbk6t9(v=vs.90).aspx

您可以做的是_mm_mul_ps(reg,_mm_load_ps(mem)),它与用两行编写完全相同。

您可以使用_mm_load_ps_mm_loadu_ps来指定是否希望数据对齐。顺便说一句,从 Haswell 微架构开始对对齐数据进行未对齐加载不会受到任何惩罚。

另一方面,编译器应该足够聪明,能够确定是先进行加载再进行乘法,还是从内存中进行乘法会更好。

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

关于x86 - 如何使用 _mm_mul_ps 指定对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315892/

相关文章:

assembly - 处理器如何知道程序结束?

c++ - 使用 SSE 的任意位置 2 输入混洗

stream - Streaming 在 Streaming SIMD Extensions (SSE) 中代表什么?

c - 如何对齐 16 位整数以用于 SSE 内在函数

assembly - 如何将(最多)16 个单字节移动到 XMM 寄存器中?

c - 在 GNU C 内联汇编中与推送/分配/弹出交换?

c - 快速逐字节替换 if

c++ - 使用SSE最快缩小8位灰度图像

c - 使用 sse 执行内在函数

c++ - shuffle() 函数和 SIMD 代码生成