2010-06-11 16 views
9

अगर आपको लगता है कि यह कई बार उत्तर दिया गया है, तो मुझे क्षमा करें, लेकिन मुझे निम्नलिखित प्रश्नों के उत्तर की आवश्यकता है!सीपीयू और डेटा संरेखण

  1. डेटा को गठबंधन क्यों किया जाना चाहिए (4 बाइट/8 बाइट/2 बाइट सीमाओं पर)? यहां मेरा संदेह यह है कि जब सीपीयू को पता एक्सएक्स एक्स एक्स 1 एक्स 2 ... ए 2 ए 1 ​​ए 0 है तो क्रमशः स्मृति स्थानों को संबोधित करना काफी संभव है। तो विशिष्ट सीमाओं पर डेटा को संरेखित करने की आवश्यकता क्यों है?

  2. जब मैं अपना कोड संकलित कर रहा हूं और निष्पादन को उत्पन्न कर रहा हूं तो संरेखण आवश्यकताओं को कैसे ढूंढें?

  3. यदि उदाहरण के लिए डेटा संरेखण 4 बाइट सीमा है, तो क्या इसका मतलब है कि प्रत्येक लगातार बाइट मॉड्यूल 4 ऑफसेट पर स्थित है? मेरा संदेह यह है कि यदि डेटा 4 बाइट गठबंधन है तो इसका मतलब यह है कि यदि बाइट 1004 पर है तो अगला बाइट 1008 (या 1005 पर) है?

आपके विचारों का बहुत स्वागत है।

अग्रिम धन्यवाद! /एमएस

उत्तर

11

सीपीयू शब्द उन्मुख होते हैं, नहीं उन्मुख बाइट किया जाएगा। एक साधारण सीपीयू में, स्मृति को आमतौर पर एक शब्द (32 बिट्स, 64 बिट्स इत्यादि) प्रति पते स्ट्रोब को वापस करने के लिए कॉन्फ़िगर किया जाता है, जहां नीचे दो (या अधिक) पता रेखाएं आमतौर पर डॉन-केयर बिट्स नहीं होती हैं।

इंटेल सीपीयू कई निर्देशों के लिए गैर-शब्द सीमाओं पर पहुंच निष्पादित कर सकते हैं, हालांकि आंतरिक रूप से सीपीयू दो मेमोरी एक्सेस करता है और एक शब्द लोड करने के लिए गणित ऑपरेशन करता है। यदि आप बाइट पढ़ रहे हैं, तो कोई संरेखण लागू नहीं होता है।

कुछ CPUs (एआरएम, या इंटेल एसएसई निर्देश) को गठबंधन मेमोरी की आवश्यकता होती है और असाइन किए गए एक्सेस (या अपवाद फेंकते समय) को अपरिभाषित ऑपरेशन किया जाता है। वे अधिक जटिल लोड/स्टोर उपप्रणाली को लागू नहीं करके महत्वपूर्ण सिलिकॉन स्थान बचाते हैं।

संरेखण सीपीयू शब्द आकार (16, 32, 64 बिट) या एसएसई रजिस्टर आकार (128 बिट्स) के मामले में निर्भर करता है।

अपने अंतिम प्रश्न के लिए, यदि आप एक समय में एक ही डेटा बाइट लोड कर रहे हैं तो अधिकांश CPUs पर कोई संरेखण प्रतिबंध नहीं है (कुछ डीएसपी में बाइट स्तर के निर्देश नहीं हैं, लेकिन इसकी संभावना है कि आप एक में नहीं चले जाएंगे) ।

+0

हाय थिएट्रस, यहां मेरा संदेह है! यह क्यों है कि निचले 2 पता रेखाएं समाप्त हो गई हैं? इस सेटअप के साथ Coz मैं केवल पते 0, 4, 8 से डेटा तक पहुंच सकते हैं .. इतने पर। तो ऐसी स्थिति में बाइट मैनिपुलेशन की देखभाल कैसे की जाती है? आपने बताया कि एक डेटा बाइट के लिए कोई संरेखण प्रतिबंध नहीं है, यह कैसे प्राप्त किया जाता है जब नीचे 2 पता पंक्तियों पर ध्यान नहीं दिया जाता है? आपके उत्तर के लिए धन्यवाद! –

+0

अधिकतर मैं इस बात से चिंतित हूं कि मेरे कोड में बाइट मैनिपुलेशन होने पर पता लाइनों पर ध्यान क्यों नहीं दिया जाता है (और ऐसा करने के लिए लगभग सभी तरह से जाना ..)? लिंक के लिए –

2

