loaddup_pd/unpacklo_pd на Xeon Phi
Если у меня есть следующие двойные числа в векторе SIMD шириной 512, как в регистре Xeon Phi:
m0 = |b4|a4|b3|a3|b2|a2|b1|a1|
Можно ли сделать это в:
m0_d = |a4|a4|a3|a3|a2|a2|a1|a1|
используя одну инструкцию? Кроме того, поскольку для двойников не существует побитовых встроенных функций, это все еще является верным способом достижения вышеуказанного?
m0_t = _mm512_swizzle_pd(m9,_MM_SWIZ_REG_CDAB);//m0_t->|a4|b4|a3|b3|a2|b2|a1|b1|
__m512d res = _mm512_mask_or_epi64(m0,k1,zero,m0_t);//k1 is 0xAA
1 ответ
Решение
Может быть достигнуто следующим образом:
m0_d = _mm512_mask_swizzle_pd(m0,0xAA,m0,_MM_SWIZ_REG_CDAB);
Может показаться, что операция swizzle ограничена, но с замаскированным вариантом мы можем достичь и других перестановок.