فتحة التأخير

في هندسة الحاسوب ، تُعرف خانة التأخير بأنها خانة تعليمات تُنفذ دون أن تتأثر بتأثيرات التعليمات السابقة. [ 1 ] الشكل الأكثر شيوعًا هو تعليمة واحدة عشوائية تقع مباشرةً بعد تعليمة تفرع في بنية RISC أو DSP ؛ تُنفذ هذه التعليمة حتى لو تم تنفيذ التفرع السابق. هذا يجعل التعليمة تُنفذ خارج ترتيب موقعها في كود لغة التجميع الأصلي .

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

خطوط الأنابيب

تُنفّذ وحدة المعالجة المركزية عادةً التعليمات من لغة الآلة باستخدام عملية من أربع خطوات؛ حيث تُقرأ التعليمات أولاً من الذاكرة، ثم تُفكّ شفرتها لفهم المطلوب تنفيذها، ثم تُنفّذ تلك الإجراءات، وأخيراً تُكتب النتائج مرة أخرى إلى الذاكرة. في التصاميم المبكرة، كانت كل مرحلة من هذه المراحل تُنفّذ على التوالي، بحيث تستغرق التعليمات مُضاعفات لدورة ساعة الجهاز لإكمالها. على سبيل المثال، في معالج Zilog Z80 ، كان الحد الأدنى لعدد دورات الساعة اللازمة لإكمال التعليمات أربع دورات، ولكن قد يصل إلى 23 دورة ساعة لبعض التعليمات (النادرة). [ 2 ]

في أي مرحلة من مراحل معالجة التعليمات، لا يشارك سوى جزء واحد من الشريحة. على سبيل المثال، خلال مرحلة التنفيذ، عادةً ما تكون وحدة الحساب والمنطق (ALU) هي الوحيدة النشطة، بينما تكون الوحدات الأخرى، مثل تلك التي تتفاعل مع الذاكرة الرئيسية أو تفك تشفير التعليمات، في وضع الخمول. إحدى طرق تحسين الأداء العام للحاسوب هي استخدام خط أنابيب التعليمات . يضيف هذا الخط دوائر إضافية للاحتفاظ بالحالات الوسيطة للتعليمات أثناء مرورها عبر الوحدات. مع أن هذا لا يُحسّن توقيت دورة أي تعليمة منفردة، إلا أن الفكرة تكمن في السماح لتعليمة ثانية باستخدام وحدات المعالجة المركزية الفرعية الأخرى بعد انتهاء تنفيذ التعليمة السابقة. [ 3 ]

على سبيل المثال، أثناء استخدام وحدة الحساب والمنطق (ALU) لتعليمات معينة، يمكن أن تكون التعليمات التالية من البرنامج في وحدة فك التشفير، ويمكن جلب تعليمات ثالثة من الذاكرة. في هذا الترتيب الشبيه بخط التجميع ، يمكن تحسين إجمالي عدد التعليمات المُعالجة في أي وقت بما يصل إلى عدد مراحل خط الأنابيب. في معالج Z80، على سبيل المثال، يمكن لخط أنابيب من أربع مراحل تحسين الإنتاجية الإجمالية بمقدار أربعة أضعاف. ومع ذلك، نظرًا لتعقيد توقيت التعليمات، لن يكون هذا سهل التنفيذ. سمحت بنية مجموعة التعليمات (ISA) الأبسط بكثير في معالج MOS 6502 بتضمين خط أنابيب من مرحلتين، مما منحه أداءً يقارب ضعف أداء معالج Z80 عند أي سرعة ساعة معينة. [ 4 ]

مشاكل التفرع

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

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

أعلى: lw t0 , 0 ( a0 ) ; تحميل القيمة من عنوان الذاكرة في المسجل a0 إلى المسجل t0 lw t1 , 4 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 4] إلى المسجل t1 add t2 , t0 , t1 ; إضافة المسجلين t0 و t1 إلى المسجل t2 sw t2 , 0 ( a1 ) ; تخزين القيمة في المسجل t2 في عنوان الذاكرة في المسجل a1 lw t4 , 8 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 8] إلى المسجل t4

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

والآن، لننظر إلى ما يحدث عند إضافة فرع:

