Нет смысла даже смотреть на неоптимизированные числа.Оптимизированные числа одинаковы, поэтому все в порядке.
"... это встроенная функция, которая должна быть быстрее, поскольку она может: вычислять 3 продукта параллельно"
Параллельно ничего не будет сделано, если вы не включите определенную параллельную оптимизацию.Эти оптимизации будут так же просты для цикла, как и для внутреннего, и часто даже намного проще для цикла.
Ну, по крайней мере для обычного смысла параллельный с использованием потоков или аналогичных,Параллельно можно использовать векторные инструкции и запланировать наложение инструкций в конвейере ЦП.Это может сделать оптимизирующий компилятор и, вероятно, будет сделано для обеих версий, когда вы используете -O3
.Не следует ожидать, что это произойдет, если оптимизация не включена.
Использование «параллельных» инструкций ( SIMD ) иногда может быть улучшено с помощью директив компилятора, таких как !$omp simd
или !$DEC VECTOR
.
«Нужно ли создавать новую параллельную функцию dot_product, чтобы быть быстрее?»
Да, обычно так и есть.Например, используя OpenMP.Или вы можете:
"Или есть дополнительная опция для компилятора gfortran, которую я не знаю?"
Да, автоматическое распараллеливание https://gcc.gnu.org/wiki/AutoParInGCC, например -floop-parallelize-all -ftree-parallelize-loops=4
Обратите внимание, что он не будет выполнять эти отдельные умножения параллельно, он сделает параллельный цикл i
.