На процессоре AVX верхняя половина 256-битных регистров и блоков с плавающей запятой отключается процессором, когда не выполняется инструкций AVX (коды кода, закодированные VEX). Когда код использует инструкции AVX, CPU должен включить питание блоков FP - это занимает около 70 микросекунд, в течение которых инструкции AVX фактически выполняются с использованием 128 микроопераций в два раза.
Когда инструкции AVX не использовались в течение примерно 700 микросекунд, процессор снова отключает верхнюю половину схемы.
Теперь он делает это, потому что верхняя половина схемы потребляет мощность (doh!), И поэтому генерирует тепло (double doh!). Это означает, что процессор работает быстрее, когда используются инструкции AVX. Поэтому, учитывая, что процессоры могут «турбо увеличить», когда они имеют тепловой запас, использование инструкций AVX снижает этот шанс, и на самом деле, процессор фактически снижает «базовую тактовую частоту». Так что, если у вас есть, например, центральный процессор с тактовой частотой 2,3 ГГц, который может увеличивать до 2,7, когда вы начинаете использовать инструкции AVX, чип работает до 2,1 и увеличивается до 2,3, а в крайних случаях базовые часы могут сокращаться до 1,9 (см. стр. 2-4 из this).
На этом этапе ваш процессор выполняет ВСЕ инструкции около 10-15%, а может быть, даже на 20% SLOWER, чем при отсутствии инструкций AVX. Если вы выполняете множество операций SIMD, 256-разрядные инструкции делают это стоящим. Но если вы делаете несколько инструкций AVX, тогда «нормальный» код, а затем немного AVX, тогда это ограничение скорости будет стоить дороже, чем все выгоды, которые вы можете сделать только от AVX.
Возможно, 128-разрядная SIMD 128 бит может работать быстрее 256 бит, если у вас нет длительных интенсивных всплесков операций с SIMD-доминированием. Существует цена на использование остальной части кремния ... (или, возможно, более точно, вознаграждение за то, что вы не используете его, что мы иногда забываем, что мы получаем).
Возможно, вы связаны с памятью. 33 миллиона шорт не будут вписываться в кеш процессора. В этом случае вам нужно будет вставить L1, если вы хотите увидеть разницу, которую вы ожидаете. – Mysticial
У вас есть какой-либо способ попробовать запустить тот же код AVX на вашем процессоре, совместимом с AVX2? –
Кроме того, FWIW, реализация SIMD останавливает один блок слишком рано. –