3

4 パックfloat( __m128) で、SSE 組み込み関数を使用できます

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

のすべての要素Hを の 3 番目の要素に設定しますX(これが最速の方法ですか?)

double今、私は 4 パック( )で同じことをしたいです__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 に答える