2014-09-01 5 views
3

Скажем, у меня есть регистр 128, содержащий некоторые поплавки [x1, x2, x3, x4] и другое удерживание [y1, y2, y3, y4]. Что было бы лучшим способом, с точки зрения производительности, получить что-то вроде [x1, y1, x2, y2]?Каков самый быстрый/лучший способ комбинировать регистры с произвольным выбором полосы в AVX/SSE?

Я думаю, я мог бы несколько раз менять регистры, использовать временные ряды, а затем объединять их в несколько шагов, но мне было интересно, не хватает ли мне какой-нибудь удобной инструкции, которая могла бы облегчить мою жизнь. Я считаю, что это обычная вещь, поэтому мне интересно, какая здесь лучшая практика.

Спасибо!

ответ

3

В данном конкретном случае, вы можете сделать это с одной командой:

z = _mm_unpacklo_epi32(x, y); 

_mm_unpacklo_xxx/_mm_unpackhi_xxx может быть очень полезным для различных операций по реорганизации данных. Для более общих случаев есть также инструкции _mm_shuffle_xxx.

+0

О, круто! Я дам это позже. В общем, это семейство инструкций, которые я должен проверить для произвольного выбора полосы? Какие-нибудь другие полезные советы? Благодаря! – bitwise

+0

Уверенный - см. Обновление ответа. –