2013-02-28 4 views
1

다음과 같은 두 배의 메모리를 순차적으로 사용하면 다음 작업을 수행 할 수 있습니다.avx에서 _mm_loaddup_pd와 동일한 기능을 수행하는 가장 빠른 방법은 무엇입니까?

A-> a1 | b1 | a2 | 내가 생각할 수있는 B2

__m256d r1,im1; 
/*Perform operation here*/ 
r1-> |a2|a2|a1|a1| 

im1-> |b2|b2|b1|b1| 

한 가지 방법은 다음과 같습니다

t1 = _mm256_load_pd(&A);t1->|b2|a2|b1|a1| 
r1 = _mm256_movedup_pd(t1); 
t1 = _mm256_permute_pd(&A,0x0101); 
im1 = _mm256_movedup_pd(t1); 

AVX는 _mm_loaddup_pd() 또는 _mm_load1_pd이없는(). 그렇다면이 작업을 수행 할 수있는 가장 빠른 방법은 무엇입니까? 당신은/중복을 방송하지 않는 필요한 것은

+0

. 더 잘할 수 있는지 확실하지 않습니다. – Mysticial

답변

3

하지만, 셔플/압축 풀기 :

이미 꽤 좋은이 당신이이
/* tmp = |b2|a2|b1|a1| */ 
tmp = _mm256_load_pd(&A); 
/* r1 = |a2|a2|a1|a1| */ 
r1 = _mm256_unpacklo_pd(tmp, tmp); 
/* im1 = |b2|b2|b1|b1| */ 
im1 = _mm256_unpackhi_pd(tmp, tmp); 
+0

나는 이것에 대한 답을 업데이트하려고하고 너를 보았다. – user1715122