के बीच एक साधारण परीक्षण केस scicomp पर इस प्रश्न में भाग गया जिसमें एक योग की गणना शामिल है। वहां, आप c++ और इसी तरह के fortran कार्यान्वयन देख सकते हैं। दिलचस्प बात यह है कि मैंने देखा कि फोर्टन संस्करण लगभग 32% तेज था।क्लैंग ++/g ++/gfortran
मैंने सोचा, मुझे उनके नतीजे के बारे में निश्चित नहीं था और स्थिति को पुन: उत्पन्न करने की कोशिश की। यहाँ (बहुत थोड़ा) अलग अलग कोड मैं भाग गया है:
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
मैं एक Ubuntu 12.04 LTS
मशीन पर सभी gcc 4.6.3
और clang 3.0
का उपयोग करके उपरोक्त कोड संकलन -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% तक तेजी से चलता है। यहां मेरे प्रश्न हैं:
- gfortran से g ++ उत्पन्न कोड धीमा क्यों है? चूंकि वे एक ही कंपाइलर परिवार से हैं, इसका मतलब यह है कि (इस) फोर्टन कोड को बस एक तेज कोड में अनुवादित किया जा सकता है? क्या यह आम तौर पर फोर्टन बनाम सी ++ के मामले में होता है?
clang
क्यों इतना अच्छा कर रहा है? क्या llvm कंपाइलर के लिए एक फोर्टन फ्रंट एंड है? यदि वहां, क्या उस कोड द्वारा उत्पन्न कोड भी तेज होगा?
अद्यतन:
-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
Npw g++
संस्करण के रूप में तेजी से gfortran
चल रहा है और अभी भी clang
दोनों की तुलना में तेजी है। उपरोक्त विकल्पों में -fcx-fortran-rules
जोड़ने से
संकलन के लिए उपयोग किए गए कंपाइलर विकल्प प्रदान करें। जीसीसी के लिए -फैथ-गणित के रूप में ऐसे विकल्प महत्वपूर्ण रूप से समय को प्रभावित कर सकते हैं। –
@ निकोलेविस्कोव एकमात्र ध्वज जिसे मैं स्पष्ट रूप से उपयोग करता हूं वह सभी कंप्यूटर्स पर '-O3' है। – GradGuy
मेरी मशीन पर: क्लैंग '0.62' (-फैस्ट-गणित '0.60'), जी ++ 4.6' 1.23' (-फैस्ट-गणित '0.78'), जी ++ 4.7' 1.1 9' (-फैस्ट-गणित' 0.76 ') – leemes