Я согласен со всеми, что тестирование и настройка - лучший подход. Но есть некоторые уловки, чтобы помочь этому.
Прежде всего, MSVC делает переупорядочение инструкции SSE. Ваш пример, вероятно, слишком прост или уже оптимален.
Вообще говоря, если у вас достаточно регистров, полное чередование дает наилучшие результаты. Чтобы сделать шаг вперед, разверните петли достаточно, чтобы использовать все регистры, но не слишком много, чтобы пролить.
В вашем примере цикл полностью связан с обращениями к памяти, так что не так много места для улучшения.
В большинстве случаев нет необходимости в совершенствовании порядка инструкций для достижения оптимальной производительности. До тех пор, пока он «достаточно близок», его исправит либо компилятор, либо неработающее выполнение оборудования.
Метод, который я использую, чтобы определить, является ли мой код оптимальным, - это анализ критических путей и узких мест. После того, как я пишу цикл, я смотрю, какие инструкции используют какие ресурсы. Используя эту информацию, я могу вычислить верхнюю границу производительности, которую затем сравнить с фактическими результатами, чтобы увидеть, насколько я близок / далек от оптимального.
Например, предположим, у меня есть цикл со 100 добавлениями и 50 умножениями. И на Intel, и на AMD (до бульдозера) каждое ядро может выдерживать одно добавление SSE / AVX и одно умножение SSE / AVX за цикл.
Поскольку мой цикл содержит 100 добавок, я знаю, что не могу сделать лучше, чем 100 циклов. Да, множитель будет простаивать половину времени, но сумматор является узким местом.
Теперь я иду и проверяю цикл, и я получаю 105 циклов за итерацию. Это означает, что я довольно близок к оптимальному, и больше ничего не выиграешь. Но если я получу 250 циклов, то это означает, что с циклом что-то не так, и стоит с ним повозиться.
Анализ критического пути следует той же идее. Посмотрите задержки для всех инструкций и найдите время цикла критического пути цикла. Если ваша фактическая производительность очень близка к этому, вы уже оптимальны.
Agner Fog имеет большой справочник по внутренним деталям текущих процессоров:
http://www.agner.org/optimize/microarchitecture.pdf