2016-12-10 3 views
1

Я понимаю, как _mm_shuffle_ps работа. Например, в следующем.Как работает _mm256_shuffle_ps?

__m128 r = _mm_shuffle_ps(x,y, _MM_SHUFFLE(2,0,2,0)); 

r будет иметь содержание, x[0], x[2], y[0], y[2].

Но я вижу, что _MM_SHUFFLE также принимает 4 параметра для _mm256_shuffle_ps, тогда как векторы будут иметь по 8 элементов. Итак, логически _MM_SHUFFLE должен был принять 8 параметров. Может кто-нибудь объяснить, как это работает?

ответ

5

_mm256_shuffle_ps перемещает каждую из двух 128-битных полос независимо, как если бы _mm_shuffle_ps был вызван двумя XMM. Если вы хотите перетасовать все 8 32-битных элементов, вам понадобится _mm256_permutevar8x32_ps

3

Инструкции SSE/AVX, которые принимают немедленный операнд, всегда принимают только 8-битное мгновенное.

Как обычно, the manual explains how the 8-bit immediate is used. Он применяет ту же тасовку к обеим полосам 128b.

Некоторые инструкции содержат запасные биты сразу в версии 128b и могут использовать их для версии 256b. например 256b shufpd использует биты 2 и 3 непосредственно для верхней полосы, отдельно от обычных бит 0 и 1 для нижнего 128.

shufpsshufps Нужно четыре группы из 2 бит, чтобы выбрать один из четырех элементов для каждого элемента назначения, поэтому в imm8 нет лишней комнаты.