سؤال

من المسلم به أنني لا أفهم ذلك.لنفترض أن لديك ذاكرة بها كلمة ذاكرة يبلغ طولها 1 بايت.لماذا لا يمكنك الوصول إلى متغير بطول 4 بايت في وصول واحد للذاكرة على عنوان غير محاذي (أيغير قابلة للقسمة على 4)، كما هو الحال مع العناوين المحاذاة؟

هل كانت مفيدة؟

المحلول

وانها الحد من العديد من المعالجات الأساسية. ويمكن عادة أن يعمل في جميع أنحاء عن طريق القيام 4 بايت واحد غير فعالة جلب كلمة الكفاءة بدلا من جلب، ولكن العديد من المتخصصين لغة قرر أنه سيكون من الأسهل فقط لحظر عليهم وإجبار كل شيء إلى الانحياز.

وهناك المزيد من المعلومات في هذا الرابط أن OP اكتشافها.

نصائح أخرى

يقتصر نظام الذاكرة الفرعي في المعالج الحديث على الوصول إلى الذاكرة بدقة ومحاذاة حجم الكلمة الخاص بها؛هذا هو الحال لعدد من الأسباب.

سرعة

تحتوي المعالجات الحديثة على مستويات متعددة من ذاكرة التخزين المؤقت التي يجب سحب البيانات من خلالها؛إن دعم القراءات أحادية البايت من شأنه أن يجعل إنتاجية النظام الفرعي للذاكرة مرتبطة بإحكام بإنتاجية وحدة التنفيذ (المعروفة أيضًا باسم وحدة المعالجة المركزية) ؛كل هذا يذكرنا بكيفية حدوث ذلك تم تجاوز وضع PIO بواسطة DMA للعديد من الأسباب نفسها في محركات الأقراص الثابتة.

وحدة المعالجة المركزية دائماً يقرأ بحجم الكلمة (4 بايت على معالج 32 بت)، لذلك عندما تقوم بالوصول غير المحاذي إلى العنوان - على معالج يدعمه - سيقرأ المعالج كلمات متعددة.ستقوم وحدة المعالجة المركزية بقراءة كل كلمة من الذاكرة التي يمتد إليها العنوان المطلوب.يؤدي هذا إلى تضخيم ما يصل إلى 2X عدد معاملات الذاكرة المطلوبة للوصول إلى البيانات المطلوبة.

ولهذا السبب، قد يكون من السهل جدًا قراءة بايتين أبطأ من أربعة.على سبيل المثال، لنفترض أن لديك بنية في الذاكرة تبدو كما يلي:

struct mystruct {
    char c;  // one byte
    int i;   // four bytes
    short s; // two bytes
}

على معالج 32 بت، من المرجح أن تتم محاذاته كما هو موضح هنا:

Struct Layout

يستطيع المعالج قراءة كل عضو من هؤلاء الأعضاء في معاملة واحدة.

لنفترض أن لديك نسخة معبأة من البنية، ربما من الشبكة حيث تم تعبئتها لكفاءة الإرسال؛قد يبدو مثل هذا:

Packed Struct

قراءة البايت الأول ستكون هي نفسها.

عندما تطلب من المعالج أن يمنحك 16 بت من 0x0005، سيتعين عليه قراءة كلمة من 0x0004 والتحويل إلى اليسار بمقدار بايت واحد لوضعها في سجل 16 بت؛بعض العمل الإضافي، ولكن يمكن لمعظمهم التعامل مع ذلك في دورة واحدة.

عندما تطلب 32 بت من 0x0001 ستحصل على تضخيم 2X.سيقرأ المعالج من 0x0000 إلى سجل النتائج وينقل إلى اليسار بمقدار 1 بايت، ثم يقرأ مرة أخرى من 0x0004 إلى سجل مؤقت، وينقل إلى اليمين بمقدار 3 بايت، ثم OR مع تسجيل النتيجة.

يتراوح

بالنسبة لأي مساحة عنوان معينة، إذا كانت البنية يمكن أن تفترض أن وحدتي LSBs تكونان دائمًا 0 (على سبيل المثال، أجهزة 32 بت)، فيمكنها الوصول إلى ذاكرة أكبر بأربع مرات (يمكن أن تمثل البتتان المحفوظة 4 حالات مختلفة)، أو نفس المقدار من الذاكرة مع 2 بت لشيء مثل الأعلام.إن إزالة 2 LSBs من العنوان سيمنحك محاذاة 4 بايت؛يشار إليها أيضًا باسم أ خطوة من 4 بايت.في كل مرة تتم فيها زيادة العنوان، فإنه يؤدي فعليًا إلى زيادة البتة 2، وليس البتة 0، أي أن البتتين الأخيرتين ستظلان دائمًا 00.

