Mi sono imbattuto in questa domanda su scicomp che comporta il calcolo di una somma. Lì, è possibile vedere un c++ e un'implementazione simile fortran. È interessante notare che la versione di Fortran è stata più veloce di circa il 32%.Un semplice test case tra clang ++/g ++/gfortran
Ho pensato, non ero sicuro del loro risultato e ho cercato di rigenerare la situazione. Ecco la (leggermente) diversi codici che ho incontrato:
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;
}
FORTRAN
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
posso compilare codici di cui sopra utilizzando gcc 4.6.3
e clang 3.0
su una macchina Ubuntu 12.04 LTS
tutto con flag -O3
. Ecco i miei tempi:
time ./a.out
gfortran
real 0m1.538s
user 0m1.536s
sys 0m0.000s
g ++
real 0m2.225s
user 0m2.228s
sys 0m0.000s
clang
real 0m1.250s
user 0m1.244s
sys 0m0.004s
È interessante notare che il codice fortran
è più veloce dello c++
di circa lo stesso 32% quando si utilizza gcc
. Utilizzando clang
, tuttavia, posso vedere che il codice c++
viene eseguito più velocemente di circa il 19%. Ecco le mie domande:
- Perché il codice generato g ++ è più lento di gfortran? Dal momento che provengono dalla stessa famiglia di compilatori, questo significa che il codice fortran può essere semplicemente tradotto in un codice più veloce? Questo è generalmente il caso di fortran vs C++?
- Perché lo
clang
funziona così bene qui? C'è un front-end fortran per il compilatore llvm? Se esiste, il codice generato da questo sarà ancora più veloce?
UPDATE:
Utilizzando -ffast-math -O3
opzioni genera i seguenti risultati:
gfortran
real 0m1.515s
user 0m1.512s
sys 0m0.000s
g ++
real 0m1.478s
user 0m1.476s
sys 0m0.000s
clang
real 0m1.253s
user 0m1.252s
sys 0m0.000s
versione NPW g++
è in esecuzione più veloce gfortran
ed ancora clang
è più veloce di entrambe le cose. L'aggiunta di -fcx-fortran-rules
alle opzioni di cui sopra non modifica in modo significativo i risultati
Fornire le opzioni del compilatore utilizzate per la compilazione. Tali opzioni come -ffast-math per gcc possono influenzare in modo significativo i tempi. –
@NikolayViskov l'unico flag che uso esplicitamente è '-O3' su tutti i compilatori. – GradGuy
Sulla mia macchina: clang '0.62' (-ffast-math' 0.60'), g ++ 4.6 '1.23' (-ffast-math' 0.78'), g ++ 4.7 '1.19' (-ffast-math' 0.76 ') – leemes