الجزء 2
التصاميم فائقة التدرج
تحدثنا في الجزء السابق عن خطوط المعالجة (pipelines)، وهي التقنية التي تمكّن المعالج من البدء في تنفيذ تعليمة جديدة، قبل أن ينتهي من تنفيذ التعليمة الحالية. وتمكّننا هذه التقنية من توفير الوقت، عن طريق التأكّد من أن المعالج لن يتوقف في انتظار التعليمات. ولا يستطيع المعالج في جميع الأحوال، إنهاء سوى تعليمة واحدة خلال دورة الساعة الواحدة. ولزيادة المردود، وتسريع المعالجة، تمتاز معالجات اليوم (مثل معالج Alpha، من شركة كومباك -بعد أن اشترت ديجيتال- ومعالج Power PC من شركتي IBM وموتورولا، ومعالجات بينتيوم من إنتل، ومعالج SPARC من صن) باحتوائها على معمارية التدرج الفائق (superscalar). وتكمن الفائدة الرئيسية لمعمارية التدرج الفائق في أنها تسمح للمعالج بتنفيذ أكثر من تعليمة في دورة الساعة الواحدة، باستخدام عدة خطوط معالجة.
يبحث المعالج ذو التصميم فائق التدرج، عن التعليمات التي يمكن معالجتها خلال دورة الساعة ذاتها، ويعالجها مع بعضها البعض. فيمكن، مثلاً، لمعالج بينتيوم، العمل على تعليمات بسيطة، مثل mov و or و add، بهذه الطريقة، تحت ظروف خاصة فقط (يجب أن لا تكون إحدى التعليمات بحاجة إلى نتيجة التعليمات الأخرى). لكن التعليمات الأكثر تعقيداً، كالتي تتضمّن عمليات الفاصلة العائمة، لا يمكن معالجتها معاً.
تقدّم المعالجة المتوازية (parallel processing) فوائد واضحة في مجال السرعة، لكن تقنية التدرج الفائق (superscalar) لها نقادها. ويعتقد البعض أنها تضيّع العديد من الفرص على التنفيذ المتوازي، لأن دمج التعليمات المنفصلة يأخذ وقتاً كبيراً نسبياً، ولأن التعليمات المنفصلة غالباً ما تتأخر أثناء إنتظارها للموارد. لنفرض، مثلاً، أن التعليمة A تنفذ في أحد خطوط المعالجة، فيما تنفذ التعليمة B في خط آخر، وتنتظر التعليمة C أن ينتهي خط التنفيذ الأول من تنفيذ التعليمة A. وعند الإنتهاء من تنفيذ التعليمة A، فإن الشيء الواضح هو استبدالها بالتعليمة C، وهي التعليمة التالية على خط التنفيذ. لكن، إذا كانت التعليمة C تحتاج إلى نتائج التعليمة B، التي يتم تنفيذها في خط التنفيذ المتتابع الآخر، فعليها أن تنتظر. وهذا ما يقضي على فكرة التنفيذ المتوازي، ويقضي على أية فرصة لزيادة السرعة. ويصبح، بذلك، لمعالجك الجديد المكلف دور محدود نسبياً، في زيادة الأداء.
وحتى في البرنامج المصمم بشكل جيد -الذي يحاول أن يحصل على الفائدة القصوى من خطوط المعالجة والتنفيذ المتوازي- يمكن أن تعاني خطوط المعالجة من تأخيرات زمنية. وللتغلب على هذه المشكلة، صمم المهندسون معالجات التدرج الفائق، لتقوم بأداء التنفيذ غير المرتّب (out-of-order execution). فإذا كان أحد خطوط المعالجة حراً، نظراً لأن التعليمة C تحتاج لنتائج التعليمة B، فإن المعالج يمكنه أن يبحث عن أول تعليمة في البرنامج لا تعتمد على التعليمة B (ولتكن التعليمة H). ويبدأ المعالج بالعمل على التعليمة H والتعليمات المرتبطة بها، إلى أن تنتهي التعليمة B، حيث يعود بعدها إلى التعليمة C. وبدلاً من إرسال نتائج التعليمة غير المرتّبة إلى المسجّلات (حيث يتعامل المعالج بشكل مباشر مع البيانات)، فإن المعالج يرسلها إلى ذاكرة وسيطة لتخزينها، ثم يقوم بترتيب كل شيء بانتظام، قبل تحريره.
تظهر إحدى مشاكل التنفيذ غير المرتّب إذا احتاجت تعليمتان إلى المسجّل ذاته. وللتغلب على هذه المشكلة، فإن معالجات اليوم يمكنها أن تغيّر أسماء المسجّلات بشكل فوري، ضمن عملية "إعادة تسمية المسجّلات" (registerrenaming). ومن الواضح أن التنفيذ غير المرتّب يتطلب تصميماً دقيقاً جداً للمعالج، لأن البرامج قد تفشل في عملها، إذا لم يتم تنفيذ التعليمات بالترتيب الصحيح.
طواقم التعليمات: ريسك وسيسك
يمكن تعريف طاقم التعليمات أنه مجموعة خاصة من الأوامر، التي يمكن لمعالج معيّن أن يتعرّف عليها وينفّذها. ودار خلال السنين، حوار طويل حول فلسفتين لتصميم المعالج، وكيفية تنفيذ طاقم التعليمات. تسمّى الطريقة الأولى، والتي عرفت في البداية باسم الشيفرة الميكروية (microcode)، بتقنية "طاقم التعليمات المعقدة للحوسبة"، أو اختصاراً "سيسك" (complicated instruction-set computing,CISC). وتسمى الطريقة الثانية، "طاقم التعليمات المختصرة للحوسبة"، أو "ريسك" (reduced instruction-setcomputing, RISC). تستخدم أجهزة الألعاب Nintendo 64، وكمبيوترات ماكنتوش باور بي سي، ومحطات العمل سيليكون جرافيكس، تقنية ريسك، فيما تستخدم الأجهزة الشخصية المرتكزة على معالجات إنتل ونظائرها، وكمبيوترات ماكنتوش 680x0 تصاميم سيسك. وعلى الرغم من تناقص الفروقات الفعلية بين هاتين التقنيتين، إلا أن النقاش لا يزال مستمراً بشأن التصميم الأفضل.
استخدمت الأجيال الأولى من المعالجات، الدارات الإلكترونية مباشرة لتنفيذ كل تعليمة. وقد كانت تلك المعالجات سريعة نسبياً نظراً لعدم وجود تعليمات برمجية، لتعمل من خلالها. وكما قد يخيّل إليك، فإن هذه الطريقة سببت مشكلة كبيرة، وهي أن أي تغيير في العتاد يتطلب تغيير الدارات التي تمثل التعليمات (أو البرمجيات) أيضاً، والعكس بالعكس. وقد أمكن تنفيذ برامج بسيطة بهذه الطريقة، أما البرامج المعقدة فكانت شبه مستحيلة. وللتغلب على هذه المشكلة، وضعت شركة IBM الشيفرة الميكروية (microcode)- وهي برمجيات بسيطة مخزّنة على رقاقة، يحصل منها المعالج على تعليماته.
تكمن إحدى فوائد الشيفرة الميكروية لمعالجات سيسك، في إمكانية تعديل طاقم التعليمات، بسهولة أكبر بكثير من السابق، مما سمح باستخدام تعليمات أكثر تعقيداً. ونظراً لأن التعليمة البرمجية الواحدة قد أخذت مكان عدة تعليمات عتادية بسيطة، أصبح بإمكاننا كتابة البرامج بعدد أقل من التعليمات. والفائدة الأخرى هي أن برامج سيسك أخذت مساحات أقل من الذاكرة، التي كانت مكلفة جداً، في الستينيات والسبعينيات. لكن التعامل مع هذه التعليمات المعقدة فرض عملاً إضافياً على المعالج. وتحتاج التعليمات المعقدة المختلفة، إلى عدد مختلف من دورات الساعة لتنفيذها، ولهذا فإن للشيفرة الميكروية مساوئها أيضاً.
البساطة هي بالطبع، الحل المناسب للقضاء على التعقيدات، وهذا ما حاولت معالجات ريسك أن تفعله في منتصف السبعينيات. والأساس الذي اعتمدته تقنية ريسك، هو أن المعالج، حتى مع تصاميم الشيفرة الميكروية (microcode)، يقضي معظم وقته في تنفيذ تعليمات بسيطة. وقد أدرك الباحثون أن تنفيذ سلسلة من التعليمات البسيطة قد يكون في معظم الأحيان أسرع من تنفيذ تعليمة واحدة معقدة. يتضمن تصميم ريسك، عدداً أقل من التعليمات، وجميعها بطول موحد (32 بت)، ويمكن أن تنفّذ بدورة ساعة واحدة. واختفت الشيفرة الميكروية (microcode) في معظم التعليمات شائعة التنفيذ، وعادت معالجات ريسك إلى نظام ما قبل الشيفرة الميكروية (pre-microcode)، أي إلى المنطق العتادي. واحتلت ذاكرة كاش عالية السرعة الخاصة بالمعالج، محل الشيفرة الميكروية، حيث تخزّن فيها سلسلة متتابعة من التعليمات. يجب ترجمة البرامج بعناية، في تصميم ريسك، للاستفادة القصوى من طاقم التعليمات، كما يجب الاستفادة من تقنية خطوط المعالجة (pipelining) إلى حدودها القصوى.
حالما ظهر تصميم ريسك، أُعيد تسمية الشيفرة الميكروية إلى اسم "سيسك". وأكثر تصاميم سيسك انتشاراً هي بالطبع، في عائلة معالجات إنتل ومعالجات المينفريم لشركة IBM، ومعالجات موتورولا 680x0. وأكثر طواقم التعليمات شعبية هو طاقم تعليمات x86، الذي صمم أساساً، لمعالج إنتل 8086، ولا يزال مستخدماً حتى الآن في معالجات بينتيوم. وأحدث الإضافات التي طرأت على تعليمات x86، تعليمات MMX، وهي عبارة عن 57 تعليمة جديدة تتعلق بشكل رئيسي ببرمجة الملتيميديا. وقد يختفي طاقم التعليمات x86 مع ظهور معمارية طاقم التعليمات IA-64 المقبل من شركة إنتل. وسوف تظهر هذه المعمارية أولاً، في معالج Merced (P7)، عيار 64 بت، الذي يعتمد على مجموعة جديدة من طواقم التعليمات لأول مرة في تاريخ الكمبيوترات الشخصية. وأعلنت إنتل أن معالج Merced سيدعم طاقم التعليمات x86، لكنها لم تقدم حتى الآن، فكرة عن كيفية تحقيق التوافق.