Прежде всего, VS 2008 - плохой выбор для intrisincs, поскольку он имеет тенденцию добавлять гораздо больше перемещений регистров, чем необходимо, и в целом не очень хорошо оптимизируется (например, он имеет проблемы с анализом переменных индукции цикла, когда выполняются инструкции SSE).присутствует.)
Итак, мое дикое предположение состоит в том, что компилятор генерирует mulss
инструкции, которые ЦПУ может тривиально переупорядочивать и выполнять параллельно (без зависимостей между итерациями), в то время как интрицинки приводят к множеству перемещений регистров /сложный код SSE - он может даже взорвать кэш трассировки на современных процессорах.VS2008 печально известен тем, что выполняет все свои вычисления в регистрах, и я предполагаю, что есть некоторые опасности, которые ЦП не может пропустить (например, xor reg, move mem-> reg, xor, mov mem-> reg, mul, mov mem-> reg, которыйявляется цепочкой зависимостей, в то время как скалярный код может быть перемещен mem-> reg, mul с mem operand, mov.) Вы должны обязательно взглянуть на сгенерированную сборку или попробовать VS 2010, который имеет намного лучшую поддержку встроенных функций.
Наконец, и самое важное: ваш код вообще не связан с вычислениями , никакое количество SSE не сделает его значительно быстрее.На каждой итерации вы читаете четыре двойных значения и записываете два, что означает, что FLOP не является вашей проблемой.В этом случае вы находитесь во власти подсистемы кеш / памяти, и это, вероятно, объясняет разницу, которую вы видите.Умножение отладки не должно быть быстрее, чем выпуск;и если вы видите, что это быстрее, чем вы должны делать больше прогонов и проверять, что еще происходит (будьте осторожны, если ваш процессор поддерживает турбо-режим, это добавляет еще 20% вариаций.) Переключения контекста, который очищает кэш, может быть достаточно вэто случай.
Итак, в целом, тест, который вы сделали, в значительной степени бессмысленен и просто показывает, что для случаев с привязкой к памяти нет разницы, использовать SSE или нет.Вы должны использовать SSE, если на самом деле есть код, который является плотно вычисляемым и параллельным, и даже тогда я потратил бы много времени с профилировщиком, чтобы определить точное место для оптимизации.Простой точечный продукт не подходит для улучшения производительности SSE.