Вы говорите как часть скомпилированной функции 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 .