سؤال

لدي سؤال أساسي حول التجميع.

لماذا نكلف نفسه عناء القيام بعمليات حسابية فقط على السجلات إذا كان بإمكانهم العمل على الذاكرة أيضًا؟

على سبيل المثال كل من السبب التالي (بشكل أساسي) نفس القيمة المراد حسابها كإجابة:

مقتطف 1

.data
    var dd 00000400h

.code

    Start:
        add var,0000000Bh
        mov eax,var
        ;breakpoint: var = 00000B04
    End Start


مقتطف 2

.code

    Start:
        mov eax,00000400h
        add eax,0000000bh
        ;breakpoint: eax = 0000040B
    End Start



من ما أستطيع أن أرى معظم النصوص والبرامج التعليمية تقوم بعمليات حسابية في الغالب على السجلات. هل هو أسرع للعمل مع السجلات؟

تحرير: كان ذلك سريعًا :)

أعطيت بعض الإجابات الرائعة ؛ تم اختيار أفضل إجابة بناءً على أول إجابة جيدة.

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

المحلول

السجلات أسرع بكثير وأيضًا أن العمليات التي يمكنك القيام بها مباشرة على الذاكرة محدودة.

نصائح أخرى

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

 CPU registers (slightly complicated, but in the order of 1KB per a core - there
                are different types of registers. You might have 16 64 bit
                general purpose registers plus a bunch of registers for special
                purposes)
 L1 cache (64KB per core)
 L2 cache (256KB per core)
 L3 cache (8MB)
 Main memory (8GB)
 HDD (1TB)
 The internet (big)

بمرور الوقت ، تمت إضافة المزيد والمزيد من مستويات ذاكرة التخزين المؤقت - يمكنني أن أتذكر وقتًا لم يكن فيه وحدات المعالجة المركزية أي مخبأ على متن الطائرة ، ولست قديمًا! في هذه الأيام ، تأتي محركات الأقراص الصلبة مع ذاكرة التخزين المؤقت على متن الطائرة ، ويتم تخزين الإنترنت عبر الإنترنت في أي عدد من الأماكن: في الذاكرة ، على محرك الأقراص الصلبة ، وربما على تخزين الخوادم الوكيل.

هناك انخفاض دراماتيكي (أوامر في كثير من الأحيان) في عرض النطاق وزيادة وقت الإستجابة في كل خطوة بعيدا عن وحدة المعالجة المركزية. على سبيل المثال ، قد تكون محرك الأقراص الصلبة قادرة على قراءتها بسرعة 100 ميجابايت/ثانية مع زمن الوصول من 5 مللي ثانية (قد لا تكون هذه الأرقام صحيحة تمامًا) ، في حين أن ذاكرتك الرئيسية يمكن أن تقرأ عند 6.4 جيجابايت/ثانية مع زمن استمرار 9ns (ستة أوامر من ضخامة!). يعد الكمون عاملاً مهمًا للغاية ، حيث لا ترغب في الحفاظ على وحدة المعالجة المركزية في انتظار وقت أطول مما يجب (هذا ينطبق بشكل خاص على البنى التي تحتوي على أنابيب عميقة ، ولكن هذه مناقشة ليوم آخر).

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

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

يتم الوصول إلى السجلات طريق أسرع من ذاكرة ذاكرة الوصول العشوائي ، حيث أنك لست مضطرًا للوصول إلى ناقل الذاكرة "البطيء"!

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

نظرًا لأن X86 تم تصميمه لاستخدام السجلات ، لا يمكنك تجنبها تمامًا ، حتى لو كنت ترغب في ذلك ولم تهتم بالأداء.

يمكن لوحدة المعالجة المركزية X86 الحالية قراءة/كتابة العديد من السجلات لكل دورة على مدار الساعة من مواقع الذاكرة.

على سبيل المثال ، يمكن لـ Intel Skylake القيام بحملتين ومتجر واحد من/إلى ذاكرة التخزين المؤقت L1D الترابطية 32kib 82-Way لكل دورة (أفضل حالة) ، ولكن يمكنها اقرأ ما يزيد عن 10 سجلات لكل ساعة ، واكتب 3 أو 4 (بالإضافة إلى eflags).

بناء ذاكرة التخزين المؤقت L1D مع العديد من منافذ القراءة/الكتابة مثل ملف التسجيل سيكون باهظ التكلفة (في عدد الترانزستور/استخدام المنطقة واستخدام الطاقة) ، خاصة إذا كنت ترغب في الاحتفاظ بها بحجم كبير. من المحتمل ألا يكون من الممكن جسديًا إنشاء شيء يمكن أن يستخدم الذاكرة بالطريقة التي يستخدم بها X86 سجلات ذات نفس الأداء.

وأيضًا ، فإن كتابة سجل ثم قراءته مرة أخرى له زمن انتقال بشكل أساسي لأن وحدة المعالجة المركزية تكتشف هذا وتوجيه النتيجة مباشرة من إخراج وحدة تنفيذ واحدة إلى مدخلات أخرى ، متجاوزًا مرحلة الكتابة. (يرى https://en.wikipedia.org/wiki/classic_risc_pipeline#solution_a._bypassing).

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

كما ذكر آخرون ، 3 أو 4 بتات لمعالجة السجل ، اجعل تنسيق رمز الماكينة أكثر إحكاما مما لو كان لكل تعليمات عناوين مطلقة.


أنظر أيضا https://en.wikipedia.org/wiki/Memory_Hierarchy: يمكنك التفكير في السجلات على أنها سريعة صغيرة الحجم الثابت مساحة الذاكرة منفصلة عن الذاكرة الرئيسية ، حيث يتم دعم العنوان المطلق المباشر فقط. (لا يمكنك "فهرسة" السجل: إعطاء عدد صحيح N في سجل واحد ، لا يمكنك الحصول على محتويات Nالتسجيل مع واحد inn.)

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

يعد وجود عدد ثابت من السجلات جزءًا مما يتيح لـ CPU القيام به تسجيل التجديد للتنفيذ خارج الترتيب. إن وجود رقم التسجيل متاح على الفور عند فك تشفير التعليمات أيضًا يجعل هذا الأمر أسهل: لا يوجد أبدًا قراءة أو الكتابة إلى سجل غير معروف.

يرى لماذا تأخذ Mulss 3 دورات فقط على Haswell ، تختلف عن جداول تعليم Agner؟ للحصول على شرح لإعادة تسمية التسجيل ، ومثال محدد (التعديلات اللاحقة على السؤال / الأجزاء اللاحقة من إجابتي ، تُظهر التسريع من عدم التغلب على العديد من المراكز لإخفاء الكمون FMA على الرغم من أنه يعيد استخدام السجل المعماري نفسه بشكل متكرر).


يمنحك المخزن المؤقت للمخزن مع إعادة توجيه المتجر "إعادة تسمية الذاكرة". متجر/إعادة تحميل إلى موقع الذاكرة مستقل عن المتاجر السابقة ويتم تحميله على هذا الموقع من داخل هذا النواة.

إن استدعاءات الوظائف المتكررة مع اتفاقية استدعاء مكدس ARGS ، و/أو إرجاع قيمة بالرجوع إليها ، هي الحالات التي يمكن فيها إعادة استخدام بايتات ذاكرة المكدس نفسها عدة مرات.

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

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

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

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

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

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

إن مجموعة التعليمات لن تسمح لك بالقيام بمثل هذه العمليات المعقدة:

add [0x40001234],[0x40002234]

عليك أن تذهب من خلال السجلات.

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