सामान्यतः, उन सभी तीनों सवालों का जवाब यह है कि "यह आपके सिस्टम पर निर्भर करता है"। कुछ और विवरण:

  1. आपकी मेमोरी सिस्टम बाइट-एड्रेसेबल नहीं हो सकती है। इसके अलावा, आपके प्रोसेसर को असाइन किए गए डेटा तक पहुंचने के लिए आपको प्रदर्शन दंड लग सकता है। कुछ प्रोसेसर (जैसे पुराने एआरएम चिप्स, उदाहरण के लिए) बस इसे बिल्कुल नहीं कर सकते हैं।

  2. अपने प्रोसेसर के लिए मैनुअल पढ़ें और जो कुछ भी ABI विनिर्देश अपने कोड के लिए उत्पन्न की जा रही है,

  3. आमतौर पर जब लोग डेटा एक निश्चित संरेखण पर होने का उल्लेख है, यह केवल पहले बाइट को दर्शाता है। तो अगर एबीआई स्पेक ने कहा "डेटा स्ट्रक्चर एक्स को 4-बाइट गठबंधन किया जाना चाहिए", इसका मतलब है कि एक्स को उस पते पर स्मृति में रखा जाना चाहिए जो 4 से विभाजित है। संरचना के आकार या आंतरिक लेआउट के बारे में उस सीमा के बारे में कुछ भी नहीं बताया गया है ।

    जहां तक ​​अपने विशेष उदाहरण चला जाता है, यदि डेटा 4 बाइट का पता 1004 में शुरू गठबंधन है, अगले बाइट में 1005.

5

बहुत कम डेटा "गठबंधन" होना है। यह और अधिक है कि कुछ प्रकार के डेटा बेहतर प्रदर्शन कर सकते हैं या कुछ सीपीयू संचालन के लिए एक निश्चित डेटा संरेखण की आवश्यकता होती है।

सबसे पहले, मान लीजिए कि आप एक समय में 4 बाइट डेटा पढ़ रहे हैं। आइए यह भी कहें कि आपके सीपीयू में 32 बिट डेटा बस है। आइए यह भी कहें कि आपका डेटा सिस्टम मेमोरी में बाइट 2 पर संग्रहीत है।

अब से आप एक बार में 4 बाइट डेटा लोड कर सकते हैं, इसलिए यह आपके अलर्ट को एक बाइट को इंगित करने के लिए बहुत अधिक समझ में नहीं आता है। अपना पता रजिस्टर प्रत्येक 4 बाइट्स पर इंगित करके आप 4 गुणा डेटा में हेरफेर कर सकते हैं। तो दूसरे शब्दों में आपका सीपीयू केवल बाइट 0, 4, 8, 12, 16 इत्यादि से शुरू होने वाले डेटा को पढ़ने में सक्षम हो सकता है।

तो यहां समस्या है। यदि आप बाइट 2 से शुरू होने वाले डेटा को चाहते हैं और आप 4 बाइट्स पढ़ रहे हैं, तो आपका आधा डेटा पता स्थिति 0 और स्थिति में दूसरा आधा होगा।

तो मूल रूप से आप दो बार स्मृति को मारना बंद कर देंगे अपने एक 4 बाइट डेटा तत्व को पढ़ने के लिए। कुछ सीपीयू इस प्रकार के ऑपरेशन का समर्थन नहीं करते हैं (या आपको दो परिणामों को मैन्युअल रूप से लोड और गठबंधन करने के लिए मजबूर करते हैं)।

यहाँ अधिक जानकारी के लिए जाएँ: http://en.wikipedia.org/wiki/Data_structure_alignment

+5

+1, लेकिन आपको ध्यान रखना चाहिए कि केवल कुछ प्रोसेसर गलत हस्ताक्षर किए गए डेटा को सहन करते हैं। इंटेल आईए 32 और आईए 64 आर्किटेक्चर के लिए करता है, लेकिन इटेनियम के लिए नहीं। आपका स्पष्टीकरण केवल उन प्रोसेसर के लिए सही है जो गलत तरीके से डेटा के लिए सहनशील हैं जैसे IA32/IA64। अल्फा एएक्सपी एक गलती उत्पन्न करेगा, और मुझे लगता है कि एमआईपीएस भी होगा। कुछ ओएस गलती हैंडलर में गलत हस्ताक्षर किए गए डेटा को संभालेगा, लेकिन इसके लिए प्रदर्शन जुर्माना बहुत बड़ा है। और यदि ओएस इसे संभाल नहीं पाता है, तो गलत तरीके से डेटा उन सिस्टम के लिए _at all_ काम नहीं करता है। –

4

1.) कुछ आर्किटेक्चर बिल्कुल इस आवश्यकता नहीं है, कुछ संरेखण को प्रोत्साहित (वहाँ रफ्तार दंड जब गैर alignet डेटा आइटम एक्सेस करने वाले) है, और कुछ को लागू कर सकते यह कड़ाई से (misaligment एक प्रोसेसर अपवाद का कारण बनता है)।
आजकल कई लोकप्रिय वास्तुकला स्पीड पेनल्टी श्रेणी में आते हैं। सीपीयू डिजाइनरों को लचीलापन/प्रदर्शन और लागत (सिलिकॉन क्षेत्र/बस चक्रों के लिए आवश्यक नियंत्रण संकेतों की संख्या) के बीच एक व्यापार करना पड़ा।

