На самом деле, я собираюсь поместить эти комментарии в ответ.
Формирование потоков для тривиальных операций просто добавляет издержки.
Сначала убедитесь, что ваш компилятор использует векторные инструкции для реализации вашего цикла. (Если он не знает, как это сделать, вам, возможно, придется самостоятельно кодировать векторные инструкции; попробуйте поискать «SSE instrinsics». Но для такого простого добавления векторов автоматическая векторизация должна быть возможной.)
Предполагая, что ваш компилятор является достаточно современным GCC, вызовите его с помощью:
gcc -O3 -march=native ...
Добавьте -ftree-vectorizer-verbose=2
, чтобы узнать, автоматически ли он векторизовал ваш цикл и почему.
Если вы уже используете векторные инструкции, возможно, вы насыщаете пропускную способность памяти. Современные процессорные ядра довольно быстрые ... Если это так, вам нужно реструктурировать на более высоком уровне, чтобы получать больше операций внутри каждой итерации цикла, находя способы выполнения большого количества операций над блоками, которые помещаются в кэш L1.