2013-02-28 91 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 2013-02-28 08:56:24

回答

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 2013-03-01 04:06:40

相關問題