2012-12-12 3 views
3

, 난 X의 세번째 요소 H의 모든 요소를 ​​설정하는 고유 SSE를__m256d의 모든 요소를 ​​다른 __m256d의 세 번째 요소로 설정하는 방법은 무엇입니까? 4

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

사용할 수 float (__m128)을 패킹 (이는 가장 빠른 방법?)

자, 같은 포장을하고 싶습니다 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]}을 설정합니다.

그렇다면 어떻게해야할까요? 2.60GHz @ 인텔 (R) 제온 (R) CPU E5-2670 0을 사용

편집

+1

이 질문을 참조하십시오 : [단일 AVX 내장 함수를 사용하여 double 형을 포함하는 AVX 레지스터 반전] (http://stackoverflow.com/questions/13422747/reverse-a-avx-register-containing-doubles-using-a-single -avx-intrinsic) – Mysticial

+2

256 비트 벡터에 해당하는 것은 없습니다. 128 비트 청크에서 하나만 바꾸고 다른 하나는 128 비트 경계에서 다시 퍼뜨릴 수 없기 때문에 두 개의 셔플/퍼 뮤트 인 셈 블리를 사용해야합니다. – Mysticial

+0

@ 신비로운. 그렇다면 필요한 코드를 제공 할 수 있습니까? 그렇지 않으면, 나는 그것을 스스로 알아낼 것이다. 그리고 내 자신의 질문에 대답한다. – 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 

그 소리는 셔플에 대해 다른 내장을 가지고, 나도 몰라.