Эмуляция байтовых сдвигов на 32 байтах с помощью AVX (пересечение полос движения)C++

Программы на C++. Форум разработчиков
Anonymous
Эмуляция байтовых сдвигов на 32 байтах с помощью AVX (пересечение полос движения)

Сообщение Anonymous »

Я переношу векторизованный код, написанный с использованием встроенных функций SSE2, на встроенные функции AVX2.
К моему большому разочарованию, я обнаружил, что инструкции по байтовому сдвигу _mm256_slli_si256 и < strong>_mm256_srli_si256 работают только с двумя половинами регистров AVX по отдельности, а между ними вводятся нули. (Это отличие от _mm_slli_si128 и _mm_srli_si128, которые обрабатывают целые регистры SSE.)
Можете ли вы порекомендовать мне короткую замену?< /p>

ОБНОВЛЕНИЕ:

Код: Выделить всё

_mm256_slli_si256
для сдвигов размером более 16 байт эффективно достигается с помощью любого из:

Код: Выделить всё

_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
// or
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
(Или используйте vpermq, _mm256_permute4x64_epi64, который лучше, чем vpermi128 на некоторых процессорах, но хуже на Zen 2 и 3.)
(Или используйте vpermq, _mm256_permute4x64_epi64, который лучше, чем vpermi128 на некоторых процессорах, но хуже на Zen 2 и 3.)
p>
Но вопрос остаётся по _mm256_srli_si256.

Подробнее здесь: https://stackoverflow.com/questions/252 ... e-crossing

Вернуться в «C++»