2013-05-22 6 views
5

पर गठबंधन किया जाना चाहिए जैसा कि हम जानते हैं, X86 CPU में 64 बिट डेटा बस है। मेरी समझ यह है कि सीपीयू मनमाने ढंग से पते तक नहीं पहुंच सकता है। वह पता जो सीपीयू तक पहुंच सकता है वह इसकी डेटा बस की चौड़ाई का अभिन्न अंग है। प्रदर्शन के लिए, अतिरिक्त मेमोरी एक्सेस से बचने के लिए चर को इन पतों पर (गठबंधन) शुरू करना चाहिए। 4 बिट सीमा से गठबंधन 32 बिट चर स्वचालित रूप से 8 बिट (64 बिट) सीमा तक गठबंधन किया जाएगा, जो x86 64 बिट डेटा बस के अनुरूप है। लेकिन क्यों कंप्यूटर्स 128 बिट चर को 16 बिट सीमा तक संरेखित करते हैं? 8 बाइट सीमा नहीं है?क्यों 128 बिट चर को 16 बिट सीमा

धन्यवाद

मुझे चीजों को और अधिक विशिष्ट बनाने दें। कंपाइलर इसे संरेखित करने के लिए एक चर की लंबाई का उपयोग करते हैं। उदाहरण के लिए, यदि एक चर के पास 256 बिट लंबाई है, तो शिकायतकर्ता इसे 32 बिट सीमा तक संरेखित करेगा। मुझे नहीं लगता कि किसी भी प्रकार के सीपीयू में उस लंबी डेटा-बस है। इसके अलावा, कैश के बावजूद आम डीडीआर यादें केवल 64 बिट डेटा को स्थानांतरित करती हैं, एक मेमोरी सीपीयू की व्यापक डेटा-बस कैसे भर सकती है? या केवल कैश के माध्यम से?

+3

"जैसा कि हम जानते हैं, एक्स 86 सीपीयू में 64 बिट डेटा बस है" - यह सच नहीं है। x86 डेटा-बस आकारों के बारे में कुछ भी नहीं कहता है। आधुनिक प्रोसेसर में वास्तव में इसकी तुलना में बड़ी डेटा बस चौड़ाई होती है। – Mysticial

+4

प्रोसेसर डेटा बस से डेटा नहीं पढ़ता है, वे इसे कैश से पढ़ते हैं। एक कैश लाइन सीमा straddling से बचने के लिए एक 16-बाइट संरेखण की आवश्यकता है। –

+0

@ मैस्टिसियल मुझे लगता है कि वर्तमान में सबसे लोकप्रिय x86 CPUs में 64 बिट डेटा बस है, है ना? – iqapple

उत्तर

4

बहुत से अलग प्रोसेसर मॉडल है कि मैं केवल सैद्धांतिक और सामान्य शब्दों में यह जवाब देने के लिए जा रहा हूँ रहे हैं।

16-बाइट में ऑब्जेक्ट की श्रृंखला है जिसमें कोई पता है कि आठ बाइट्स की एक बहु लेकिन 16 बाइट्स की नहीं है पर शुरू होता है पर विचार करें। आइए मान लें कि प्रोसेसर में आठ-बाइट बस है, जैसा कि प्रश्न में दर्शाया गया है, भले ही कुछ प्रोसेसर न हों। हालांकि, ध्यान दें कि सरणी में किसी बिंदु पर, ऑब्जेक्ट्स में से एक को पृष्ठ सीमा को खड़ा करना चाहिए: मेमोरी मैपिंग आमतौर पर 4096-बाइट पृष्ठों पर काम करती है जो 4096-बाइट सीमाओं से शुरू होती है। आठ-बाइट-गठबंधन सरणी के साथ, सरणी का कुछ तत्व एक पृष्ठ के बाइट 4088 से शुरू होगा और अगले पृष्ठ के बाइट 7 तक जारी रहेगा।

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

