Использование avx2 для извлечения и чередования элементов из двух векторов - PullRequest
0 голосов
/ 07 ноября 2019

Учитывая два вектора с плавающей точкой одинарной точности a и b в avx2:а: [0;1;2;3;4;5;6;7]б: [8;9;10;11;12;13;14;15]

Я хотел бы взять один элемент из двух в обоих векторах и чередовать их в выходных данных. В идеале, селектор управления помог бы мне указать, какой элемент я выбираю в обоих векторах (скажем, четных или нечетных). Таким образом, для a и b возможны следующие результаты:

v0: [0;8;2;10;4;12;6;14]v1: [1;8;3;10;5;12;7;14]v2: [0;9;2;11;4;13;6;15]v3: [1;9;3;11;5;13;7;15]

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

Unpack_hi и unpack_lo на самом деле очень близки, но они чередуются с большей детализацией - то, что вы получаете, является чем-то вроде этой формы:[А;A;B;B;A;A;B;B]

Где A (B) обозначает элемент из вектора a (b)

Существует ли такая инструкция? Заранее спасибо.

...