有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
答案 0 :(得分: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有一个不同的内置用于改组,我不知道其他编译器是否有东西。
答案 1 :(得分: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);
}
产生所需的结果。谢谢你的帮助,神秘!