इसके अलावा, के रूप में हंस Passant बताया गया है, संरेखण कैश साथ सूचना का आदान। प्रत्येक प्रोसेसर में मेमोरी कैश होता है, और 32-बाइट या 64-बाइट "लाइनों" में कैश को व्यवस्थित करना आम बात है। यदि आप 16-बाइट ऑब्जेक्ट लोड करते हैं जो कि 16-बाइट गठबंधन है, और ऑब्जेक्ट कैश में है, तो कैश एक कैश लाइन की आपूर्ति कर सकता है जिसमें आवश्यक डेटा होता है। यदि आप 16-बाइट ऑब्जेक्ट्स को उस सरणी से लोड कर रहे हैं जो 16-बाइट गठबंधन नहीं है, तो सरणी में से कुछ ऑब्जेक्ट्स दो कैश लाइनों को खड़ा कर देगा। जब इन वस्तुओं को लोड किया जाता है, तो दो लाइनों को कैश से लाया जाना चाहिए। इसमें अधिक समय लग सकता है। यहां तक ​​कि यदि दो लाइनें प्राप्त करने में अधिक समय नहीं लगता है, शायद प्रोसेसर को प्रति चक्र दो कैश लाइन प्रदान करने के लिए डिज़ाइन किया गया है, यह अन्य चीजों में हस्तक्षेप कर सकता है जो एक प्रोग्राम कर रहा है। आम तौर पर, एक प्रोग्राम कई स्थानों से डेटा लोड करेगा। यदि भार कुशल हैं, प्रोसेसर एक बार में दो प्रदर्शन करने में सक्षम हो सकता है। लेकिन अगर उनमें से एक को सामान्य की बजाय दो कैश लाइनों की आवश्यकता होती है, तो यह अन्य लोड संचालन के साथ-साथ निष्पादन को अवरुद्ध करता है।

साथ ही, कुछ निर्देश स्पष्ट रूप से गठबंधन पतों की आवश्यकता है। प्रोसेसर इन निर्देशों को अधिक सीधे प्रेषित कर सकता है, कुछ परीक्षणों को छोड़कर जो गठबंधन पते के बिना संचालन को ठीक करता है। जब इन निर्देशों के पते हल हो जाते हैं और उन्हें गलत तरीके से पहचाना जाता है, तो प्रोसेसर को उन्हें निरस्त करना होगा, क्योंकि फिक्स-अप ऑपरेशन को छोड़ दिया गया है।

+0

मुझे पता है कि आप सही हैं, भले ही कुछ बिंदु मेरे लिए गूढ़ हों। – iqapple

+0

आईएमओ, इस उत्तर में से अधिकांश, जबकि स्वयं ही सत्य है, वह qustion के लिए अप्रासंगिक है "लेकिन क्यों compilers 16 बिट सीमा तक 128 बिट चर संरेखित करें? "। उस प्रश्न का उत्तर बस इतना है कि हार्डवेयर को ऐसा करने की आवश्यकता है, संकलक ऐसा नहीं करता क्योंकि यह अधिक कुशल है लेकिन क्योंकि कोई अन्य तरीका काम नहीं करेगा। आप कहते हैं "16-बाइट ऑब्जेक्ट्स की एक सरणी पर विचार करें जो एक पते पर शुरू होता है जो आठ बाइट्स का एक बहु है लेकिन 16 बाइट्स नहीं है।", ठीक है कि यह काम नहीं करेगा (क्योंकि सीपीयू हार्डवेयर इसका समर्थन नहीं करता है) परवाह किए बिनाक्या सरणी पृष्ठ सीमा पार करती है या नहीं। – Bull

+0

दरअसल यह "चर" द्वारा किए गए प्रश्न पर निर्भर करता है। मैं __m128i जैसे 128 चर के बारे में सोच रहा था। यदि यह 'struct foo {char x [128];} जैसी चीज़ों के संबंध में है, तो मैं एरिक से सहमत हूं। – Bull

5

एक कारण है कि X86 पर सबसे SSE2 निर्देश 128 बिट गठबंधन होने के लिए डेटा की आवश्यकता होती है। यह डिज़ाइन निर्णय प्रदर्शन कारणों से और अत्यधिक जटिल (और इसलिए धीमी और बड़ी) हार्डवेयर से बचने के लिए किया गया होगा।

+0

मुझे लगता है कि यह शायद सही है। मैं यहां एक लूप में फंस गया हूं जो यह पता लगाने की कोशिश कर रहा है कि कौन से कंपाइलर स्वचालित रूप से __m128i को संरेखित करते हैं टाइप करें जो वेक्टरकृत सिम गणना के लिए प्रयोग किया जाता है। –

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