2.) कौन सी भाषा, वास्तुकला? अपने कंपाइलर्स मैनुअल और/या सीपीयू आर्किटेक्चर दस्तावेज से परामर्श लें।

3.) फिर यह पूरी तरह से आर्किटेक्चर निर्भर है (कुछ आर्किटेक्चर बाइट आकार के सामानों पर पहुंच की अनुमति नहीं दे सकते हैं, या बस चौड़ाई है जो 8 बिट्स के एकाधिक भी नहीं हैं)। तो जब तक आप विशिष्ट आर्किटेक्चर के बारे में नहीं पूछ रहे हैं तो आपको कोई उपयोगी उत्तर नहीं मिलेगा।

-1

"अब जब से आप एक बार में 4 बाइट डेटा लोड कर सकते हैं, तो यह आपके पते रजिस्टर को एक बाइट को इंगित करने के लिए बहुत अधिक समझ में नहीं आता है।"

क्यों? मैं एक समय में पद 1, 2, 3, 4 क्यों नहीं पढ़ सकता? मुझे लगता है कि ऐसा करने से प्रदर्शन खराब नहीं होगा और सर्किट्री में बहुत जटिलता होगी?

+0

यह एक उत्तर नहीं है। मुझे लगता है कि आपने इसे एक भरने के प्रश्न में बनाया है (http://stackoverflow.com/questions/3903164/why-misaligned-address-access-incur-2-or-more-accesses) जो सही बात थी कर। –

1

यह पूरी तरह से आपके द्वारा उपयोग किए जा रहे CPU पर निर्भर करता है!

कुछ आर्किटेक्चर केवल 32 (या 36!) बिट शब्दों में ही सौदे करते हैं और आपको सिंगल वर्ण या हाफ शब्द लोड करने के लिए विशेष निर्देशों की आवश्यकता होती है।

कुछ सीपीयू (विशेष रूप से पावरपीसी और अन्य आईबीएम रिस्क चिप्स) संरेखण के बारे में परवाह नहीं करते हैं और अजीब पते से पूर्णांक लोड करेंगे।

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

1

प्रदर्शन कारण के लिए सीपीयू द्वारा डेटा संरेखण की आवश्यकता है। इंटेल वेबसाइट स्मृति

Data Alignment when Migrating to 64-Bit Intel® Architecture

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

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

यह अनुशंसा की जाती है कि 16 बाइट से अधिक की सभी संरचनाएं 16-बाइट सीमाओं पर संरेखित हों। सामान्य तौर पर, सर्वश्रेष्ठ प्रदर्शन के लिए, डेटा संरेखित इस प्रकार है:

  • संरेखित किसी भी पते
  • एक गठबंधन चार-बाइट शब्द के भीतर समाहित किया जाना
  • संरेखित 16-बिट डेटा
  • संरेखित 32 पर 8 बिट डेटा -बिट डेटा ताकि इसके आधार का पता चार
  • संरेखित 64-बिट डेटा की एक बहु है ताकि उसके आधार पता आठ
  • संरेखित 80-बिट डेटा की एक बहु है ताकि उसके आधार पते सोलह
  • का गुणज है
  • 128-बिट डेटा संरेखित करें ताकि वह इसके आधार पते सोलह की एक बहु

एक तो यह है कि इसके आधार का पता 64 आकार घटते क्रम में डेटा सॉर्ट की एक बहु है 64-बाइट या अधिक से अधिक डेटा संरचना या सरणी गठबंधन किया जाना चाहिए के साथ सहायता के लिए एक अनुमानी है प्राकृतिक संरेखण। जब तक 16-बाइट सीमाएं (और कैश लाइनें) कभी पार नहीं होती हैं, प्राकृतिक संरेखण सख्ती से जरूरी नहीं है, हालांकि यह सामान्य संरेखण अनुशंसाओं का अनुपालन करने का एक आसान तरीका है।

संरचनाओं के भीतर डेटा को सही ढंग से संरेखित करने से डेटा ब्लोट (पैडिंग को सही ढंग से रखने के लिए आवश्यक पैडिंग के कारण) हो सकता है, इसलिए जहां आवश्यक हो और संभव हो, संरचनाओं को पुनर्गठित करने के लिए उपयोगी है ताकि व्यापक संरेखण की आवश्यकता वाले फ़ील्ड संरचना में पहले हों । इस समस्या को हल करने के लिए लेख "आईए -64 आर्किटेक्चर (कोड क्लीन) के लिए कोड तैयार करना" लेख में दिखाई देता है।

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