2013-02-28 106 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

相关问题