أسرار حوسبة GPU المستحيلة

تجربتنا في استخدام مجموعة الحوسبة من 480 وحدة معالجة رسومات AMD RX 480 لحل المشكلات الرياضية. كمشكلة ، أخذنا إثبات النظرية من مقال للأستاذ A. Chudnov " التحلل الدوري لمجموعات تفصل بين الدغراف والفئات الدورية للألعاب مع مكافأة مضمونة ." تتمثل المهمة في العثور على الحد الأدنى لعدد المشاركين في ائتلاف واحد في ألعاب التحالف من نوع نيم ، مما يضمن فوز أحد الأطراف.



تطوير وحدة المعالجة المركزية


المعالج الأول الذي حصل بالفعل على توزيع شامل هو 8086 من Intel ، تم تطويره في عام 1978. كانت سرعة الساعة 8086 8 ميجا هرتز فقط. بعد بضع سنوات ، ظهرت المعالجات الأولى التي يوجد داخلها 2 و 4 و 8 نوى. سمح كل قلب بتنفيذ التعليمات البرمجية بشكل مستقل عن الآخرين. للمقارنة ، يعمل معالج Intel Core i9-7980XE الحديث بتردد 2.6 جيجا هرتز ويحتوي على 18 نواة. كما ترون ، التقدم لا يقف ساكنا!

تطوير GPU


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

منذ عام 1996 ، بدأ إنتاج مسرعات الرسومات S3 ViRGE و 3dfx Voodoo و Diamond Monster وغيرها. في عام 1999 ، أصدرت nVidia معالج GeForce 256 ، وقدمت مصطلح GPU - معالج رسومات. إنه عالمي بالفعل ، يمكنه التعامل مع الحسابات الهندسية ، وتنسيق التحول ، ووضع نقاط الإضاءة والعمل مع المضلعات. كان الفرق بين GPU ورقائق الرسومات الأخرى أنه في الداخل ، بالإضافة إلى الأوامر المتخصصة ، كانت هناك مجموعة من الأوامر القياسية التي يمكنك من خلالها تنفيذ خوارزمية العرض الخاصة بك. أعطى هذا ميزة كبيرة ، لأنه سمح بإضافة أي تأثيرات خاصة ، وليس فقط تلك المبرمجة بالفعل في بطاقة الفيديو. بدءًا من GeForce 8000/9000 ، ظهرت معالجات البث في GPU - أجهزة كمبيوتر كاملة بالفعل. تراوح عددهم من 16 إلى 128 حسب النموذج ، وفي المصطلحات الحديثة ، يطلق عليهم وحدات تظليل موحدة ، أو ببساطة وحدات تظليل. تحتوي وحدات معالجة الرسوميات AMD Vega 64 المصنعة اليوم على 4096 وحدة تظليل ، ويمكن أن يصل تردد الساعة إلى 1536 ميجاهرتز!

ماذا يحتوي GPU؟


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

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

فهي مختلفة للغاية ، وحدة المعالجة المركزية ووحدة معالجة الرسومات


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

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

يمكن وصف سلوك تدفق الهواء عند كل نقطة بنفس المعادلات الرياضية وحل هذه المعادلات بالتوازي على عدد كبير من النوى.

GPU في أيدي المبرمجين


لإجراء حسابات على GPU ، يتم استخدام لغة خاصة ومترجم. هناك العديد من الأطر لأداء الحوسبة العامة لوحدة معالجة الرسومات: OpenCL و CUDA و C ++ AMP و OpenACC. تم استخدام الأولين على نطاق واسع ، ولكن استخدام CUDA يقتصر فقط على وحدات معالجة الرسومات nVidia.

تم إصدار OpenCL في 2009 بواسطة Apple. في وقت لاحق ، انضمت Intel و IBM و AMD و Google و nVidia إلى مجموعة Khronos وأعلنت دعمها للمعيار المشترك. منذ ذلك الحين ، تظهر نسخة جديدة من المعيار كل عام ونصف إلى عامين وكل منها يجلب المزيد والمزيد من التحسينات الجادة.

حتى الآن ، تتوافق لغة OpenCL C ++ الإصدار 2.2 مع معيار C ++ 14 ، وتدعم التنفيذ المتزامن للعديد من البرامج داخل الجهاز ، والتفاعل بينها من خلال قوائم الانتظار وخطوط الأنابيب الداخلية ، وتسمح بإدارة مرنة للمخازن المؤقتة والذاكرة الافتراضية.

مهام حقيقية


مشكلة مثيرة للاهتمام من نظرية الألعاب ، التي شاركنا في حلها ، هي إثبات النظرية من مقال للأستاذ A. Chudnov " التحلل الدوري لمجموعات تفصل بين الدغراف والفئات الدورية للألعاب مع مكافأة مضمونة ." تتمثل المهمة في العثور على الحد الأدنى لعدد المشاركين في ائتلاف واحد في ألعاب التحالف من نوع نيم ، مما يضمن فوز أحد الأطراف.

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

