1

メモリに次の double がある場合、次のことを実行できるようにしたい (順番に):

A-> a1| b1| a2| b2

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

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

私が考えることができる1つの方法は次のとおりです。

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() がありません。それで、これを実行できる最も速い方法は何ですか(必ずしも命令の数ではなく、レイテンシの観点から)?

4

1 に答える 1

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);
于 2013-02-28T20:11:14.023 に答える