如何使这个简单的fortran 90代码更快? 我试图比较一个简单的代码的计算时间,用Fortran 90和C++计算整数立方体的总和,因为我听说它们在相似的水平上很快。我使用gfortran和g++(在macosx上)编译这些代码 有人能指出为什么FORTRAN 90代码比它的等效C++代码花费了更多的时间(49秒)(12秒)?我只知道C++是行专业,FORTRAN是列专业,但我不认为这与这些代码相关。 如何使fortran90代码更快?任何提示都将不胜感激。谢谢

如何使这个简单的fortran 90代码更快? 我试图比较一个简单的代码的计算时间,用Fortran 90和C++计算整数立方体的总和,因为我听说它们在相似的水平上很快。我使用gfortran和g++(在macosx上)编译这些代码 有人能指出为什么FORTRAN 90代码比它的等效C++代码花费了更多的时间(49秒)(12秒)?我只知道C++是行专业,FORTRAN是列专业,但我不认为这与这些代码相关。 如何使fortran90代码更快?任何提示都将不胜感激。谢谢,c++,performance,fortran90,gfortran,C++,Performance,Fortran90,Gfortran,Fortran代码和使用gfortran-o bb1 code15.f90编译 程序代码15 隐式无 双精度,维度(:),可分配::a 整数(种类=8)::n,i 真实(种类=16)::ssum real::ts1,ts2 呼叫cpu_时间(ts1) n=160000000 分配(a(n)) ssum=0.0 i=1,n吗 a(i)=i ssum=ssum+a(i)*a(i)*a(i) 结束 打印*,“最终金额”,ssum 解除分配(a) 呼叫cpu_时间(ts2) 打印*,“所用时间为”,ts

Fortran代码和使用
gfortran-o bb1 code15.f90编译

程序代码15
隐式无
双精度,维度(:),可分配::a
整数(种类=8)::n,i
真实(种类=16)::ssum
real::ts1,ts2
呼叫cpu_时间(ts1)
n=160000000
分配(a(n))
ssum=0.0
i=1,n吗
a(i)=i
ssum=ssum+a(i)*a(i)*a(i)
结束
打印*,“最终金额”,ssum
解除分配(a)
呼叫cpu_时间(ts2)
打印*,“所用时间为”,ts2-ts1
结束程序
输出为

 final sum    1.63840000204800000399876515667619840E+0036
 the time taken is    48.6228256
C++代码和使用
g++-o bb1 code10.cpp编译

#包括
#包括
使用名称空间std;
main()
{
长int n,i;
长双ssum;
时钟开始时间=时钟();
n=160000000;
双精度*a=新双精度[n];
ssum=0;

因为(i=0;i我不是Fortran专家,但似乎

real (kind=16) :: ssum
声明四倍精度(16字节)浮点数,可能在硬件上的软件中模拟。您的
C++
代码使用
long double
,它对应于扩展精度(10字节)浮点数,这可以由硬件完成(而且速度更快)。请注意,
long double
在所有平台上都不是一个10字节的浮点数,例如,它可能与某些平台上的
double
相同。我认为Windows和MSVC也是如此。要在fortran中获得扩展精度浮点数,请使用:

real (kind=10) :: ssum

有什么特别的理由来创建一个数组来存储<代码> n> n+1 ?我可能错了,但是FORTRAN不迭代遍历所有变量来找到你想要的吗?这意味着它会在找到你想要的之前迭代16亿个变量,这是因为FORTRAN数组索引从1开始,所以它是1,2,3…但是在C++数组索引中ing从0开始,因此它是0,1,2,3如果不启用优化(例如,
g++-O2…
),比较性能是没有意义的。我将
-O2
标记打开
gfortran-O2-o bb1 code15.f90
,在43.8秒时稍微快一点。你检查汇编代码吗?一个编译器是否使用矢量化?
长双精度
可能是一个80位浮点数(硬件支持)。什么是
实型(种类=16)
?一个四倍精度的数字?那么它可能在软件中完成(即较慢)。我想还有
real(kind=10)
。但是
sizeof(ssum)在我的C++代码中返回<代码> 16 < /COD>不<代码> 10 <代码>,所以它仍然是10字节精度,只占用内存中的16字节吗?@ GUDUU:运行代码< GCC -DM -E/< DEV/NULL GRIPLDBL</代码>给出了<代码>定义:y-LDLDMUN MtTyDigixx 64 < /代码>,它是尾数的大小。<代码>定义了Y.LDLDLMAX ExpXyxx 16384 /code>,
#define uuu LDBL u MIN u EXP uuu1(-16381)
,表示16位用于存储指数。
长双精度
的大小可能更大,以便在数组中强制执行正确对齐(例如,通过插入填充字节)。谢谢,
long double
上的wiki页面也很有帮助,我的误解是
long double
的精度是
double
的两倍
real (kind=10) :: ssum