معالجات x86 غير مستغلة

في منتصف التسعينات تعاونت إنتل مع HP لتطوير معالجات تعمل بفلسفة مختلفة عن معالجات التعليمات المركبة CISC أو المختزلة RISC. أعلن في 1997 عن معالجات التعليمات المتوازية الصريحة Explicitly Parallel Instruction Computing أو EPIC باختصار. أساس هذه الفلسفة الجديدة أبحاث مهندسين في HP في نهاية الثمانينات لتطوير معالجات مختلفة تعالج قصور المعماريات الموجدة آنذاك. تهدف هذه المعمارية الجديدة ذات الفلسفة المختلفة لتطوير معالجات 64 بت ذات كفاءة عالية مستفيدة من خصائص مبتكرة و فريدة في وقتها، مثل المعرفة التخمينية speculation (معرفة ما له فائدة و ما ليس له فائدة) و التنبؤ prediction (معرفة مسار تفرع البرنامج) و التوازي الصريح explicit parallelism حيث كل العمليات تجري على عدة بيانات بالتوازي.

لم تكن الحاجة لمعالجات 64 بت بسبب قصور معالجات 32 بت. على العكس، معالجات 32 بت كافية لكل حاجات المستخدم العامة. النصوص text بيانات 8 أو 16 أو 24 بت و يعتمد عدد البت على اللغة و الترميز المستخدم. البيانات العددية numeral و الوسائط المتعددة multimedia و رسوم الحاسوب computer graphics بيانات 32 بت. معالجات 32 بت لها حد أقصى في عنونة الذاكرة memory adressing يبلغ 4 گيگابايت. ما دفع إنتل للتوجه لمعالج 64 بت و بمعمارية مختلفة التعقيد الهندسي في معالجات بنتيوم برو المستخدم في الخوادم server و محطات العمل workstation.

في 2001 أعلنت إنتل عن أول معالج بمعمارية IA64 باسم آيتينيوم Itanium. كانت هذا المعالج بالمواصفات الرائدة و المميزة جيداً على الورق، لكنه لم يكن كذلك في الواقع العملي. عانت معالجات IA64 طيلة وجودها من صعوبة برمجتها والاستفادة من خصائصها، و عانت المترجمات compilers و مطوروها أكثر نظراً لصعوبة ترجمة البرامج المكتوبة لمعالجات آيتينيوم. دعمت معالجات آيتينيوم برمجيات x86 ذات 32 بت عن طريق المحاكاة ، لكن أداءها سيء جداً و فرق الأداء كبير بينها وبين أداء معالجات بنتيوم أو غيرها من المعالجات الموجودة. من الواضح أن هذه المعالجات ليست الثورة القادمة في صناعة المعالجات.

في نفس الوقت، عمل مهندسين (اثنين) في AMD على تطوير معالجات 64 بت جديدة، و لكن بدل بناء معمارية جديدة، عمل هذين المهندسين على دعم 64 بت في معالجات x86 الموجودة. من أهم التغييرات زيادة طول المسجلات عامة الأغراض general-purpose registers لتصير 64 بت (يشمل العمليات الحسابية على الأعداد الصحيحة integers) و زيادة عددها لتصير 16 مسجلاً. زيادة مسجلات XMM المستخدمة في تعليمات SSE لتصير 16 مسجلاً، و صارت هذه المسجلات مستخدمة لعمليات النقطة العائمة floating-point (العمليات الحسابية على الأعداد الحقيقة real numbers) بدل مسجلات FPU(x87) الموجودة لكن محصورة على تطبيقات 32 بت. سميت هذه المعمارية AMD64 و هذه التسمية لا تزال تستخدمها بعض توزيعات لينكس للإشارة لمعالجات x86 ذات 64 بت، لكن التسمية الأكثر شيوعاً اليوم x86_64.

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

