Победившая версия C ++ на этом тестовом сайте - , вручную векторизованная для x86, с использованием встроенных функций SIMD (SSE, AVX или AVX512) , например, использование _mm256_movemask_pd(v1 <= v2);
для получения битовой маскицелого вектора результатов сравнения, позволяя ему проверять 4 пикселя параллельно для выхода за границы.И собственный синтаксис вектора GNU C для SIMD умножается и что угодно, например r2 + i2
для добавления или умножения векторов SIMD с обычными операторами C / C ++.
В версии C ++ есть условие цикла, оптимизированное для SIMD:
// Do 50 iterations of mandelbrot calculation for a vector of eight
// complex values. Check occasionally to see if the iterated results
// have wandered beyond the point of no return (> 4.0).
Fortran просто использует OpenMP для автоматического распараллеливания, и автоматическая векторизация компилятором не приведет к созданию чего-либо почти такого же хорошего, как условие цикла, настроенного вручную, которое продолжает выполнятьсяизбыточная работа, которую не выполнял источник (потому что это дешевле, чем проверка чаще).
Существует множество версий программы на языках C и C ++, скорость которых аналогична версии на Fortran. Они хороши даже для исходного кода C / C ++, который не векторизован вручную.
Я не уверен, что Intel Fortran или любой другой компилятор поддерживает расширения для ручной векторизации.