2012-12-12 30 views
3

隨着4包裝float__m128),我可以使用上證所內在如何將__m256d中的所有元素設置爲另一個__m256d的第三個元素?

__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]}。

那麼,怎麼做對不對?

使用英特爾(R)至強(R)CPU E5-2670 0 @ 2.60GHz 編輯

+1

看到這個問題:[使用單個AVX內部函數反轉一個包含雙精度的AVX寄存器](http://stackoverflow.com/questions/13422747/reverse-a-avx-register-containing-doubles-using-a-single -avx-intrinsic) – Mysticial

+2

對於256位向量沒有等價物。您需要使用兩個shuffle/permute instrinsics,因爲一個只能在128位塊中置換,另一個不能在128位的邊界上置換。 – Mysticial

+0

@Mysticial好。那麼你能提供所需的代碼嗎(作爲答案)?否則,我會自己弄清楚(並回答我自己的問題)。 – Walter

回答

1

還好,經過神祕的意見,我可以工作了自己:

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); 
} 

產生期望的結果。感謝您的幫助,神祕!

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 

鐺具有洗牌不同的內置的,我不知道其他的編譯器有什麼。

相關問題