دعمت معالجات x86_64 أكثر التعليمات (ليس كلها) التي تنفذها معالجات 32 بت، و هذا لأن إنتل تضيف تعليمات جديدة في بعض المعالجات كلما أصدرت معالجات ذات تطويرات بارزة. أضافت إنتل (و تبعتها AMD) تعليمات جديدة في معالجات x86_64 منها عمليات SIMD جديدة. في SSE3 تعليمات العمليات الحسابية الأفقية (التي تعني عمليات حسابية على بيانات في نفس المسجل على عكس العمليات العمودية التي فيها العمليات على بيانات في مسجلات مختلفة). في SSSE3 عمليات إضافية زيادة على ما أضافته SSE3. في SSE4 مجموعتين من التعليمات: SSE4.1 تشمل عمليات المصفوفات و ضرب الأعداد الكبيرة و تقريب الأعداد، و SSE4.2 أهمها عمليات السلاسل النصية.

في 2011 أصدرت إنتل معالجاتها ذات الاسم الرمزي الجسر الرملي Sandy Bridge. حملت هذه المعالجات تغييرات جذرية على مستوى الهندسة الداخلية، و أتت بتعليمات جديدة من ضمنها AVX. تعليمات AVX تشبه SSE بالمجمل مع اختلافات. تعمل تعليمات SSE على مسجلات XMM ذات 128 بت، أما AVX تعمل على مسجلات YMM ذات 256 بت و تعمل أيضاً على مسجلات XMM ذات 128بت. تعمل تعليمات SSE على البيانات العددية و المتجهة، بينما AVX محصورة على البيانات المتجهة فقط [المقصود في البرمجة بيانات نقطية scalar يعني عدد واحد أما متجهة vector مجموعة أو مصفوفة من الأعداد]. تعليمات SSE مدمِّرة destructive (كغيرها من تعليمات x86)، أما تعليمات AVX غير مدمِّرة non-destructive (تعليمات المعالجات الأخرى غير x86). تعليمات SSE و تعليمات x86 تعليمات ذات عنوانين two-address instructions، أحدهما يحمل النتيجة بعد تنفيذ التعليمة و تحل محل البيانات الأصلية، لذلك تسمى مدمرة، أما تعليمات AVX تعمل على ثلاثة عناوين three-address instructions، واحد منهم يحمل نتيجة العملية أما الثاني و الثالث يبقيان دون تغيير بعد تنفيذ التعليمة، لذلك تسمى غير مدمرة. أضافت إنتل تعليمات جديدة تحت اسم AVX2 في المعالجات اللاحقة لتشمل تعليمات إضافية مع تعليمات FMA التي تدمج عمليتي الضرب و الجمع في عملية واحدة. لحقتها بتعليمات AVX512 التي تعمل على مسجلات ZMM ذات طول 512 بت.

وجود كل هذه التعليمات أمر حسن، لكن دعمها محدود. قليلة جداً التطبيقات التي وظفت تلك التعليمات من SSE3 إلى AVX2، نظراً لاختلاف وجودها بين المعالجات، إذ أن بعضها يغيب عن معالجات إنتل الأقل تكلفة، و يتأخر وجودها في معالجات AMD. دفع هذا الاختلاف التعاون بين إنتل و AMD و ردهات و سوزه لتصنيف معالجات x86_64 لعدة مستويات حسب التعليمات التي تدعمها. هذه التعليمات المحددة هي التعليمات عامة الأغراض والتي تستفيد منها معظم التطبيقات التي يستخدمها عامة المستخدمين. التعليمات المخصصة مثل AES المستخدمة في التشفير غير مشمولة في هذه التصنيفات.

أحد التطبيقات المهمة التي استفادت كل التعليمات الإضافية RPCS3 محاكي PlayStation 3، و قد ذكر أحد المطورين أسباب فائدة AVX512 في RPCS3. ذكر المطور تفاصيل كثيرة لكن يهم المستخدم النهائي النتيجة، و يهمنا علاقة كل الكلام النظري بالتطبيق العملي. في المقال نتيجة ترجمة المحاكي للمستويات الأربع لمعالجات x86 و معرفة معدل الإطارات بعد تشغيل لعبة God of War 3 على نفس الجهاز المزود بمعالج إنتل.

  1. في المستوى الأول الأداء سيء جداً بسبب معدل الإطارات المنخفض الذي لا يتجاوز 4 إطارات في الثانية. تعليمات SSE2 الموجودة في كل معالجات x86_64 قاصرة و محدودة على الرغم من قوة المعالج.
  2. في المستوى الثاني الأداء ممتاز و يصل معدل الإطارات أعلى من 160 إطار في الثانية. تعليمة خلط البايت byte shuffle من SSSE3 تفيد في قلب ترتيب البيانات ذات النهاية الكبيرة (البايت الأعلى يأتي في موقع الذاكرة الأدنى) في معمارية PowerPC المستخدمة في معالج Cell الموجود في PlayStation 3.
  3. في المستوى الثالث الأداء تحسن أكثر و يصل معدل الإطارات أعلى من 180 إطار في الثانية. هنا تأتي فائدة تعليمات AVX2 غير المدمرة.
  4. في المستوى الرابع الأداء أقصى ما يمكن و يبلغ معدل الإطارات 240 إطار في الثانية.