top: lw t0 , 0 ( a0 ) ; تحميل القيمة من عنوان الذاكرة في المسجل a0 إلى المسجل t0 lw t1 , 4 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 4] إلى المسجل t1 add t2 , t0 , t1 ; إضافة المسجلين t0 و t1 إلى المسجل t2 li t3 , 1000 ; تعيين قيمة المسجل t3 إلى 1000 bgt t2 , t3 , top ; إذا كانت t2 > t3، فارجع إلى "top:" ؛ وإلا: sw t2 , 0 ( a1 ) ; تخزين القيمة في المسجل t2 في عنوان الذاكرة في المسجل a1 lw t4 , 8 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 8] إلى المسجل t4

في هذا المثال، ستؤدي نتيجة المقارنة في السطر الرابع إلى تغيير "التعليمات التالية"؛ ففي بعض الأحيان ستكون التعليمات التالية sw(تخزين الكلمة) في الذاكرة، وفي أحيان أخرى ستكون التعليمات lwمن الذاكرة في الأعلى. عادةً ما تكون وحدة المعالجة المركزية قد قرأت التعليمات التالية، وهي التعليمات السابقة sw، بحلول الوقت الذي تحسب فيه وحدة الحساب والمنطق المسار الذي ستسلكه. يُعرف هذا باسم " خطر التفرع" . إذا اضطرت وحدة المعالجة المركزية إلى العودة إلى الأعلى، swفيجب تجاهل التعليمات lwوقراءة التعليمات من الذاكرة بدلاً من ذلك. يستغرق هذا دورة تعليمات كاملة واحدة على الأقل، ويؤدي إلى أن تكون وحدة المعالجة المركزية فارغة لمدة دورة تعليمات واحدة على الأقل. يُعرف هذا باسم "توقف وحدة المعالجة المركزية" أو "الفقاعة"، واعتمادًا على عدد التفرعات في الكود، يمكن أن يكون له تأثير ملحوظ على الأداء العام.

فتحات تأخير الفروع

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

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

في الأمثلة السابقة، lwتُعدّ تعليمة التحميل (load) في النهاية مستقلة تمامًا، فهي لا تعتمد على أي معلومات أخرى ويمكن تنفيذها في أي وقت. وهذا ما يجعلها مناسبة لوضعها في خانة تأخير التفرع. عادةً ما يتولى برنامج التجميع أو المترجم هذه المهمة تلقائيًا ، حيث يقوم بإعادة ترتيب التعليمات.

top: lw t0 , 0 ( a0 ) ; تحميل القيمة من عنوان الذاكرة في المسجل a0 إلى المسجل t0 lw t1 , 4 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 4] إلى المسجل t1 add t2 , t0 , t1 ; إضافة المسجلين t0 و t1 إلى المسجل t2 li t3 , 1000 ; تعيين قيمة المسجل t3 إلى 1000 bgt t2 , t3 , top ; إذا كانت t2 > t3، فارجع إلى "top:" ; تأخير الخانة (سيتم تنفيذه دون شروط) lw t4 , 8 ( a0 ) ; تحميل القيمة من عنوان الذاكرة [قيمة المسجل a0 زائد 8] إلى المسجل t4 ؛ وإلا: sw t2 , 0 ( a1 ) ; تخزين القيمة في المسجل t2 في عنوان الذاكرة في المسجل a1

عند تنفيذ التفرع، ينتقل البرنامج إلى تنفيذ التعليمات التالية. وبحلول الوقت الذي تُقرأ فيه هذه التعليمات في المعالج ويبدأ فك تشفيرها، تكون نتيجة المقارنة جاهزة، ويستطيع المعالج حينها تحديد أي تعليمات يقرأها تاليًا، سواءً كانت lwفي الأعلى أو swفي الأسفل. هذا يمنع أي هدر للوقت ويحافظ على امتلاء خط الأنابيب باستمرار.

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

من الآثار الجانبية الأخرى الحاجة إلى معالجة خاصة عند إدارة نقاط التوقف في التعليمات، وكذلك عند تنفيذ التعليمات خطوة بخطوة أثناء تصحيح الأخطاء داخل خانة تأخير التفرع. لا يمكن حدوث مقاطعة أثناء خانة تأخير التفرع، ويتم تأجيلها إلى ما بعد انتهاء هذه الخانة. [ 5 ] [ 6 ] يُحظر أو يُعتبر وضع تعليمات التفرع في خانة تأخير التفرع أمرًا غير مستحسن. [ 7 ] [ 8 ] [ 9 ]

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

