3

使用 4 个打包float( __m128),我可以使用 SSE 内在函数

__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

4

2 回答 2

2

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

#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 有一个不同的内置用于改组,我不知道其他编译器是否有一些东西。

于 2013-01-21T21:41:08.737 回答
1

好的,在 Mystical 的评论之后,我可以自己解决:

template<int K>
inline __mm256d pick_single(__m256d x)
{
   __m256 t = _mm256_permute2f128_pd(x,x, K&2?49:32);
   return _mm256_permute_pd(t,K&1?15:0);
}

产生预期的结果。感谢您的帮助,神秘!

于 2012-12-12T20:09:50.940 回答