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

person user1715122    schedule 12.03.2013    source источник
comment
На самом деле это можно сделать следующим образом: m0_d=_mm512_mask_swizzle_pd(m0,0xAA,m0,_MM_SWIZ_REG_CDAB); Проглядел вариант с маской..   -  person user1715122    schedule 12.03.2013
comment
Если это решение работает, вы можете добавить его в качестве ответа, чтобы его было легче найти. Xeon Phi все еще очень новый, поэтому пока не так много информации о передовых методах.   -  person Jason R    schedule 12.03.2013


Ответы (1)


Может быть достигнуто следующим образом:

m0_d = _mm512_mask_swizzle_pd(m0,0xAA,m0,_MM_SWIZ_REG_CDAB);

Может показаться, что операция swizzle ограничена, но с маскированным вариантом мы можем добиться и других перестановок.

person user1715122    schedule 12.03.2013