التطبيقات

توجد خانات تأخير التفرع بشكل رئيسي في معمارية معالجات الإشارات الرقمية (DSP) ومعمارية RISC القديمة . تُعدّ معمارية MIPS و PA-RISC (حيث يمكن تحديد التفرع المؤجل أو غير المؤجل) [ 10 ] ، ومعمارية ETRAX CRIS و SuperH (حيث تحتوي تعليمات التفرع غير المشروطة على خانة تأخير واحدة) [ 11 ] ، ومعمارية Am29000 [ 12 ] ، ومعمارية Intel i860 (حيث تحتوي تعليمات التفرع غير المشروطة على خانة تأخير واحدة) [ 13 ] ، ومعمارية MC88000 (حيث يمكن تحديد التفرع المؤجل أو غير المؤجل) [ 14 ] ، ومعمارية SPARC من معمارية RISC التي تحتوي كل منها على خانة تأخير تفرع واحدة؛ بينما لا تحتوي معمارية PowerPC و ARM و Alpha و V850 و RISC-V على أي خانات تأخير. تشمل معمارية معالجات الإشارات الرقمية التي تحتوي كل منها على خانة تأخير تفرع واحدة معمارية μPD77230 [ 15 ] ومعمارية VS DSP . تستخدم معمارية SHARC DSP ومعمارية MIPS-X خانة تأخير تفرع مزدوجة. [ 16 ] يقوم هذا المعالج بتنفيذ زوج من التعليمات بعد تعليمة التفرع قبل أن يصبح التفرع ساري المفعول. يستخدم كل من TMS320C3x [ 17 ] و TMS320C4x [ 8 ] خانة تأخير ثلاثية للتفرع. يحتوي TMS320C4x على تفرعات غير مؤجلة وتفرعات مؤجلة. [ 8 ]

يوضح المثال التالي تفرعات مؤجلة في لغة التجميع لمعالج الإشارات الرقمية SHARC، بما في ذلك زوج من التفرعات بعد تعليمة RTS. يتم مسح السجلات من R0 إلى R9 إلى الصفر بالترتيب (السجل الذي يتم مسحه بعد R6 هو R7، وليس R9). لا تُنفذ أي تعليمة أكثر من مرة.

R0 = 0 ; CALL fn ( DB ); /* استدعاء دالة، أدناه عند التسمية "fn" */ R1 = 0 ; /* خانة التأخير الأولى */ R2 = 0 ; /* خانة التأخير الثانية */ /***** انقطاع هنا (يتم تنفيذ الاستدعاء) *****/R6 = 0 ; /* يعود أمر الاستدعاء/RTS هنا، وليس عند "R1 = 0" */ نهاية القفزة ( DB ); R7 = 0 ; /* خانة التأخير الأولى */ R8 = 0 ; /* خانة التأخير الثانية */ /***** انقطاع هنا (يبدأ مفعول القفزة) *****//* يتم استدعاء التعليمات الأربع التالية من الأعلى، كدالة "fn" */ fn ​​: R3 = 0 ; RTS ( DB ); /* العودة إلى الدالة المستدعِية، بعد تجاوز خانات التأخير الخاصة بها */ R4 = 0 ; /* خانة التأخير الأولى */ R5 = 0 ; /* خانة التأخير الثانية */ /***** انقطاع هنا (يبدأ مفعول RTS) *****/النهاية : R9 = 0 ؛

فتحة تأخير التحميل

خانة تأخير التحميل هي تعليمة تُنفذ فورًا بعد تحميل سجل من الذاكرة، دون أن ترى نتيجة التحميل أو تنتظرها. تُعدّ خانات تأخير التحميل نادرة جدًا نظرًا لعدم إمكانية التنبؤ بتأخيرات التحميل في الأجهزة الحديثة. فقد يتم التحميل من ذاكرة الوصول العشوائي (RAM) أو من ذاكرة التخزين المؤقت (الكاش)، وقد يتباطأ بسبب تنازع الموارد. وقد لوحظت تأخيرات التحميل بشكل عام في تصميمات معالجات RISC المبكرة جدًا. يحتوي معالج MIPS I ISA (المُطبق في معالجات R2000 و R3000 ) على مثل هذه الخانة.

