8

合計の計算を含む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.0Ubuntu 12.04 LTS-O3

time ./a.out

グフォルトラン

real    0m1.538s
user    0m1.536s
sys     0m0.000s

g++

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% 高速に実行されることがわかります。ここに私の質問があります:

  1. g++ で生成されたコードが gfortran よりも遅いのはなぜですか? それらは同じコンパイラファミリからのものであるため、これは (この) fortran コードをより高速なコードに単純に変換できることを意味しますか? これは一般的に fortran と c++ の場合に当てはまりますか?
  2. なぜclangここでうまくいっているのですか?llvm コンパイラ用の Fortran フロントエンドはありますか? もしあれば、それによって生成されたコードはさらに高速になりますか?

アップデート:

オプションを使用-ffast-math -O3すると、次の結果が生成されます。

グフォルトラン

real    0m1.515s
user    0m1.512s
sys     0m0.000s

g++

real    0m1.478s
user    0m1.476s
sys     0m0.000s

ガチャガチャ

real    0m1.253s
user    0m1.252s
sys     0m0.000s

Npwg++バージョンは同じ速度で実行されますがgfortran、それでもclang両方よりも高速です。上記のオプションに追加-fcx-fortran-rulesしても結果は大きく変わりません

4

2 に答える 2