2012-09-19 8 views
14

मैं हमेशा सुनता हूं कि असाइन किए गए एक्सेस खराब हैं क्योंकि वे या तो रनटाइम त्रुटियों का कारण बनेंगे और प्रोग्राम को क्रैश करेंगे या धीमी मेमोरी एक्सेस हो जाएगी। हालांकि मुझे कोई वास्तविक डेटा नहीं मिल रहा है कि वे चीजों को धीमा कर देंगे।x86 पर सफल unaligned पहुंच का वास्तविक प्रभाव क्या है?

मान लीजिए कि मैं x86 पर हूं और अनगिनत पहुंच के कुछ (अभी तक अज्ञात) शेयर हैं - वास्तव में सबसे खराब मंदी क्या है और मैं सभी असाइन किए गए एक्सेसों को समाप्त किए बिना कोड के दो संस्करणों के रन टाइम की तुलना किए बिना इसका अनुमान कैसे लगा सकता हूं?

+0

अंगूठे का नियम: अधिकांश आर्किटेक्चर पर अनलिखित पढ़ने के परिणामस्वरूप एक गठबंधन पढ़ने की तुलना में ~ 2x प्रदर्शन हिट होता है क्योंकि इसमें डेटा प्राप्त करने और इसे ठीक करने के लिए दो पढ़ने चक्र होते हैं। लेखन थोड़ा अधिक जटिल हैं। –

उत्तर

13

यह अधिकांश x86 एसएसई लोड/स्टोर निर्देशों (असाइन किए गए संस्करणों को छोड़कर) के लिए निर्देशों पर निर्भर करता है, यह एक गलती का कारण बनता है, जिसका अर्थ है कि यह संभवतः आपके प्रोग्राम को क्रैश करेगा या कई दौर यात्राओं का नेतृत्व करेगा आपका अपवाद हैंडलर (जिसका अर्थ है कि लगभग या सभी प्रदर्शन खो गया है)। असाइन किए गए लोड/स्टोर वेरिएंट आईआईआरसी के चक्रों की दोगुनी मात्रा में चलते हैं, क्योंकि वे आंशिक पढ़ने/लिखते हैं, इसलिए ऑपरेशन करने के लिए 2 की आवश्यकता होती है (जब तक आप भाग्यशाली नहीं होते हैं और कैश में होते हैं, जो दंड को बहुत कम करता है)।

