Еще лучше _mm_shuffle_ps, который может взять 3 элемента из одного источника? - PullRequest
0 голосов
/ 02 мая 2011

_mm_shuffle_ps можно просто скопировать 2 поплавка из a и 2 из b, верно?Есть ли простой способ получить 3 поплавка от a и 1 от b?Я также заметил, что _mm_move_ss может выполнять часть работы, но это не смена.

Ссылка:

__m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Если у вас SSE4, используйте BLENDPS , для которого присуще значение:

__m128 _mm_blend_ps (__m128 v1, __m128 v2, const int mask);
1 голос
/ 17 июня 2016

К сожалению, только 2 исходных шаффла: movss, movsd, shufps, unpckl/hps/d, movhlps и аналогичные негибкие инструкции.

palignr может быть полезно , даже с задержкой обхода для использования int shuffle между инструкциями FP, если ваше перемещение данных должно соответствовать его шаблону.

AVX512добавляет полные перемешивания с 2 исходниками (пересечение полос, с векторным селектором) для элементов различных размеров.Такие вещи, как vpermi2w и vpermt2b

Как отмечает Пол, бленды - это гибкий способ объединения данных из двух регистров без перемешивания.


См. Руководство по сборке Agner Fog по оптимизации для таблицы инструкций, организованной по типу перемещения данных.Смотрите также tag wiki.

...