2010-12-02 19 views
6

मुझे पता है कि कुछ प्रोसेसर गलत तरीके से डेटा के साथ असफल हो जाते हैं, और ओह-सामान्य-सामान्य x86 जैसे अन्य, बस इसके साथ धीमे हो जाएंगे।संरेखण अपमानजनक क्यों है?

मेरा प्रश्न है क्यों? पॉइंटर 0x12345678 से पॉइंटर 0x12345679 से डेटा प्राप्त करने के लिए x86 प्रोसेसर के लिए यह कठिन क्यों है? बस स्पष्ट होने के लिए, मुझे पता है कि डेटा त्रुटियां तब हो सकती हैं जब डेटा एकाधिक पृष्ठों में हो, और मैं समझता हूं कि स्मृति से अधिक डेटा प्राप्त करने की आवश्यकता हो सकती है (मूल्य की शुरुआत के लिए एक भाग और अंत में एक) , लेकिन यह हमेशा सत्य नहीं होता है और यह मेरा प्रश्न नहीं है। मैं पूछ रहा हूं, यह हमेशा धीमा क्यों होता है?

मान लीजिए कि स्मृति 0x10000000 पर शुरू होती है। प्रोसेसर को से 0x10000001 से 2-बाइट short प्राप्त करना क्यों कठिन है? 0x10000000 से 0x10000001 से 4-बाइट int क्यों प्राप्त करना मुश्किल है? इत्यादि।

+1

क्या आप कैश लाइनों और प्री-फ़ेचिंग के बारे में भी जानते हैं? – Oded

+0

शायद इसलिए कि उसी आकार की मेमोरी एक्सेस तब ओवरलैप नहीं हो सकती है। लेकिन दूसरी तरफ स्मृति के विभिन्न आकारों की पहुंच अभी भी ओवरलैप हो सकती है, इसलिए मुझे नहीं पता कि यह इतना क्यों हासिल करता है। – CodesInChaos

+0

और यह न केवल पृष्ठ-दोष बल्कि कैश दोष है, और पृष्ठों की तुलना में कैश लाइन आमतौर पर बहुत छोटी होती हैं (AFAIK 64 बाइट सामान्य हैं)। लेकिन वह अभी भी कैश-लाइन के भीतर व्यवहार की व्याख्या नहीं करता है। – CodesInChaos

उत्तर

3

प्रोसेसर केवल एक गठबंधन फैशन में स्मृति तक पहुंच सकता है। यह प्रोसेसर और मेमोरी फ़ंक्शंस के बीच इंटरकनेक्ट का परिणाम है।

जब कोई प्रोसेसर अनचाहे पढ़ने का समर्थन करता है, तो वास्तव में क्या हो रहा है प्रोसेसर दो अलग-अलग पठन (या बड़े आकार का एक पठन) जारी करता है और भागों को एक साथ सिलाई करता है, यही कारण है कि यह एक गठबंधन पढ़ने से धीमा है।

+0

लेकिन प्रोसेसर और मेमोरी (कैश मुझे लगता है) इस तरह से जुड़े क्यों हैं? यदि कोई कैश-लाइन सीमा पार नहीं हो पाती है तो रैम से डेटा अधिक महंगा नहीं होता है, इसलिए यह कैश पहुंच होना चाहिए। – CodesInChaos

+0

और यदि मेरे पास 32 बिट रीडलाइन है जो 64 बिट प्रोसेसर पर 64 बिट सीमा पार नहीं करता है, तो उसे गठबंधन पढ़ने से अधिक कठिन क्यों होना चाहिए? – CodesInChaos

+1

प्रोसेसर डिजाइन समझौता के बारे में सब कुछ है। इसमें कई ट्रांजिस्टर और असीमित पढ़ने को गठबंधन पढ़ने के रूप में कुशल बनाने के लिए बहुत सारी शक्तियां होती हैं, और उपयोग-मामला इतना असामान्य है कि उन्हें कहीं और खर्च करना बेहतर होता है। संपादित करें: विशेष रूप से यदि आप इसे से बाहर निकलने जा रहे हैं, तो "अनचाहे पढ़ने कभी-कभी तेज़ होते हैं और कभी-कभी धीमे होते हैं कि वे कैश लाइन के भीतर पूरी तरह से गिरते हैं या नहीं।" –

1

एक उदाहरण: यदि डाटाबेस 32 बिट्स है और 32 बिट मान 32 बिट सीमा पर नहीं है, तो बाइट्स को एक से अधिक ऑपरेशन में लाया जाना होगा और प्रोसेसर रजिस्टर में मूल्य को ठीक से लोड करने के लिए चारों ओर ले जाना होगा ।

4

क्योंकि डेटा बस आठ बिट्स से अधिक व्यापक है।

मान लें कि डेटा बस 32 बिट्स है। पता 0x10000001 से 16 बिट प्राप्त करने के लिए, इसे चार बाइट प्राप्त करना होगा जो 0x10000000 से शुरू होता है और बीच में दो बाइट प्राप्त करने के लिए मान को स्थानांतरित करता है।

पते 0x10000003 से 16 बिट प्राप्त करने के लिए, इसे 0x10000000 और 0x10000004 से शुरू होने वाले शब्दों को प्राप्त करना होगा, और प्रत्येक मान से एक बाइट का उपयोग करना होगा।

+0

क्या 'बस आकार' प्रोसेसर के नाम का आकार अर्थात 64-बिट है प्रोसेसर में 64 बिट चौड़ी बस है? – unixman83

+1

@ unixman83: नहीं, यह आंतरिक मशीन शब्द का आकार है, जिसे किसी भी बस आकार के समान नहीं होना चाहिए। वे अक्सर वही होते हैं, लेकिन उदाहरण के लिए पेंटियम 32-बिट एड्रेस बस और 64-बिट डेटा बस के साथ 32-बिट प्रोसेसर था। – Guffa