آخر إصدار من PCSX2 محاكي PlayStation 2 صدر بنسختين، الأولى موجهة لمعالجات المستوى الثاني، و الثانية موجهة لمعالجات المستوى الثالث. معالج PlayStation 2 المسمى Emotion Engine بمعمارية MIPS مع 32 مسجل SIMD ذو 128 بت. يستفيد المحاكي كثيراً من توظيف أحدث التعليمات في معالجات x86_64. منذ أول إصداراته، Xenia محاكي Xbox360 يدعم فقط معالجات المستوى الثالث. معالج Xenon بمعمارية PowerPC نفسها المستخدمة في معالج Cell، لكن بدل التعقيدات الموجودة في Cell، في المعالج 128 مسجل VMX128 (مسجلات SIMD مخصصة).

ليست المحاكيات وحدها تستفيد من التعليمات الحديثة، بل من المفيد توظيفها في التطبيقات الأكثر استخداماً مثل المتصفحات و قارئات PDF و مستعرضات الصور و التطبيقات المكتبية لتستفيد من تحسينات الأداء التي تقدمها هذه التعليمات. أكثر توظيف لهذه التعليمات موجود في أدوات الفيديو مثل x264 و x265 و dav1d (تجارب شبكة Phoronix و غيره من مواقع تجرب برامج تعتمد على أنوية المعالج المركزي دون معالج الفيديو)، و من الطبيعي أن نرى هذه البرمجيات تؤدي بفارق ملحوظ مقارنة لو وجهنا البرنامج للمعالجات القديمة. وجدت كثير من التعليقات ترى السبب في أداء هذه البرمجيات أنها تعمل على مسجلات 256 بت أو 512 بت، لكن هذا غير صحيح (أو على الأقل لا يبدو لي صحة تلك الادعاءات). اجتمع حجم المسجلات المناسب لتلك التطبيقات مع التعليمات غير المدمرة التي تحافظ على البيانات و تقلل الحاجة لنقل البيانات و العمليات الكثيرة التي يؤديها المعالج من تلك التعليمات و التي تأخذ من الوقت القليل بدل كتابة برنامج يؤديها.

معالجات x86 هي الموجودة و الأكثر انتشاراً في الحواسيب، لكن غير مستفاد منها بالكامل. قلة الاستفادة من هذه المعالجات جعلت الكثيرين يظنون أنها لا تؤدي جيداً و أنها أقل مستوى من معالجات ARM مثلاً (و التي فيها استفادة كبيرة من تعليمات ARMv8/ARMv9 الحديثة أكثر مما نراه في x86 خصوصاً أنها الأكثر انتشاراً في الأجهزة منخفضة الطاقة و الاستفادة منها يعني فارق الأداء)، لكن الدليل العملي يثبت عكس ذلك. وجود هذه المعالجات بين أيدينا و نتعامل معها كل يوم سبب كافٍ يجعل المطورين يستفيدون منها في برمجياتهم. بعض توزيعات لينكس تدعم معالجات المستوى الثاني نظراً لانتشارها الواسع، و بعضها يدعم معالجات المستوى الثالث لأنها موجودة منذ عشر سنوات. تحتوي مستودعات فيدورا على برامج موجهة لكل مستويات معالجات x86. برأيي من المهم أن نرى التطبيقات التي نستخدمها في حياتنا اليومية تستفيد من دعم المعالجات الموجودة في أجهزتنا، عدا ذلك فهي طاقات مهدرة.