Мне нужно выполнить операцию поворота с как можно меньшим тактовым циклом. В первом случае допустим __m128i
как источник и тип назначения:
source: || A0 || A1 || A2 || A3 ||
dest: || A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));
Теперь я хочу сделать то же самое с встроенными функциями AVX. Итак, предположим, что на этот раз __m256i
как исходный и целевой тип:
source: || A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
dest: || A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||
Во встроенных функциях AVX отсутствует большинство соответствующих целочисленных операций SSE. Возможно, есть способ получить желаемый результат, работая с версией с плавающей запятой.
Я пробовал:
dest = (__m256i)_mm256_shuffle_ps((__m256)source, (__m256)source, _MM_SHUFFLE(0,3,2,1));
но я получаю:
|| A0 || A2 || A3 || A4 || A5 || A6 || A7 || A1 ||
Любая идея о том, как решить эту проблему эффективным способом? (без смешивания операций SSE и AVX и без "ручного" инвертирования A0
и A1
Заранее спасибо!
__m256
, почему вы выполняете приведение к__m128i
? - person dario_ramos   schedule 10.08.2012