我试图比较一个简单代码的计算时间,以便使用Fortran 90和C ++计算整数的立方体总和,因为我听说它们在类似的级别上很快。我使用gfortran和g ++(在Mac OSX上)来编译这些代码。
有人可以指出为什么Fortran 90代码比同等的C ++代码(12秒)花费的时间(49秒)要多得多吗?我只知道C ++是行专业,而Fortran是专栏专栏,但我认为这与这些代码无关。 如何让这个fortran90代码更快?任何提示将不胜感激。感谢。
Fortran代码并使用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
答案 0 :(得分:6)
我不是Fortran专家,但似乎
real (kind=16) :: ssum
声明一个四倍精度(16字节)浮点数,可能在您的硬件上用软件模拟。您的C++
代码使用long double
,它对应于扩展精度(10字节)浮点数,这可以由您的硬件完成(并且速度更快)。请注意,long double
不是所有平台上的10字节浮点数,例如,它可能与某些平台上的double
相同。我认为Windows和MSVC都是如此。要在fortran中获得扩展的精度浮点数,请使用:
real (kind=10) :: ssum