合計の計算を含む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
グフォルトラン
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% 高速に実行されることがわかります。ここに私の質問があります:
- g++ で生成されたコードが gfortran よりも遅いのはなぜですか? それらは同じコンパイラファミリからのものであるため、これは (この) fortran コードをより高速なコードに単純に変換できることを意味しますか? これは一般的に fortran と c++ の場合に当てはまりますか?
- なぜ
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
しても結果は大きく変わりません