Сдвиг 4 целых числа вправо на разные значения SIMD

SSE не обеспечивает способ сдвига упакованных целых чисел на переменную величину (я могу использовать любые инструкции AVX и старше). Вы можете делать только равномерные смены. Результат, который я пытаюсь достичь для каждого целого числа в векторе, таков.

i[0] = i[0] & 0b111111;
i[1] = (i[1]>>6) & 0b111111;
i[2] = (i[2]>>12) & 0b111111;
i[3] = (i[3]>>18) & 0b111111;

По сути, пытаюсь выделить другую группу из 6 битов в каждом целом числе.

Так что же является оптимальным решением?

Вещи, о которых я думал: вы можете смоделировать переменный сдвиг вправо, с переменным сдвигом влево и равномерным сдвигом вправо. Я думал о том, чтобы умножить упакованные целые числа на разные величины (поэтому имитировал сдвиг влево). Затем с результатом, вы можете сделать равномерный сдвиг вправо, чтобы получить ответ. Проблема с этим конкретным опом я бы использовал для умножения_mm_mullo_epi32, которая имеет неутешительную задержку (10 циклов для haswell), и, учитывая мою программу, ей придется ждать результата, потому что этот конкретный результат является зависимостью для следующих инструкций. В целом, этот метод, я думаю, будет только немного быстрее, чем метод грубой силы, который распаковывается, сдвигается с использованием скалярных инструкций, а затем перепаковывает вектор, что, я думаю, займет около 20 циклов.

Ответы на вопрос(1)

Ваш ответ на вопрос