يمكن أن يؤثر هذا أيضًا على التصميم المادي للنظام.إذا كان ناقل العناوين يحتاج إلى عدد 2 بت أقل، فمن الممكن أن يكون هناك عدد أقل من المسامير على وحدة المعالجة المركزية وعدد 2 أثر أقل على لوحة الدائرة.

الذرية

يمكن لوحدة المعالجة المركزية أن تعمل على كلمة محاذية من الذاكرة ذريًا، مما يعني أنه لا توجد تعليمات أخرى يمكنها مقاطعة تلك العملية.وهذا أمر بالغ الأهمية للتشغيل الصحيح للكثيرين هياكل بيانات خالية من القفل وغيرها التزامن النماذج.

خاتمة

يعد نظام الذاكرة الخاص بالمعالج أكثر تعقيدًا وتفاعلًا مما هو موصوف هنا؛مناقشة حول كيف يعالج معالج x86 الذاكرة فعليًا يمكن أن يساعد (العديد من المعالجات تعمل بالمثل).

هناك العديد من الفوائد للالتزام بمحاذاة الذاكرة التي يمكنك قراءتها مقالة IBM هذه.

الاستخدام الأساسي للكمبيوتر هو تحويل البيانات.لقد تم تحسين بنيات وتقنيات الذاكرة الحديثة على مدى عقود من الزمن لتسهيل الحصول على المزيد من البيانات، داخل وخارج وبين وحدات تنفيذ أكثر وأسرع - بطريقة موثوقة للغاية.

علاوة:مخابئ

هناك محاذاة أخرى للأداء أشرت إليها سابقًا وهي المحاذاة على خطوط ذاكرة التخزين المؤقت التي تكون (على سبيل المثال، في بعض وحدات المعالجة المركزية) 64B.

لمزيد من المعلومات حول مقدار الأداء الذي يمكن الحصول عليه من خلال الاستفادة من ذاكرات التخزين المؤقت، قم بإلقاء نظرة على معرض تأثيرات ذاكرة التخزين المؤقت للمعالج;من هذا سؤال حول أحجام خط ذاكرة التخزين المؤقت

يمكن أن يكون فهم خطوط ذاكرة التخزين المؤقت أمرًا مهمًا لأنواع معينة من تحسينات البرنامج.على سبيل المثال، قد تحدد محاذاة البيانات ما إذا كانت العملية تلامس سطرًا واحدًا أو سطرين من ذاكرة التخزين المؤقت.كما رأينا في المثال أعلاه، يمكن أن يعني هذا بسهولة أنه في الحالة غير المحاذية، ستكون العملية أبطأ مرتين.

ويمكنك مع بعض المعالجات ( في نيهالم يمكن القيام به وتتماشى هذه )، ولكن قبل كل الوصول إلى الذاكرة على إصدار 64-بت (أو 32 بت) خط، لأن الحافلة 64 بت واسعة، كان لديك لجلب 64 بت في وقت واحد، وأنه سيكون من الأسهل بكثير لجلب هذه في "قطع" الانحياز من 64 بت.

وهكذا، إذا أردت الحصول على بايت واحد، لجلب لقطعة 64 بت ومن ثم ملثمين قبالة بت كنت لا تريد. سهلة وسريعة إذا كان البايت الخاصة بك في الطرف الأيمن، ولكن إذا كان في منتصف ذلك قطعة 64 بت، وكنت قد لقناع قبالة بت غير المرغوب فيها ومن ثم تحويل البيانات عبر إلى المكان الصحيح. والأسوأ من ذلك، إذا أردت متغير 2 بايت، ولكن ذلك تم تقسيم عبر 2 قطع، فإن ذلك يتطلب يصل إلى ضعف الذاكرة المطلوبة.

وهكذا، كما يعتقد الجميع الذاكرة هي رخيصة، جعلوا مجرد مترجم محاذاة البيانات على قطعة المعالج أحجام بحيث يتم تشغيل التعليمات البرمجية بشكل أسرع وأكثر كفاءة في التكلفة من الذاكرة الضائع.

والأساس، والسبب هو لأن الحافلة الذاكرة لديه بعض مدة محددة وهذا هو بكثير، أصغر بكثير من حجم الذاكرة.

وهكذا، وحدة المعالجة المركزية يقرأ من ذاكرة التخزين المؤقت L1 على الرقاقة، والتي غالبا ما 32KB هذه الأيام. ولكن الحافلة الذاكرة التي تربط ذاكرة التخزين المؤقت L1 إلى وحدة المعالجة المركزية وسوف يكون العرض أقل بكثير من حجم خط التخزين المؤقت. وسوف يكون هذا بناء على أمر من 128 <م> بت .

وهكذا:

262,144 bits - size of memory
    128 bits - size of bus
سوف

والمداخل المنحرفة تتداخل أحيانا خطين ذاكرة التخزين المؤقت، وهذا سيتطلب مخبأ جديد تماما قراءة من أجل الحصول على البيانات. قد يغيب حتى عن وسيلة للخروج إلى DRAM.

