Я пытаюсь сравнить время вычислений простого кода для вычисления суммы кубов целых чисел, используя как Fortran 90, так и C ++, так как я слышал, что они быстры на одинаковых уровнях. Я использую gfortran и g ++ (на Mac OSX) для компиляции этих кодов.
Может кто-нибудь любезно указать, почему код Fortran 90 занимает намного больше времени (49 секунд), чем его эквивалентный код C ++ (12 секунд)? Единственное, что я знаю, это то, что C ++ — это майор строк, а Fortran — майор столбцов, но я не думаю, что это актуально для этих кодов.
Как я могу сделать этот код fortran90 быстрее? Любые советы будут оценены. Благодарю.
Фортран код и компиляция с gfortran -o bb1 code15.f90
program code15
implicit none
double precision, dimension(:), allocatable :: a
integer (kind=8) :: n,i
real (kind=16) :: ssum
real :: ts1, ts2
call cpu_time(ts1)
n = 1600000000
allocate(a(n))
ssum=0.0
do i=1,n
a(i)=i
ssum=ssum+a(i)*a(i)*a(i)
end do
print *, 'final sum ', ssum
deallocate(a)
call cpu_time(ts2)
print *,'the time taken is ',ts2-ts1
end program
Выход
final sum 1.63840000204800000399876515667619840E+0036
the time taken is 48.6228256
C ++ код и компиляция с g++ -o bb1 code10.cpp
#include <iostream>
#include <time.h>
using namespace std;
main()
{
long int n,i;
long double ssum;
clock_t starttime = clock();
n=1600000000;
double *a = new double[n];
ssum=0;
for(i=0; i<n; i++)
{
a[i]=i+1;
ssum=ssum+a[i]*a[i]*a[i];
}
cout << "final sum " << ssum << endl;
delete [ ]a;
cout << "the time taken is "<< (double)( clock() - starttime ) / (double)CLOCKS_PER_SEC
<< endl;
}
вывод
final sum 1.6384e+36
the time taken is 12.0104
Я не эксперт по Фортрану, но кажется, что
real (kind=16) :: ssum
объявляет число с плавающей запятой четвертой точности (16 байт), которое, вероятно, эмулируется программным обеспечением на вашем оборудовании. Ваш C++
код использует long double
который соответствует числу с плавающей запятой с расширенной точностью (10 байт), которое может быть сделано вашим оборудованием (и намного быстрее). Обратите внимание, что long double
не является 10-байтовым числом с плавающей точкой на всех платформах, это может быть то же самое, что double
на некоторых платформах, например. Я думаю, что это верно для Windows и MSVC. Чтобы получить число с плавающей точкой с расширенной точностью в Фортране, используйте:
real (kind=10) :: ssum