Professional Documents
Culture Documents
Chapter 4.5+
Chapter 4.5+
السالم عليكم ..النهاردة هنتكلم عن اكتشاف كبير جدا يعتبر اعظم اكتشاف بعد التليفزيون
والبالى ستيشن ... :Dاال وهو ال pipelining
طب يعنى ايه ال pipelineاو يعنى ايه انى اقول ان ال cpuده يعتبر piplelined؟؟
طبعا احنا عارفين ان كل instructionبتاخدلها 5 phasesوان كل clock tickبنفذ 1
phaseبس ل instructionواحدة
فالناس الفاضيين دول بتوع ال architectureقالو طب مابدل ان مثال ان فى اول phase
بااخد االنستركشن بعد كده الجزء المسئول انى اخد االنستركشن يبقى جزء ملوش اى شغالنة ..
اخلى الجزء ده يبقى ليه الزمة او يبقى active
فى الصورة السابقة دى انا بخلى اكتر من جزء شغال فى نفس الوقت وده نفس اللى هنعمله ..
طبعا هنا انا بفترض ان البرنامج بتاعى عبارة عن 3 instructionوالتالتة بيمرو على ال
5 phasesفلو اخدنا بالنا ان فى تالت clock tickاالنستركشن االولى بتعمل execute
واالنستركشن التانية فى مرحلة ال Decodeواالنستركشن التالتة لسة واصلة وفى مرحلة ال
Instruction Fetch
طبعا كده ال throughputبقى عالى جداااا جداااااا الن لو كده لو احنا كده حبينا نعرف كام
انستركشن بيخلصهم خاااالص ال cpuكل مثال 30 clock tickبافتراض ان كل
االنستركشن بتعدى على ال ( 5 phasesطبعا ده افتراض مستحيل ):Dهنالقى اننا لو
مستخدمناش ال pipelinedال cpuهيخلص فقط 6 instructionلكن باستخدام ال
pipelinedهنالقى ان ال cpuبيخلص 26 instructionيعنى تقريبا كل tickبينفذ
فيها instructionكاملة وطبعا ده يعتبر انجاز كبير جدا
طب لو حبينا نجيب بقى الوقت مابين كل instructionب formulaمعينة هنعمل ايه :
لو جينا فكرنا زى مالدكتور علمنا اننا نفهم ونحاول نترجم كالمنا لكتابة والكتابة دى هتكون
غالبا القانون ...فهنقول اننا فى ال ( ideal conditionيعنى هنا بفترض ان مفيش
انستركشن معتمدة على انستركشن تانية سابقة وان كل ال instructionبتمر تقريبا بنفس عدد
ال phasesوالوقت بتاع كل phaseتقريبا واحد ) هيكون الوقت مابين كل انستركشن
والتانية فى حالة ال non pipelinedهو تقريبا الوقت اللى بتمر بيه ال phasesالواحدة ..
لكن لو جينا نبص فى حالة ال pipelinedهنالقى اننا تقريبا بنطلع فى كل clock tick
انستركشن كاملة يعنى كده ممكن نترجم كالمنا لقانون بقى او formulaهتبقى بالشكل ده :
ليه بقى ....لو تخيلنا ان ال IFلالنستركشن التانية بدأت فى وقتها كنا هنالقى فى مرحلة ال
EXانا محتاج ال $s0فهكون عاوز اجيب اللى خارج من ال MEMيبقى انبوت لمرحلة
ال EXوكده احنا كسرنا الشرط بتاع ال forwardingعشان كده الزم الزم اعمل stall
الحالة دى من ال data hazardبيسموها ال load-use data hazard
ال Data hazardليه اكتر من حل وفيه حل hardwareفكرته ان بعد كل مرحلة احط
حاجة اسمها latchدى تعتبر state elementبس الوقت اللى بتخزن فيها الداتا صغير ولما
احتاج الداتا ولسة مجهزتش هشوف ال latchده وهاخد الداتا منه
فى حل تانى softwareده بيبقى حاجة اسمها recordingيعنى ترتيب االنستركشن نفسها
ممكن ارتبها بطريقة بحيث ان ميحصلش اى hazardمن االساس يعنى مثال لو انا عندى
مجموعة االنستركشن دى (دى كده )without recording
1. )lw $t0 , 0($t1
2. )lw $t2 , 4($t1
3. )sw $t2 , 0($t1
4. )sw $t0 , 4($t1
لو جينا نشوف كده السيناريو المتوقع للمجموعة دى بالترتيب ده لالنستركشن دى
1 IF ID EX MEM WB
2 IF ID EX MEM WB
3 IF ID Stall EX MEM WB
4 IF Stall ID EX MEM WB
لو جينا بقى نفس االنستركشن دى بس غيرنا الترتيب بتاعها يعنى خليناها كده (دى كده with
)recording
تالت نوع حاجة اسمها ال ( Control hazardاللى حضر المحاضرة دى كان اكيد خارج منها
مهيس بعد المثال اللى قاله الدكتور عن لاير مدريد واالهلى ) :Dالمشكلة دى نتجت عن ال
branch operationيعنى لو انا عندى انستركشن عبارة عن beqالزم مدخلش
االنستركشن اللى بعدها اال بعد ماشوف هل الكونديشن اللى فى االنستركشن دى taken or
not taken
نفس الناس الفتايين بتوع ال architectureقالو احنا ممكن ناخد حل االحتماالت يعنى انا
هتوقع مثال ان الكونديشن not takenوهاخد االنستركشن اللى بعديا علطول وفى نفس الوقت
هحسب برضه نتيجة الكونديشن وهيحصل حاجتين اما ان الكونديشن يطلع فعال not taken
وكده اشطة اوى مش هيكون فى اى stallاو اسوأ حاجة ان يطلع فعال الكونديشن taken
يعنى توقعى كان غلط فى الحالة دى هعمل flushيعنى همسح كل الشغل اللى عملته اثناء
حساب نتيجة الكونديشن وهبدأ اشتغل على اساس النتيجة الصحيحة للكونديشن
لو الحظنا ان اسوأ حالة دى تقابل برضه الحالة انى استنى لحد ماعرف نتيجة الكونديشن هل
takenوال not takenيعنى يعتبر مخسرتش اى حاجة بل بالعكس كده كمان يعتبر كسبت
ان لو طلع توقعى صح يبقى مش هيحصل اى stallعندى
لو البرنامج فيه ال instructionsدى
Add $4 , $5 , $6
Beq $1 , $2 , 40
)Lw $3 , 300($0
40: or $7 , $8 , $9
السيناريو بتاع البرنامج ده هيبقى حاجة من اتنين
اما انه هيبقى السيناريو ده ان هيبقى توقعى صحيح ومش هيحصل اى اى stallوده افضل
حالة اتمنى الوصول اليها
او هيبقى السيناريو ده وده اسوأ سيناريو او السيناريو اللى كان هيحصل لو اصال مطبقتش ال
branch predictionوالسيناريو ده زى ماحنا شايفين هيكون فيه stallعشان اعمل
jumpعلى ال new addressواعمل flushبحيث انى ابدأ من جديد خالص
طب دلوقتى واضح جدا ان فى حالة ال predictionاللى انا حطيته لو طلع صح مش هيكون
فى اى stallيبقى السؤال المنطقى جدااااا على اى اساس هعمل بريديكشن
الدكتور الصراحة شرح الحتة دى بطريقة حلوة جدااااا وقال مثال ان لو جيت قولت ان مصر
هتالعب البرازيل 100مرة فاى حد عاقل يقلك ان البرازيل تكسب مصر ال 100مرة وممكن
مرة او مرتين يتعادلو او تحصل المعجزة ومصر تكسب :Dده نفس اللى هنعمله بالظبطططط
انا لما بكون فى for loopالكونديشن بتاع الخروج ده هيبقى غالبا trueعشان ابدأ اخش
الفور لوب واكمل شغلى هيبقى مرة واحدة بس ب falseعشان اخرج من اللوب فلو استطعت
بطريقة ما انى اعرف ان الكونديشن ده بتاع لوب يبقى المنطفى جداااا انى اعمل predict
trueعلطول الن كده التوقع بتاعى هيبقى صح دايمااااااا مش هيبقى غلط غير مرة واحدة بس
برضه وانا بعمل loopفى االسيمبلى بيكون فى كونديشن كده عشان اخرج من اللوب
والكونديشن ده بيبقى غالبا ب falseعشان ابدأ اشتغل فى اللوب فلو عملت توقع انه not
takenهيبقى التوقع ده صح اال مرة واحدة بس هيبقى ده توقع غلط
النوع ده من ال predictionيندرج تحت مسمى ال static predictionفى نوع تانى من
ال predictionاسمه ال dynamic prediction
فى ال dynamic predictionبتفادى خطأ ال static predictionاللى بيتمثل انى دايما
بتوقع حاجة واحدة على امل انى اكون غالبا صح بس مش فى كل الحاالت بيبقى التوقع بتاعى
صح وممكن يطلع التوقع بتاعى غلط دايما ف فى ال dynamic predictionبتوقع على
اساس ال predictionاللى عملته قبل كده
فى نوعين من ال dynamic predictionاول نوع حاجة اسمها 1 bit pred.ودى بتبقى
one bitبيبقى الكونترول بتاعها سهل اوى والفكرة حاجة بسيطة اوى ..انا مثال فى االول
هبدأ اخلى ال one bitدى بزيرو يعنى مثال predict not takenلو طلع توقعى صح
خالص مغيرش حاجة فى ال bitدى واسيبها زى ماهى لو طلع توقعى غلط اقلب ال bit
دى من 0الى 1يعنى اكنى بتوقع انى اكون predict takenوامشى بنفس االسلوب لو طلع
توقعى المرة القادمة صح بخلى ال bitب 1لو طلع غلط بقلب ال bitدى من 1الى زيرو
الشكل ده يمثل ال Finite Stateل ( 1 bit predictorاسف على الرسمة الحقيرة دى ):DD
بس الحل ده فى مشكلتين ان فى بعض البروجرامر بتبقى اللوب بتاعتهم مش دايما بتبقى for
loopاو while loopبتبقى حاجة مختلطة يعنى ممكن يكون فى loopالكونديشن بتاعها
positive conditionوجواها لوب تانية الكونديشن بتاعها negative conditionكده
طبعا هيكون فى توقعات كتير شوية غلط تانى حاجة ان الزم فى كل لوب هعمل على االقل 2
stall cycleليه بقى ؟؟ انا لما هخش جوه لوب لو افترضت انها جت معايا كده وتوقعت اول
كونديشن فى اللوب خالص صح لما هاجى هخرج من اللوب هعمل توقع غلط عشان اخرج
فهقلب ال predictorبتاعى للحالة المضادة (يعنى لو كنت بتوقع takenهتوقع not
takenوالعكس صحيح ) ولما هبدأ لوب تانية هعمل كمان توقع غلط الن ال predictor
بتاعى انا قلبته عشان يناسب كونديشن الخروج من اللوب مش الدخول ..يعنى كان المفروض
مقلبش ال predictorبتاعى الن كونديشن الخروج ده بييجى مرة واحدة بس
عشان كده عملنا حاجة تانية اسمها 2 bit predictorودى ال finite stateبتاعتها بالشكل
ده
هنا ايه اللى بيحصل ..انا هبدأ من االول خالص وهقول ان ال predictمثال takenلو طلع
توقعى صح خالص يبقى كويس هكمل على takenلو طلع توقعى غلط هروح على state
تانية بس برضه هيفضل توقعى takenعشان لو طلعت انى غلط تانى يبقى معنى كده ان
احتمال كبير اوى اكون خرجت من البرنامج ودخلت فى برنامج تانى وهروح فى الحالة دى ل
not takenلو طلع انى صح يبقى احتمال كبير اوى ان ال not takenاللى ظهرتلى االول
دى تبقى بتاعة خروج من اللوب ودلوقتى انا دخلت لوب جديدة ...نفس التفكير هيبقى مع ال
not takenوفى االخر هوصل لل finite state
يمكن ده يكون ملخص حلو اوى لحكاية ال hazardsدى
كده نكون خلصنا شابتر 4لو فى اى سؤال او اى نقد او اى حتة مش مفهومة اسألو علطول
وبدون تردد على استاذ اونالين
OSTAZ ONLINE