أهداف حل المشكلة هي قضايا معالجة الإشارات الفعالة (الكشف ، التزامن ، قياس الإحداثيات ، التشفير ، إلخ).

إن تعقيد حل هذه المشكلة هو فرز عدد كبير من الخيارات. على سبيل المثال ، إذا كنا نبحث عن حل لـ n = 25 ، فهذا هو 25 بت ، وإذا كان n = 100 ، فهذا بالفعل 100 بت. إذا أخذنا عدد كل التوليفات الممكنة ، فبالنسبة إلى n = 25 يكون 2 ^ 25 = 33 554 432 ، وبالنسبة إلى n = 100 فهو بالفعل 2 ^ 100 = 1 267 650600 228 229 401 496 703205376 تركيبات. الزيادة في التعقيد هائلة ببساطة!

هذه المهمة متوازية بشكل جيد ، مما يعني أنها مثالية لمجموعة GPU الخاصة بنا.

المبرمجون مقابل الرياضيات


في البداية ، قام علماء الرياضيات بحل هذه المشكلة في Visual Basic في Excel ، لذلك تمكنوا من الحصول على حلول أساسية ، ولكن الأداء المنخفض للغات البرمجة النصية لم يسمح لنا بالمضي قدمًا. قرار ن = 80 استغرق شهرا ونصف ... نحني رؤوسنا أمام هؤلاء المرضى.

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

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

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

لذا ، فقد وصلت مرحلة إعداد البرنامج للحل على وحدة معالجة الرسومات وتم تعديل الرمز للعمل في عدة سلاسل. يشارك برنامج التحكم الآن في إرسال المهام بين الخيوط. في بيئة متعددة الخيوط ، زادت سرعة الحساب 5 مرات! وقد تحقق ذلك بسبب التشغيل المتزامن لـ 4 خيوط ومجموعة من الوظائف.

في هذه المرحلة ، اتخذ القرار الحسابات الصحيحة حتى n = 80 في 10 دقائق ، بينما في Excel ، استغرقت هذه الحسابات شهرًا ونصف! انتصار ضئيل!

GPU و OpenCL


تقرر استخدام OpenCL الإصدار 1.2 لضمان أقصى توافق بين الأنظمة الأساسية المختلفة. تم إجراء التصحيح الأولي على وحدة المعالجة المركزية من Intel ثم على وحدة معالجة الرسومات من Intel. ثم انتقلوا إلى وحدة معالجة الرسومات من AMD.

يدعم معيار OpenCL 1.2 متغيرات الأعداد الصحيحة 64 بت. البعد 128 بت مدعوم بشكل محدود من قبل AMD ، ولكن يتم تجميعه في رقمين 64 بت. لأسباب تتعلق بالتوافق ولتحسين الأداء ، تقرر تقديم رقم 256 بت كمجموعة من أرقام 32 بت ، عمليات البت المنطقية التي يتم تنفيذها على وحدة معالجة الرسومات ALU الداخلية في أسرع وقت ممكن.
يحتوي برنامج OpenCL على نواة - وهي وظيفة تمثل نقطة دخول البرنامج. يتم تنزيل البيانات للمعالجة من وحدة المعالجة المركزية إلى ذاكرة الوصول العشوائي لبطاقة الفيديو ونقلها إلى النواة في شكل مخازن مؤقتة - مؤشرات إلى مجموعة من بيانات الإدخال والإخراج. لماذا صفيف؟ نقوم بأداء حوسبة عالية الأداء ، ونحتاج إلى العديد من المهام التي يتم تنفيذها في وقت واحد. تعمل النواة على الجهاز في حالات متعددة. يعرف كل قلب معرفه ويأخذ جزءه الخاص من المدخلات من مخزن مؤقت مشترك. الحالة عندما يكون الحل الأبسط هو الأكثر فاعلية. OpenCL ليست لغة فحسب ، بل هي أيضًا إطار عمل شامل يتم فيه التفكير بدقة في جميع تفاصيل الحوسبة العلمية وحوسبة الألعاب. هذا يجعل الحياة أسهل للمطور. على سبيل المثال ، يمكنك بدء العديد من سلاسل المحادثات ، حيث سيضعها مدير المهام على الجهاز نفسه. سيتم وضع المهام التي لم تبدأ التنفيذ الفوري في قائمة الانتظار وسيتم إطلاقها عندما تصبح وحدات الحوسبة مجانية. يحتوي كل مثيل kernel على مساحته الخاصة في المخزن المؤقت للإخراج ، حيث يضع الاستجابة عند الانتهاء من العمل.

