سؤال

لدي رمز MIPS التالي وأتطلع إلى إعادة كتابة/إعادة ترتيب الرمز حتى أتمكن من تقليل عدد نوب الإرشادات اللازمة للتنفيذ المناسبة للأنابيب مع الحفاظ على الصواب. من المفترض أن Datapath لا تتنزه ولا إلى الأمام. تعطي المشكلة تلميحتين: إنها تذكرنا بأن الفروع والقفزات تتأخر وتحتاج إلى فتح فتحات التأخير الخاصة بهم وتلميحها إلى ترشيح قيمة الإزاحة في تعليمات الوصول إلى الذاكرة (LW ، SW) عند الضرورة.

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

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

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

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

المحلول

طريقة واحدة لملء فتحة تأخير الفرع ستكون:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

نصائح أخرى

من حيث التلميح الثاني:

اجعل التعليمات الرابعة الثانية. يمكن أن يتم إدخال أنابيب في (بعد معرف التعليمات الأولى ، إذا كنت تستخدم مصطلحات P/H) بينما لا يزال يتم تنفيذها الأول. ثم اجعل الإزاحة في التعليمات الثالثة (القديمة) 496 بدلاً من 500. أفترض أنك ترى الآن لماذا؟

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

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