जो मैंने ईजिन (here) के बारे में पढ़ा है, ऐसा लगता है कि operator=()
आलसी मूल्यांकन के लिए "बाधा" के रूप में कार्य करता है - उदा। यह ईजिन को अभिव्यक्ति टेम्पलेट्स को लौटने से रोकने और वास्तव में (अनुकूलित) गणना करने का कारण बनता है, जिसके परिणामस्वरूप परिणाम =
के बाएं हाथ में होता है।ईजिन: प्रदर्शन पर कोडिंग शैली का प्रभाव
ऐसा लगता है कि किसी की "कोडिंग शैली" का प्रदर्शन पर असर पड़ता है - यानि इंटरमीडिएट कंप्यूटेशंस के परिणाम को स्टोर करने के लिए नामित चर का उपयोग करके गणना के कुछ हिस्सों का मूल्यांकन करके प्रदर्शन पर नकारात्मक प्रभाव पड़ सकता है "बहुत जल्दी"।
मेरे अंतर्ज्ञान सत्यापित करने का प्रयास करने के लिए, मैं एक उदाहरण (full code here) लिखा और परिणाम पर हैरान था:
using ArrayXf = Eigen::Array <float, Eigen::Dynamic, Eigen::Dynamic>;
using ArrayXcf = Eigen::Array <std::complex<float>, Eigen::Dynamic, Eigen::Dynamic>;
float test1(const MatrixXcf & mat)
{
ArrayXcf arr = mat.array();
ArrayXcf conj = arr.conjugate();
ArrayXcf magc = arr * conj;
ArrayXf mag = magc.real();
return mag.sum();
}
float test2(const MatrixXcf & mat)
{
return (mat.array() * mat.array().conjugate()).real().sum();
}
float test3(const MatrixXcf & mat)
{
ArrayXcf magc = (mat.array() * mat.array().conjugate());
ArrayXf mag = magc.real();
return mag.sum();
}
ऊपर एक में परिमाण के गुणांक के लिहाज से राशि की गणना के 3 अलग अलग तरीके देता है जटिल मूल्यवान मैट्रिक्स।
test1
गणना के प्रत्येक हिस्से को "एक समय में एक कदम" लेता है।test2
एक अभिव्यक्ति में पूरी गणना करता है।test3
एक "मिश्रित" दृष्टिकोण लेता है - कुछ मध्यवर्ती चर के साथ।
मैं उम्मीद है कि के बाद से एक अभिव्यक्ति में test2
पैक पूरे गणना, Eigen और उस का लाभ लेने में सक्षम होगा विश्व स्तर पर की तरह पूरे गणना का अनुकूलन, सबसे अच्छा प्रदर्शन प्रदान करते हैं।
हालांकि, परिणाम थे आश्चर्य की बात (नहीं दिखाया गया संख्या प्रत्येक परीक्षा के 1000 फांसी भर में कुल माइक्रोसेकंड में हैं): (। यह जी ++ -O3 साथ संकलित किया गया था - पूर्ण विवरण के लिए the gist देख)
test1_us: 154994
test2_us: 365231
test3_us: 36613
संस्करण जो मुझे सबसे तेज़ होने की उम्मीद है (test2
) वास्तव में सबसे धीमा था। साथ ही, संस्करण जो मुझे धीमा होने की उम्मीद है (test1
) वास्तव में बीच में था।
तो, मेरे सवाल कर रहे हैं:
- क्यों
test3
विकल्पों से इतना बेहतर प्रदर्शन करता है? - क्या कोई ऐसी तकनीक है जो ईजिन वास्तव में आपके कंप्यूटेशंस को कार्यान्वित करने में कुछ दृश्यता प्राप्त करने के लिए उपयोग कर सकती है (असेंबली कोड में डाइविंग से कम)?
- क्या आपके ईजिन कोड में प्रदर्शन और पठनीयता (इंटरमीडिएट चर के उपयोग) के बीच एक अच्छा व्यापारिक हमला करने के लिए दिशानिर्देशों का एक सेट है?
अधिक जटिल गणनाओं में, एक अभिव्यक्ति में सब कुछ करने से पठनीयता में बाधा आ सकती है, इसलिए मुझे कोड लिखने का सही तरीका खोजने में दिलचस्पी है जो पठनीय और कलाकार दोनों है।
मैं एक अनुकूलक विशेषज्ञ नहीं हूँ, लेकिन मैं दिया आप '-O3' साथ संकलन किया गया, और के परिणामों में से किसी पर कब्जा नहीं अपने परिणाम पर शक होगा गणना यह पूरी तरह से व्यवहार्य है कि अनुकूलक यह पहचान लेगा कि 'funcN()' का कोई दुष्प्रभाव नहीं है और संपूर्ण गणना को अनुकूलित करें। मेरा मानना है कि आप माइक्रो बेंचमार्किंग की सहायता के लिए 'अस्थिर' का उपयोग कर सकते हैं। [प्रासंगिक तो सवाल] (http://stackoverflow.com/questions/6130100/using-volatile-to-prevent-compiler-optimization-in-benchmarking-code) –
ध्यान दें कि हाल ही में एक संकलक के साथ, कार्यक्रम हर समय aborts । यह केवल पुराने compilers के साथ गुजरता है कि कहा जाता है 'abs' के संस्करण पूर्णांक संस्करण है ... –