المهمة الرئيسية لمدير OpenCL هي ضمان التنفيذ المتوازي للعديد من حالات النواة. يتم تطبيق الخبرة العلمية والعملية المتراكمة على مدى عقود هنا. بينما تقوم بعض النوى بتحميل البيانات في السجلات ، يعمل جزء آخر في هذا الوقت مع الذاكرة أو يقوم بإجراء العمليات الحسابية - ونتيجة لذلك ، يتم دائمًا تحميل وحدة معالجة الرسومات الأساسية بالكامل.
يقوم مترجم OpenCL بعمل تحسين جيد ، ولكن من الأسهل على المطور التأثير على الأداء. يسير تحسين GPU في اتجاهين - تسريع تنفيذ التعليمات البرمجية وإمكانية موازنتها. يعتمد مدى جودة الكود المتوازي مع المترجم على عدة أشياء: عدد مسجلات الخدش المشغولة (التي تقع في أبطأ ذاكرة GPU - عالمية) ، حجم الشفرة المترجمة (تحتاج إلى احتواء 32 كيلوبايت من ذاكرة التخزين المؤقت) ، عدد المتجهات والسجلات العددية المستخدمة.

ComBox A-480 GPU أو مليون النوى


هذا هو الجزء الأكثر إثارة للاهتمام في المشروع ، عندما انتقلنا من Excel إلى مجموعة الحوسبة التي تتكون من 480 بطاقة رسومات AMD RX 480. كبيرة وسريعة وفعالة. على استعداد تام لإنجاز المهمة والحصول على النتائج التي لم يراها العالم من قبل.

أريد أن أشير إلى أنه في جميع مراحل تحسين الشفرة وتحسينها ، بدأنا في البحث عن حل منذ البداية وقارننا إجابات الإصدار الجديد بالإجابات السابقة. سمح لنا ذلك بالتأكد من أن تحسين الشفرة والتحسينات لم تقدم أخطاء في الحلول. هنا تحتاج إلى فهم أنه لا توجد إجابات صحيحة في نهاية الكتاب الدراسي ، ولا أحد في العالم يعرفها.
أكد الإطلاق على المجموعة افتراضاتنا بشأن سرعة الحلول: استغرق البحث عن تسلسلات لـ n> 100 حوالي ساعة. كان من المدهش أن نرى كيف كانت الحلول الجديدة على مجموعة ComBox A-480 في دقائق ، بينما على وحدة المعالجة المركزية استغرق الأمر عدة ساعات.

في ساعتين فقط من مجموعة الحوسبة ، حصلنا على جميع الحلول حتى n = 127. أظهر فحص الحلول أن الإجابات التي تم الحصول عليها موثوقة وتتوافق مع نظريات البروفيسور A. Chudnov المذكورة في المقالة

تطور السرعة


إذا نظرت إلى مكاسب الأداء أثناء حل المشكلة ، كانت النتائج تقريبًا كما يلي:

  • شهر ونصف إلى n = 80 في Excel ؛
  • ساعة إلى n = 80 على Core i5 مع برنامج C ++ محسن ؛
  • 10 دقائق إلى n = 80 على Core i5 باستخدام مؤشرات متعددة ؛
  • 10 دقائق إلى n = 100 على وحدة معالجة رسومات AMD RX 480 ؛
  • 120 دقيقة إلى n = 127 على ComBox A-480.

الآفاق والمستقبل


العديد من المهام في تقاطع العلم والممارسة معلقة لجعل حياتنا أفضل. بدأ سوق تأجير الطاقة الحاسوبية في الظهور ، ولا تزال الحاجة إلى الحوسبة المتوازية تنمو.

التطبيقات الممكنة للحوسبة المتوازية:

  • مهام التحكم الآلي في المركبات والطائرات بدون طيار ؛
  • حسابات الخصائص الهوائية والديناميكية المائية ؛
  • التعرف على الكلام والصور المرئية ؛
  • تدريب الشبكة العصبية.
  • مهام علم الفلك والملاحة الفضائية ؛
  • التحليل الإحصائي والارتباطي للبيانات ؛
  • مركبات البروتين والبروتين للطي ؛
  • التشخيص المبكر للأمراض باستخدام الذكاء الاصطناعي.

اتجاه منفصل هو الحوسبة السحابية على GPU. على سبيل المثال ، تستأجر عمالقة مثل Amazon و IBM و Google قوتها الحاسوبية لوحدة معالجة الرسومات. اليوم يمكننا القول بثقة أن مستقبل الحوسبة المتوازية عالية الأداء سوف ينتمي إلى مجموعات GPU.

Source: https://habr.com/ru/post/ar425731/


All Articles