Tôi chạy qua câu hỏi này trên scicomp liên quan đến tính toán tổng. Ở đó, bạn có thể thấy c++ và triển khai fortran tương tự. Điều thú vị là tôi thấy phiên bản fortran nhanh hơn khoảng 32%.Một trường hợp thử nghiệm đơn giản giữa clang ++/g ++/gfortran
Tôi nghĩ, tôi không chắc chắn về kết quả của họ và cố gắng tái tạo tình hình. Dưới đây là (rất nhẹ) mã khác nhau Tôi chạy:
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
tôi biên dịch mã trên sử dụng gcc 4.6.3
và clang 3.0
trên một máy Ubuntu 12.04 LTS
tất cả với cờ -O3
. Dưới đây là timings của tôi:
time ./a.out
gfortran
real 0m1.538s
user 0m1.536s
sys 0m0.000s
g ++
real 0m2.225s
user 0m2.228s
sys 0m0.000s
kêu vang
real 0m1.250s
user 0m1.244s
sys 0m0.004s
Điều thú vị là tôi cũng có thể thấy mã số fortran
nhanh hơn số c++
bằng khoảng 32% khi sử dụng gcc
. Tuy nhiên, sử dụng clang
, tôi có thể thấy rằng mã c++
thực sự chạy nhanh hơn khoảng 19%. Dưới đây là câu hỏi của tôi:
- Tại sao mã g ++ được tạo chậm hơn gfortran? Kể từ khi họ là từ cùng một gia đình trình biên dịch có nghĩa là điều này có nghĩa là (this) fortran mã đơn giản có thể được dịch sang một mã nhanh hơn? Đây có phải là trường hợp chung với fortran vs C++ không?
- Tại sao
clang
hoạt động tốt ở đây? Có một fortran front-end cho trình biên dịch llvm? Nếu có, mã sẽ được tạo ra bởi mã đó thậm chí còn nhanh hơn không?
UPDATE:
Sử dụng -ffast-math -O3
tùy chọn tạo ra các kết quả như sau:
gfortran
real 0m1.515s
user 0m1.512s
sys 0m0.000s
g ++
real 0m1.478s
user 0m1.476s
sys 0m0.000s
kêu vang
real 0m1.253s
user 0m1.252s
sys 0m0.000s
Npw g++
phiên bản đang chạy càng nhanh gfortran
và vẫn clang
là nhanh hơn cả. Thêm -fcx-fortran-rules
vào các tùy chọn ở trên không làm thay đổi đáng kể kết quả
Vui lòng cung cấp các tùy chọn trình biên dịch được sử dụng để biên dịch. Các tùy chọn như -ffast-math cho gcc có thể ảnh hưởng đáng kể đến thời gian. –
@NikolayViskov cờ duy nhất mà tôi sử dụng rõ ràng là '-O3' trên tất cả các trình biên dịch. – GradGuy
Trên máy của tôi: 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