Фортран против C: Мандельброт тест - PullRequest
0 голосов
/ 20 января 2019

Я наткнулся на Benchmark Game (кодовая страница) и сравнил Fortran и C. Я был очень удивлен разницей во времени вычисления в тесте Мандельброта ( Fortran в 4,3 раза медленнее!) потому что оба языка имеют очень похожие наборы функций.Более того, Fortran должен иметь возможность оптимизировать более радикально (см., Например, «Легче ли оптимизировать Fortran, чем C, для тяжелых вычислений?» ).

Можно ли объяснить, какая особенность отсутствует в Фортране, которая потребуется для получения скорости, такой как в примере C?(Кажется, что битовые операции здесь улучшают код.)

РЕДАКТИРОВАТЬ: Вопрос не в том, какой язык программирования лучше (всегда есть много аспектов, которые играют роль).Это довольно фундаментальный вопрос о разнице оптимизации в этом примере.


Дополнение к ответу Питера Кордеса: Есть статья по ОсновыВекторизация для приложений на Фортране , в которой также кратко обсуждается SIMD в программировании на Фортране.Для компиляторов Intel: Явное векторное программирование на Фортране

1 Ответ

0 голосов
/ 20 января 2019

Победившая версия 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 или любой другой компилятор поддерживает расширения для ручной векторизации.

...