सामान्य x86 लोड/स्टोर निर्देशों के लिए, दंड गति है, क्योंकि अधिक चक्र पढ़ने या लिखने के लिए आवश्यक हैं। असाइनमेंट कैशिंग को भी प्रभावित कर सकता है, जिससे कैश लाइन स्प्लिटिंग और कैश सीमा स्ट्रैडलिंग हो सकती है। यह पढ़ने और लिखने पर परमाणुता को भी रोकता है (जो x86 के सभी गठबंधन पढ़ने/लिखने के लिए गारंटीकृत है, बाधाएं और प्रचार कुछ और है, लेकिन असाइन किए गए डेटा पर LOCK'ed निर्देश का उपयोग करने से पहले से ही बड़े पैमाने पर जुर्माना हो सकता है या अपवाद हो सकता है लॉक इनर्स), जो समवर्ती प्रोग्रामिंग के लिए नो-नो है।

Intels x86 & x64 optimizations manual प्रत्येक उपरोक्त समस्या, उनके दुष्प्रभावों और उन्हें कैसे हल करने के बारे में बहुत विस्तार से जाता है।

Agner Fog' optimization manuals आपके पास कच्चे चक्र थ्रूपुट के संदर्भ में सटीक संख्याएं होनी चाहिए।

+0

एग्नेर कोहरे के कागजात में एक नज़र डाली थी लेकिन विशिष्ट संख्याएं नहीं मिल सका। क्या आप मुझे सही पेज/टेबल पर इंगित कर सकते हैं? –

+0

@NitsanWakart: असाइन किए गए एसएसई निर्देश यहां सूचीबद्ध हैं: http://www.agner.org/optimize/instruction_tables.pdf, सामान्य निर्देशों के लिए जुर्माना के लिए दंड आपको डेवलपर मैनुअल में उचित इंटेल अध्याय से परामर्श करने की आवश्यकता है (अध्याय 8 या 9 आईआईआरसी, कम से कम, असाइन किए गए पढ़ने के लिए चक्रों को दोगुना करने की आवश्यकता होती है) – Necrolis

+0

मैं विशेष रूप से हालिया (पोस्ट कोर 2) सीपीयू का उपयोग करके असाइन किए गए (कैशलाइन स्ट्रैडलिंग) तक एमओवी को दंड की तलाश में हूं। एग्नेर की निर्देश तालिका लागत में मुझे दंड नहीं मिल रहा है, और आपके डेटा को संरेखित करने के लिए सामान्य सलाह के अलावा मुझे इंटेल मैनुअल में प्रासंगिक संदर्भ नहीं मिल रहा है। –

2

सामान्य प्रोसेसर पर सामान्य अनुमान लगाने की गति बेहद जटिल है। यह न केवल हस्ताक्षरित पहुंच के लिए बल्कि सामान्य रूप से सच है।

आधुनिक प्रोसेसर के पास क्रमशः पाइपलाइन आर्किटेक्चर हैं, संभवतः निर्देशों के समानांतर निष्पादन और कई अन्य चीजें जो निष्पादन को प्रभावित कर सकती हैं।

यदि अनलिखित पहुंच समर्थित नहीं है तो आपको अपवाद मिलता है। लेकिन अगर यह समर्थित है तो आप कई कारकों के आधार पर मंदी कर सकते हैं या नहीं भी। इन कारकों में शामिल हैं कि आप कौन से अन्य निर्देशों को असाइन किए गए पहले और बाद में निष्पादित कर रहे थे (क्योंकि प्रोसेसर पिछले निर्देशों को निष्पादित करते समय या आगे बढ़ने के लिए अपना डेटा लाने में सक्षम हो सकता है और प्रतीक्षा करते समय बाद के निर्देशों को निष्पादित कर सकता है)।

एक और महत्वपूर्ण अंतर तब होता है जब अनचाहे पहुंच कैशलाइन सीमाओं में होती है। आम तौर पर कैश में 2x तक पहुंच एक अनियंत्रित पहुंच के लिए हो सकती है, वास्तविक मंदी यह है कि यदि पहुंच कैशलाइन सीमा पार करती है और डबल कैश मिस का कारण बनती है। सबसे खराब संभावित मामले में 2 बाइट अनलाइन किए गए पढ़ने के लिए प्रोसेसर को स्मृति के लिए दो शैलियों को बाहर निकालने की आवश्यकता हो सकती है और फिर स्मृति से 2 शैलियों को पढ़ा जा सकता है। यह एक बहुत सारी डेटा चलती है।

अनुकूलन के लिए सामान्य नियम भी यहां लागू होता है: पहला कोड, फिर मापें, फिर अगर और कोई समस्या हो तो समाधान हो।

5

कुछ इंटेल माइक्रो-आर्किटेक्चर पर, एक कैशलाइन सीमा से विभाजित एक भार सामान्य से एक दर्जन चक्र लंबा होता है, और एक पृष्ठ सीमा द्वारा विभाजित भार 200 चक्र से अधिक लंबा होता है। यह इतना बुरा है कि यदि लोड को लगातार लूप में गलत तरीके से गलत तरीके से गलती की जा रही है, तो यह दो गठबंधन भार करने और परिणामों को मैन्युअल रूप से विलय करने के लायक है, भले ही palignr कोई विकल्प न हो।यहां तक ​​कि एसएसई के असाइन किए गए भार आपको भी नहीं बचाएंगे, जब तक कि वे बीच में बिल्कुल अलग नहीं हो जाते।

एएमडी पर यह कभी भी कोई समस्या नहीं थी, और समस्या नेहलेम में ज्यादातर गायब हो गई, लेकिन वहां अभी भी बहुत सारे कोर 2 हैं।

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