Выбрать главу

Приложение 4 - Тестирование программы на языке Fortran-90

Язык Фортран всегда считался специализированным для математических вычислений. Его первая версия появилась в IBM еще в 1957 году, более-менее современными версиями являются Fortran 90 и Fortran 2003.

Поскольку и сейчас существует версия gfortran под Linux и OSX, стало интересно сравнить быстродействие программ. Отдельного компьютера с Linux у меня не было, так что программа была запущена на Raspberry Pi. Один и тот же код без проблем компилировался и под Linux и под OSX.

В качестве теста использовалась несложная программа вычисления числа Пи по формуле Валлиса.

Программа на С выглядит так:

Appendix4_test1.c

#include <stdio.h>

double wallis_formula(unsigned long int count)

{

double pi = 1.0, num;

unsigned long int i;

for (i=1; i<=count; i++)

{

num = 4.0*i*i;

pi *= num/(num - 1);

}

return pi*2;

}

int main() {

unsigned long int input_count = 100000000;

double result = wallis_formula(input_count);

printf("Calc done: %.20f\n", result);

return 0;

}

Программа, переписанная на Fortran 90 выглядит немного непривычно, если не сказать, архаично:

Appendix4_test1.f90:

function wallisSeries() result(pi)

real(8) :: pi

real(8) :: num

integer :: ITERATIONS = 100000000

pi = 1.0

do i = 1,ITERATIONS

num = 4.0*i*i

pi = pi*num/(num - 1)

end do

pi = 2*pi

end function

program hello

real(8) :: wallisSeries

print *, "Calc done:", wallisSeries()

end program hello

Впрочем, несмотря на другой синтаксис, основная структура кода та же.

Ключи компиляции также похожи:

gcc -o Appendix4_test1_c Appendix4_test1.c -Ofast

gfortran -o Appendix4_test1_f Appendix4_test1.f90 -Ofast

Результаты запуска обеих программ оказались весьма интересными.

Raspberry Pi

$ gfortran -o Appendix4_test1_f Appendix4_test1.f90 -Ofast

$ time ./Appendix4_test1_f

Calc done: 3.1415926364809641

real 2.222s

$ gcc -o Appendix4_test1_c Appendix4_test1.c -Ofast

$ time ./Appendix4_test1_c

Calc done: 3.14159264306626218044

real 3.441s

Как можно видеть, программа на Си оказалась где-то на 30% медленнее. Все-таки более простой код Fortran позволяет легче получить более эффективный код. Но на OSX с gcc последней версии все оказалось по-другому.

OSX

$ time ./Appendix4_test1_f

Calc done: 3.1415926364809641

real 0.788s

$ time ./Appendix4_test1_c

Calc done: 3.14159264306626218044

real 0.434s

Тут уже наоборот, Си вырвался вперед. Возможно, более современный компилятор создает более эффективный код, также возможно, что более эффективно используются команды современных процессоров. Второе интересное отличие - значения в крайних знаках Пи отличаются, видимо реализация расчетов с плавающей точкой в двух языках слегка отличаются (те, кто читал главу 24, поймут в чем дело).

Из всего этого следует несколько выводов. Фортран все-таки устаревший язык, и в общем случае, переписывать программу с Си на Фортран, надеясь ее ускорить, смысла нет - прироста производительности не будет. По читаемости и удобству написания кода Фортран тоже проигрывает - все-таки прогресс в создании компиляторов за последние 20 лет весьма значителен. Но с другой стороны, использование Фортран может быть целесообразно на каких-то специализированных устройствах, если современные компиляторы недоступны. Или в тех случаях, когда уже есть большое количество готовых библиотек, которые в противном случае, пришлось бы переписывать.

Заключение

На этом данная книга закончена, хотя надеюсь, что не навсегда - по возможности и по мере появления новых идей, новые главы будут дописываться. Автор надеется, что хоть немного удалось познакомить читателей с увлекательным миром математики и программирования.

Продолжение следует.

Обо найденных неточностях или дополнениях просьба писать на электронную почту dmitryelj@gmail.com. Наличие новой версии можно проверить на странице https://cloud.mail.ru/public/4SGE/oE2EGEWnp.