C 在avx中执行相当于_mm_loaddup_pd的功能的最快方法是什么?

C 在avx中执行相当于_mm_loaddup_pd的功能的最快方法是什么?,c,avx,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_per

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

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()。那么,我能执行此操作的最快方法是什么(就延迟而言,不一定是指令数量而言?

您需要的不是广播/复制,而是洗牌/解包:

/* 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);

你那里的东西已经很好了。我不确定是否有可能做得更好。我正要用这个更新答案,看到了你的。。是的,这很有效