在avx中执行与_mm_loaddup_pd等效的函数的最快方法是什么?

时间:2013-02-28 08:00:00

标签: c avx

如果我在内存中有以下双打(按顺序),我希望能够执行以下操作:

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()。那么我可以执行此操作的最快方式(在延迟方面,不一定是指令数)是什么?

1 个答案:

答案 0 :(得分: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);