Эта тема, вероятно, обсуждалась сотни раз. Я не пытаюсь требовать
любой язык хуже или лучше. Я просто пытаюсь научиться ускорять свои С-коды.
Итак, вот два кода для расчета Pi.
Первый находится в Fortran90:
program calcpi
implicit none
integer :: i
real*8 :: pi
pi=0.0
do i = 0,1000000000
pi = pi + 1.0/(4.0*i+1.0)
pi = pi - 1.0/(4.0*i+3.0)
end do
pi = pi * 4.0
write(*,*) pi
end program calcpi
Второй находится в C:
#include<stdio.h>
#define STEPCOUNTER 1000000001
int main(int argc, char * argv[])
{
long i;
double pi=0;
#pragma omp parallel for reduction(+: pi)
for ( i=0 ; i < STEPCOUNTER; i++){
/*pi/4=1/11/3+1/51/7+...
To avoid the need to continually change
the sign (s=1; in each step s=s*-1 ),
we add two elements at the same time.*/
pi+=1.0/(i*4.0+1.0);
pi-=1.0/(i*4.0+3.0);
// pi = pi + 1.0/(i*4.0+1.0);
// pi = pi - 1.0/(i*4.0+3.0);
}
pi=pi*4.0;
printf("Pi=%lf\n",pi);
return 0;
}
Я компилирую оба кода с помощью gcc версии 4.4.4 на компьютере с CentOS 6.
[oz@centos ~]$ gfortran calcpi.f90 -o calcpi.fort.o
[oz@centos ~]$ gfortran calcpi.c -o calcpi.c.o
ЦП - процессор Intel (R) Xeon® (5160 @ 3,00 ГГц).
Итак, вот сколько времени требуется для запуска каждого кода:
[oz@centos ~]$ time ./calcpi.c.o
Pi=3.141593
real 0m33.270s
user 0m33.261s
sys 0m0.000s
[oz@centos ~]$ time ./calcpi.fort.o
3.1415926553497115
real 0m27.220s
user 0m27.208s
sys 0m0.001s
Фортран примерно на 20% быстрее.
Мой вопрос: каковы лучшие флаги компилятора для ускорения, но при этом сохраняют стабильность и точность?
(И да, я знаю о man gcc, я хочу знать о мнениях пользователей).
Спасибо за ваше мнение.
Результат без прагмы OpenMP:
[oz@centos ~]$ time ./calcpi.c.o
Pi=3.141593
real 0m32.892s
user 0m32.885s
sys 0m0.001s
Другие результаты, без изменения самого кода:
$ gcc -O2 calcpi.c -o calcpi.c.o
$ time ./calcpi.c.o
Pi=3.141593
real 0m21.085s
user 0m21.078s
sys 0m0.000s
$ gfortran -O2 calcpi.c -o calcpi.c.o
$ time ./calcpi.fort.o
3.1415926553497115
real 0m26.892s
user 0m26.888s
sys 0m0.000s