我在scicomp上遇到了这个涉及计算总和的问题。在那里,您可以看到一个c++和一个类似的fortran实现。有趣的是,我看到 fortran 版本快了大约 32%。
我想,我不确定他们的结果,并试图恢复这种情况。这是我运行的(非常轻微的)不同的代码:
C++
#include <iostream>
#include <complex>
#include <cmath>
#include <iomanip>
int main ()
{
const double alpha = 1;
std::cout.precision(16);
std::complex<double> sum = 0;
const std::complex<double> a = std::complex<double>(1,1)/std::sqrt(2.);
for (unsigned int k=1; k<10000000; ++k)
{
sum += std::pow(a, k)*std::pow(k, -alpha);
if (k % 1000000 == 0)
std::cout << k << ' ' << sum << std::endl;
}
return 0;
}
正则
implicit none
integer, parameter :: dp = kind(0.d0)
complex(dp), parameter :: i_ = (0, 1)
real(dp) :: alpha = 1
complex(dp) :: s = 0
integer :: k
do k = 1, 10000000
s = s + ((i_+1)/sqrt(2._dp))**k * k**(-alpha)
if (modulo(k, 1000000) == 0) print *, k, s
end do
end
gcc 4.6.3
我使用和clang 3.0
在一Ubuntu 12.04 LTS
台带有-O3
标志的机器上编译上述代码。这是我的时间:
time ./a.out
gfortran
real 0m1.538s
user 0m1.536s
sys 0m0.000s
克++
real 0m2.225s
user 0m2.228s
sys 0m0.000s
铛
real 0m1.250s
user 0m1.244s
sys 0m0.004s
有趣的是,我还可以看到fortran
代码在使用时比c++
32%快gcc
。但是,使用clang
,我可以看到c++
代码实际上运行速度快了大约 19%。以下是我的问题:
- 为什么 g++ 生成的代码比 gfortran 慢?由于它们来自同一个编译器系列,这是否意味着(这个)fortran 代码可以简单地翻译成更快的代码?fortran vs c++ 通常是这种情况吗?
- 为什么
clang
这里做得这么好?llvm 编译器是否有 fortran 前端?如果有,由那个生成的代码会更快吗?
更新:
使用-ffast-math -O3
选项会产生以下结果:
gfortran
real 0m1.515s
user 0m1.512s
sys 0m0.000s
克++
real 0m1.478s
user 0m1.476s
sys 0m0.000s
铛
real 0m1.253s
user 0m1.252s
sys 0m0.000s
Npwg++
版本的运行速度一样快gfortran
,并且仍然clang
比两者都快。添加-fcx-fortran-rules
到上述选项不会显着改变结果