5

अनुकूलित करना कौन सी कोडिंग शैली संकलक अनुकूलन के लिए खुद को बेहतर बनाता है? विशेष रूप से, मुझे 1 में दिलचस्पी है) अस्थायी मूल्यों की संख्या को कम करना जो तुरंत फेंक दिया जाता है और 2) स्वचालित वेक्टरेशन, यानी अंकगणितीय के लिए सिम निर्देश उत्पन्न करना।उत्परिवर्तनीय बनाम अपरिवर्तनीय वेक्टर गणित

मान लीजिए मैं इस struct है: इस struct के

#define FOR_EACH for (int i = 0; i < N; ++i) 

template<typename T, unsigned N> 
struct Vector { 
    void scale(T scalar) { 
     FOR_EACH v[i] *= scalar; 
    } 

    void add(const Vector<T, N>& other) { 
     FOR_EACH v[i] += other.v[i]; 
    } 

    void mul(const Vector<T, N>& other) { 
     FOR_EACH v[i] *= other.v[i]; 
    } 

    T v[N]; 
}; 

उदाहरण उपयोग:

Vector<int, 3> v1 = ...; 
Vector<int, 3> v2 = ...; 
v1.scale(10); 
v1.add(v2); 
v1.mul(v2); 

इस परिवर्तनशील दृष्टिकोण है।

एक वैकल्पिक अपरिवर्तनीय दृष्टिकोण ऐसा दिखाई दे सकता:

template<typename T, unsigned N> 
struct Vector { 
    Vector(const Vector<T, N>& other) { 
     memcpy(v, other.v, sizeof(v)); 
    } 

    Vector<T, N> operator+(const Vector<T, N>& other) const { 
     Vector<T, N> result(*this); 
     FOR_EACH result.v[i] += other.v[i]; 
     return result; 
    } 

    Vector<T, N> operator*(T scalar) const { 
     Vector<T, N> result(*this); 
     FOR_EACH result.v[i] *= scalar; 
     return result; 
    } 

    Vector<T, N> operator*(const Vector<T, N>& other) const { 
     Vector<T, N> result(*this); 
     FOR_EACH result.v[i] *= other.v[i]; 
     return result; 
    } 

    T v[N]; 
}; 

उदाहरण उपयोग:

Vector<int, 3> v1 = ...; 
Vector<int, 3> v2 = ...; 
auto result = (v1 * 10 + v2) * v2; 

अब, मैं इस सवाल में एपीआई डिजाइन के साथ संबंध नहीं हूँ। मान लें कि इस संबंध में दोनों समाधान व्यवहार्य हैं।

इसके अलावा, नमूना कोड में int के बजाय यह float या double भी हो सकता है।

मुझे यह क्या रूचि है: आधुनिक सी ++ कंपाइलर द्वारा कौन सा डिज़ाइन अधिक आसानी से विश्लेषण किया जा सकता है? मैं विशेष रूप से किसी एकल कंपाइलर को लक्षित नहीं कर रहा हूं। यदि आपके पास किसी भी कंपाइलर के साथ अनुभव है और यह पता है कि यह ऑप्टिमाइज़ेशन के साथ कैसे काम करता है, तो मैं आपके अनुभव को साझा करता हूं।

  • दूसरा संस्करण बहुत सारे अस्थायी मूल्य उत्पन्न करता है। क्या संकलक उनसे छुटकारा पा सकता है यदि यह आखिरकार सभी ऑपरेटर कॉलों को रेखांकित करता है और सभी अंकगणितीय अभिव्यक्तियों को भीतर देखता है? (मुझे लगता है कि कोई भी कंपाइलर बिना साइड इफेक्ट्स के कारण अस्थायी को खत्म कर सकता है)

  • पहला संस्करण अस्थायी की संख्या को कम करता है लेकिन सख्ती से अनुक्रमिक गणना बनाता है। क्या संकलक अभी भी इरादे को कम कर सकता है और संचालन को इस तरह से पुन: व्यवस्थित कर सकता है कि संचालन की संख्या को कम करता है और उनके समांतरता (सीपीयू निर्देश स्तर पर) की अनुमति देता है?

  • ऊपर के लूप को सदिश बनाने के लिए आधुनिक कंपाइलर के लिए कितना मुश्किल है?

+0

तत्वों के प्रत्यक्ष अनुक्रमण यह आसान संकलक उन्हें vectorize करने के लिए बनाता है। जब इंडेक्स अप्रत्यक्ष रूप से जटिल एल्गोरिदम के साथ लागू होते हैं, तो संकलक विफल हो सकता है। –

उत्तर

0

जहां तक ​​मैं समझता हूं, पहला उदाहरण लक्षित वास्तुकला में समर्थन होने तक वेक्टरनाइज़ करना आसान है। ऐसा इसलिए है क्योंकि लगातार पुनरावृत्तियों में तत्वों के बीच कोई डेटा-निर्भरता नहीं है।

यदि आपके पास लूप हैं जिसमें लगातार पुनरावृत्ति में तत्वों के बीच डेटा-निर्भरताएं हैं, तो कुछ मामलों में उन्हें सॉफ़्टवेयर-पाइपलाइनिंग द्वारा हटाया जा सकता है। सॉफ्टवेयर-पाइपलाइनिंग वेक्टरनाइज़ेशन में मदद करता है।

कुछ आर्किटेक्चर में फ़्लोटिंग पॉइंट गणना सीमित फ़्लोटिंग पॉइंट निष्पादन इकाइयों की वजह से आसानी से वेक्टरिज़ेबल नहीं होती है।

दूसरे उदाहरण में ऐसे अस्थायी हैं जिन्हें इनलाइनिंग द्वारा समाप्त किया जा सकता है।

उपयोगी लिंक्स:

http://software.intel.com/en-us/articles/vectorization-writing-cc-code-in-vector-format

http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1540953&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1540953

+0

लिंक के लिए धन्यवाद। मैं अभी भी प्रश्न के दूसरे भाग के बारे में उत्सुक हूं, अर्थात् अस्थायी दूरियों को अनुकूलित करना। मुझे लगता है कि मुझे निश्चित रूप से सुनिश्चित करने के लिए विभिन्न कंपेलरों के आउटपुट की तुलना करनी चाहिए। –

+0

मेरी प्रतिक्रिया यहां देखें http://stackoverflow.com/a/17476463/811335, इससे मदद मिल सकती है। –

संबंधित मुद्दे