Побитовые операции с потоковыми расширениями Simd (SSE) - PullRequest
0 голосов
/ 08 октября 2018

Я хотел бы понять потенциальный выигрыш от использования Streaming Simd Extensions (SSE) для побитовых операций между целыми числами в следующем минимальном примере в C.

Предположим, что один

  1. выполняет побитовую операцию между двумя 64-битными длинными беззнаковыми длинными целыми числами a и b (1), например, a ^ b
  2. выполняет одну и ту же побитовую операцию между двумя 128-битными целыми числами A иB с SSE.

Я хотел бы знать, занимает ли выполнение (1) то же время, что и (2).

Например, можно попробовать временной эксперимент, в котором измеряется время выполнения N >> 1 побитовых операций (1) и время выполнения одинакового количества операций (2).

Эти времена примерно одинаковы?Если нет, каково будет их соотношение на конкретной машине?Как насчет того же вопроса для 256 или более расширений SSE?

1 Ответ

0 голосов
/ 08 октября 2018

Вы говорите как часть скомпилированной функции C?Компиляторы могут легко векторизовать циклы над массивами с помощью AVX2 vpxor или AVX1 vxorps, поэтому способ компиляции оператора ^ зависит от окружающего контекста.

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


Насколько то, что аппаратное обеспечение может делать на уровне asm, генерируемом компилятором или написанным от руки, не имеет значения;использование встроенных функций - удобный способ заставить компиляторы выдавать инструкции SIMD.

Давайте рассмотрим Intel Haswell в качестве примера.Без узких мест в памяти, просто работая с локальными переменными в регистрах, с AVX2 вы можете получить 3x vpxor ymm за такт (плюс еще один не SIMD-моп), так что это 3x 256 бит XOR.(128-битная SSE2 pxor xmm имеет ту же пропускную способность, что и 256-битная AVX2 vpxor на процессорах Intel, поэтому более широкие векторы являются чистой победой для пропускной способности).

Или с помощью чисто скалярного кода вы можете сделать 4xскаляр 8/16/32/64-бит xor за такт в Haswell, если у вас нет других инструкций.

Оба vpxor и xor являются однопроцессорными с задержкой в ​​1 цикл.

В семействе AMD Bulldozer и более ранних версиях pxor / vpxor имеет задержку в 2 такта, но 2 на тактовую пропускную способность, поэтому разница в производительности между узким местом задержки и узким местом в пропускной способности равна 4 *.1025 *

Производительность ЦП в таких небольших масштабах не одномерна. Суперскалярные конвейерные вышедшие из строя ЦП делают вопрос, который вы задаете, «один дольше» слишком упрощенным.См. Мой ответ по Какие соображения относятся к прогнозированию задержки для операций на современных суперскалярных процессорах и как я могу рассчитать их вручную? , в частности «Есть три основных измерения для анализа короткого блока» section.

См. https://agner.org/optimize/ и другие ссылки на производительность в теге x86 wiki .

...