وعلاوة على ذلك، جزء من وحدة المعالجة المركزية سوف تضطر إلى الوقوف رأسا على عقب لتشكيل كائن واحد من هذين خطوط مخبأ مختلفة ولكل منهما قطعة من البيانات. على سطر واحد، وسوف تكون في بت أمر عالية جدا، في الآخر، وبت ترتيب منخفضة للغاية.

وسوف يكون هناك أجهزة مخصصة مندمجة تماما في خط الأنابيب الذي يعالج الأجسام المتحركة الانحياز على البتات اللازمة للناقل بيانات وحدة المعالجة المركزية، ولكن هذا الجهاز قد يكون مطلوبا لكائنات المنحرفة، لأنه ربما من المنطقي أن استخدام هذه الترانزستورات لتجاوزه السرعة المقررة بشكل صحيح برامج الأمثل.

في أي حال، قراءة الذاكرة الثانية ما هو ضروري في بعض الأحيان من شأنه أن يبطئ خط أنابيب مهما كان الكثير من الأجهزة لأغراض خاصة (نظريا وبحماقة) مخصصة لترميم ما يصل عمليات الذاكرة المنحرفة.

لقد أعطيتjoshperry إجابة ممتازة على هذا السؤال. بالإضافة إلى جوابه، ولدي بعض الأرقام التي تظهر بوضوح الآثار التي وصفت، وخاصة التضخيم 2X. وهنا رابط ل جدول بيانات Google تبين ما تأثير كلمة التحالفات مختلفة تبدو. وبالإضافة إلى ذلك وهنا رابط ل جيثب جوهر باستخدام رمز للاختبار. ويتم تكييف رمز اختبار من في المقالة كتبه جوناثان Rentzsch التيjoshperry المشار إليه. تم تشغيل اختبارات على ماك بوك برو مع رباعية النوى 2.8 غيغاهرتز انتل Core i7 من 64 بت المعالج و 16GB من ذاكرة الوصول العشوائي.

إذا نظام مع ذاكرة بايت عنونة لديه حافلة ذاكرة واسعة 32 بت، وهذا يعني أن هناك نحو فعال أربعة أنظمة الذاكرة على نطاق بايت التي يتم السلكية جميع لقراءة أو كتابة العنوان نفسه. وعلى محاذاة 32 بت قراءة تتطلب المعلومات المخزنة في نفس العنوان في كل أنظمة الذاكرة الأربعة، بحيث يمكن للجميع أنظمة تزويد البيانات في وقت واحد. ومن شأن الصغيرة المحايدة 32 بت قراءة تتطلب بعض أنظمة الذاكرة لإرجاع البيانات من عنوان واحد، وبعض لإرجاع البيانات من عنوان أعلى المقبل. على الرغم من أن هناك بعض أنظمة الذاكرة التي هي الأمثل لتكون قادرة على تلبية هذه الطلبات (بالإضافة إلى العناوين الخاصة بهم، لديهم فعليا "زائد واحد" إشارة والذي يسبب لهم استخدام عنوان واحد أعلى من المحدد) وتضيف مثل هذه الميزة تكلفة كبيرة وتعقد لنظام الذاكرة. معظم أنظمة الذاكرة سلعة ببساطة لا يمكن إرجاع أجزاء مختلفة الكلمات 32 بت في نفس الوقت.

إذا كان لديك حافلة البيانات 32BIT و، وخطوط عنوان عنوان حافلة متصلا الذاكرة سوف تبدأ من A <الفرعية> 2 ، 32bit العناوين الانحياز وذلك فقط يمكن الوصول إليها في حلقة حافلة واحدة.

وحتى إذا كان كلمة تمتد محاذاة الحدود عنوان - أي A <الفرعية> 0 ل16/32 بت البيانات أو A <الفرعية> 1 للبيانات 32 بت ليست الصفر، دورتين حافلة هناك حاجة للحصول على البيانات.

وبعض أبنية / مجموعات التعليمات لا تدعم الوصول محاذاتها وسوف تولد استثناء على هذه المحاولات، لذلك رمز مترجم ولدت الوصول محاذاتها يتطلب ليس فقط دورات حافلة إضافية، ولكن تعليمات إضافية، مما يجعلها أقل كفاءة.

في باور يمكنك تحميل عدد صحيح من عنوان غريب مع أية مشاكل.

وسبارك وI86 و (على ما أظن) Itatnium رفع استثناءات الأجهزة عند محاولة ذلك.

واحدة حمولة 32 بت مقابل أربعة 8 الأحمال قليلا سوف يكون لا لجعل الكثير من الفرق على معظم المعالجات الحديثة. إذا كانت البيانات بالفعل في ذاكرة التخزين المؤقت أو لن يكون لها تأثير أكبر بكثير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top