sse - 如何将 __m256d 中的所有元素设置为另一个 __m256d 的第三个元素?

标签 sse avx

有了 4 个打包的 float (__m128),我可以使用 SSE intrinsic

__m128 X;
__m128 H = _mm_shuffle_ps(X,X,_MM_SHUFFLE(3,3,3,3));

H的所有元素设置为X的第三个元素(这是最快的方法吗?)

现在,我想对 4 个打包的 double (__m256d) 执行相同的操作。我天真地编码

__m256d X;
__m256d H = _mm256_shuffle_pd(X,X,_MM_SHUFFLE(3,3,3,3));

但这不是正确的做法!相反,它设置 H={X[1],X[1],X[3],X[3]}。

那么,怎样做才是正确的呢?

编辑

使用 Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz

最佳答案

它并不总是最优的,但询问你的编译器它认为什么可能是一个很好的提示。

#include <x86intrin.h>
__m256d f(__m256d x){
  __m256i m={3,3,3,3};
  return __builtin_shuffle(x,m);
}

对于 gcc-4.8,这会生成:

vpermilpd   $15, %ymm0, %ymm0
vperm2f128  $17, %ymm0, %ymm0, %ymm0

clang 有一个不同的 builtin for shuffling,我不知道其他编译器是否有。

关于sse - 如何将 __m256d 中的所有元素设置为另一个 __m256d 的第三个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13845806/

相关文章:

alignment - 为什么堆栈帧的长度是 16 字节的倍数?

c++ - 使用 SSE 加速计算——存储、加载和对齐

glibc - do_cos_slow.isra 是什么?

c - 使用 AVX vector 内在函数手动矢量化的运行速度与 Ryzen 上添加的 4 个标量 FP 的速度大致相同?

c++ - AVX 的乘加矢量化比 SSE 慢

concurrency - SSE指令: which CPUs can do atomic 16B memory operations?

assembly - 分析 AVX2 中的比较结果

x86 - 不同的mmx,sse和avx版本是相互补充还是超集?

c++ - 内在代码优化提示

c++ - AVX 循环矢量化中的奇怪错误