المثال التالي هو كود تجميع MIPS I، يوضح كلاً من خانة تأخير التحميل وخانة تأخير التفرع.

lw v0 , 4 ( v1 ) # تحميل كلمة من العنوان v1+4 إلى v0 nop # خانة تأخير تحميل مهدرة jr v0 # الانتقال إلى العنوان المحدد بواسطة v0 nop # خانة تأخير تفرع مهدرة

انظر أيضاً

مراجع

  1. أ. باترسون، ديفيد؛ ل. هينيسي، جون (1990). هندسة الحاسوب: منهج كمي . دار مورغان كوفمان للنشر. ص  275. ISBN 1-55860-069-8.
  2. "صفحة تجميع MSX" .
  3. "محاضرة CMSC 411 رقم 19، توجيه البيانات بتقنية التجزئة" . قسم علوم الحاسوب والهندسة الكهربائية، جامعة ميريلاند، مقاطعة بالتيمور . تاريخ الاسترجاع: 22 يناير 2020 .
  4. كوكس، روس (3 يناير 2011). "جهاز MOS 6502 وأفضل مصمم تخطيط في العالم" .
  5. "معالج الإشارات المتقدم μPD77230" (ملف PDF) . الصفحات 38 (3-39)، 70 (3-41) . تاريخ الاطلاع: 17 نوفمبر 2023 . 
  6. "دليل مستخدم TMS320C4x" (ملف PDF) . صفحة 75 (3-15) . تم الاطلاع عليه بتاريخ 2023-12-02 . 
  7. "معالج الإشارات المتقدم μPD77230" (ملف PDF) . صفحة 191 (4-76) . تاريخ الاسترجاع: 28-10-2023 . 
  8. 1 2 3 "دليل مستخدم TMS320C4x" (ملف PDF) . صفحة 171 (7-9) . تاريخ الاسترجاع: 29-10-2023 . 
  9. "دليل مستخدم المعالج الدقيق MC88100 RISC" (ملف PDF) . صفحة 88 (3-33) . تاريخ الاسترجاع: 30 ديسمبر 2023 . 
  10. ديروزا، جون أ.؛ ليفي، هنري م. "تقييم بنى الفروع" . ص 1. تم الاسترجاع في 27-01-2024 . 
  11. "دليل الأجهزة SH7020 وSH7021 لمحرك SuperH™ RISC" . ص 42، 70. تم الاطلاع عليه بتاريخ 17-12-2023 . 
  12. "تقييم وبرمجة عائلة معالجات RISC 29K، الطبعة الثالثة - مسودة" (ملف PDF) . صفحة 54. تاريخ الاطلاع: 20 ديسمبر 2023 . 
  13. "دليل مرجعي لمبرمج المعالج الدقيق i860™ 64 بت" (ملف PDF) . صفحة 70 (5-11) . تاريخ الاسترجاع: 21-12-2023 . 
  14. "دليل مستخدم المعالج الدقيق MC88100 RISC" (ملف PDF) . صفحة 81 (3-26) . تاريخ الاسترجاع: 21-12-2023 . 
  15. "معالج الإشارات المتقدم μPD77230" (ملف PDF) . صفحة 191 (4-76) . تاريخ الاسترجاع: 2023-11-05 . 
  16. "مجموعة تعليمات MIPS-X ودليل المبرمج" (ملف PDF) . صفحة 18. تم الاطلاع عليه بتاريخ 2023-12-03 . 
  17. "معالج الإشارات الرقمية ذو الفاصلة العائمة TMS320C30" (ملف PDF) . ti.com. ص 14. تاريخ الاسترجاع: 2023-11-04 . 
  • ديروزا، جيه إيه؛ ليفي، إتش إم (1987). "تقييم بنى الفروع §2 الفروع المؤجلة" . وقائع الندوة الدولية السنوية الرابعة عشرة حول هندسة الحاسوب (ISCA '87) . رابطة آلات الحوسبة. ص 10-16 . doi : 10.1145/30350.30352 . ISBN  978-0-8186-0776-9. S2CID 1870852 . 
  • برابهو، غوربور م. "مخططات التنبؤ بالفروع" . دروس في هندسة الحاسوب . جامعة ولاية آيوا. مؤرشف من الأصل بتاريخ 7 أغسطس 2020.