يتمتع معظم المبرمجين ببعض الفهم لأساسيات وحدات المعالجة المركزية والبرمجة المتسلسلة لأنهم نشأوا وهم يكتبون التعليمات البرمجية لوحدة المعالجة المركزية، لكن كثيرين منهم أقل دراية بالعمل الداخلي لوحدات معالجة الرسومات وما يجعلها مميزة للغاية. على مدار العقد الماضي، أصبحت وحدات معالجة الرسومات مهمة بشكل لا يصدق بسبب استخدامها الشامل في التعلم العميق. اليوم، من الضروري أن يمتلك كل مهندس برمجيات فهمًا أساسيًا لكيفية عملها. هدفي من هذه المقالة هو إعطائك هذه الخلفية.
مقارنة بين وحدة المعالجة المركزية ووحدة معالجة الرسومات
سنبدأ بإجراء مقارنة بين وحدة المعالجة المركزية ووحدة معالجة الرسومات، وهو ما سيمنحنا منظورًا أفضل لمشهد وحدة معالجة الرسومات. ومع ذلك، فهذا موضوع منفصل ولا يمكننا بأي حال من الأحوال أن نلخص كل شيء في قسم واحد. لذا، سنلتزم ببعض النقاط الرئيسية.
الفرق الرئيسي بين وحدات المعالجة المركزية ووحدات معالجة الرسومات هو في أهداف تصميمها. تم تصميم وحدات المعالجة المركزية لتنفيذ التعليمات المتسلسلة. لتحسين أداء التنفيذ المتسلسل، تم تقديم العديد من الميزات في تصميم وحدة المعالجة المركزية على مر السنين. كان التركيز على تقليل زمن انتقال تنفيذ التعليمات حتى تتمكن وحدات المعالجة المركزية من تنفيذ سلسلة من التعليمات بأسرع ما يمكن. يتضمن هذا ميزات مثل خط أنابيب التعليمات والتنفيذ خارج الترتيب والتنفيذ المضاربي وذاكرة التخزين المؤقت متعددة المستويات.
من ناحية أخرى، تم تصميم وحدات معالجة الرسوميات لمستويات هائلة من التوازي والإنتاجية العالية، على حساب زمن انتقال التعليمات المتوسط إلى العالي. وقد تأثر هذا الاتجاه التصميمي باستخدامها في ألعاب الفيديو والرسومات والحوسبة العددية والآن التعلم العميق. تحتاج كل هذه التطبيقات إلى إجراء قدر هائل من الجبر الخطي والحسابات العددية بمعدل سريع للغاية، ولهذا السبب تم توجيه الكثير من الاهتمام لتحسين إنتاجية هذه الأجهزة.
لنتأمل مثالاً ملموساً. تستطيع وحدة المعالجة المركزية إضافة رقمين بسرعة كبيرة بالمقارنة بوحدة معالجة الرسوميات بسبب زمن انتقال التعليمات المنخفض لديها. وسوف تكون قادرة على القيام بالعديد من هذه العمليات الحسابية في تسلسل أسرع من وحدة معالجة الرسوميات. ومع ذلك، عندما يتعلق الأمر بإجراء ملايين أو مليارات من هذه العمليات الحسابية، فإن وحدة معالجة الرسوميات سوف تقوم بهذه العمليات الحسابية أسرع كثيراً من وحدة المعالجة المركزية بسبب التوازي الهائل الذي تتمتع به.
إذا كنت تحب الأرقام، فلنتحدث عن الأرقام. يتم قياس أداء الأجهزة للحسابات الرقمية من حيث عدد عمليات الفاصلة العائمة التي يمكنها القيام بها في الثانية (FLOPS). توفر Nvidia Ampere A100 معدل إنتاج يبلغ 19.5 TFLOPS لدقة 32 بت. وبالمقارنة، يبلغ معدل إنتاج معالج Intel 24-core 0.66 TFLOPS لدقة 32 بت (هذه الأرقام من عام 2021). وقد اتسعت هذه الفجوة في أداء الإنتاجية بين وحدات معالجة الرسومات ووحدات المعالجة المركزية مع كل عام يمر.
الشكل التالي يقارن بين بنيات وحدات المعالجة المركزية ووحدات معالجة الرسومات.
كما ترى، تخصص وحدات المعالجة المركزية قدرًا كبيرًا من مساحة الشريحة للميزات التي ستقلل من زمن انتقال التعليمات، مثل ذاكرات التخزين المؤقتة الكبيرة ووحدات الحساب والمنطق الأقل ووحدات التحكم الأكثر. وعلى النقيض من ذلك، تستخدم وحدات معالجة الرسومات عددًا كبيرًا من وحدات الحساب والمنطق لزيادة قدرتها الحسابية والإنتاجية. وهي تستخدم قدرًا صغيرًا جدًا من مساحة الشريحة لذاكرات التخزين المؤقتة ووحدات التحكم، وهي الأشياء التي تقلل من زمن انتقال وحدات المعالجة المركزية.
تحمل زمن الوصول والإنتاجية العالية
قد تتساءل كيف تتحمل وحدات معالجة الرسوميات زمن انتقال مرتفع وتوفر أداءً عاليًا. يصبح هذا ممكنًا بفضل العدد الكبير من الخيوط وقوة الحوسبة الهائلة التي تتمتع بها وحدات معالجة الرسوميات. حتى إذا كانت التعليمات الفردية ذات زمن انتقال مرتفع، فإن وحدات معالجة الرسوميات تقوم بجدولة الخيوط بكفاءة للتنفيذ بحيث تستخدم قوة الحوسبة في كل نقطة زمنية. على سبيل المثال، بينما تنتظر بعض الخيوط نتيجة إحدى التعليمات، ستتحول وحدة معالجة الرسوميات إلى تنفيذ خيوط أخرى غير منتظرة. يضمن هذا أن وحدات الحوسبة على وحدة معالجة الرسوميات تعمل بأقصى قدرتها في جميع نقاط الوقت، وبالتالي توفر إنتاجية عالية. سنحصل على صورة أوضح لهذا لاحقًا عندما نناقش كيفية تنفيذ النواة على وحدة معالجة الرسوميات.
هندسة وحدة معالجة الرسوميات
نحن ندرك أن وحدات معالجة الرسوميات تفضل الإنتاجية العالية، ولكن ما هو شكل بنيتها التي تمكنها من تحقيق ذلك، دعنا نناقش ذلك في هذا القسم.
هندسة الحوسبة GPU
تتكون وحدة معالجة الرسوميات من مجموعة من المعالجات المتعددة المتدفقة (SM). تتكون كل من هذه المعالجات المتعددة المتدفقة بدورها من عدة معالجات أو أنوية أو خيوط متدفقة. على سبيل المثال، تحتوي وحدة معالجة الرسوميات Nvidia H100 على 132 معالجًا متعددًا متدفقًا مع 64 نواة لكل معالج متعدد المتدفقات، بإجمالي 8448 نواة.
تتمتع كل وحدة SM بكمية محدودة من الذاكرة الموجودة على الشريحة، والتي يشار إليها غالبًا باسم الذاكرة المشتركة أو لوحة التذكير، والتي يتم مشاركتها بين جميع النوى. وعلى نحو مماثل، يتم مشاركة موارد وحدة التحكم على وحدة SM بين جميع النوى. بالإضافة إلى ذلك، يتم تجهيز كل وحدة SM بجدولة خيوط تعتمد على الأجهزة لتنفيذ الخيوط.
بالإضافة إلى ذلك، يحتوي كل SM أيضًا على العديد من الوحدات الوظيفية أو وحدات الحوسبة السريعة الأخرى مثل نوى الموتر أو وحدات تتبع الأشعة لتلبية متطلبات الحوسبة المحددة لحجم العمل الذي تلبيه وحدة معالجة الرسومات.
الآن، دعونا نقوم بتفكيك ذاكرة وحدة معالجة الرسوميات وننظر بداخلها.
هندسة ذاكرة وحدة معالجة الرسوميات
تحتوي وحدة معالجة الرسوميات على عدة طبقات من أنواع مختلفة من الذاكرة، ولكل منها حالة استخدام محددة. يوضح الشكل التالي التسلسل الهرمي للذاكرة لوحدة SM واحدة في وحدة معالجة الرسوميات.
دعونا نكسرها.
- السجلات: سنبدأ بالسجلات. كل وحدة معالجة مركزية في وحدة معالجة الرسوميات تحتوي على عدد كبير من السجلات. على سبيل المثال، تحتوي طرازات Nvidia A100 وH100 على 65536 سجلاً لكل وحدة معالجة مركزية. تتم مشاركة هذه السجلات بين النوى، ويتم تخصيصها لها ديناميكيًا وفقًا لمتطلبات الخيوط. أثناء التنفيذ، تكون السجلات المخصصة لخيط ما خاصة به، أي أن الخيوط الأخرى لا يمكنها قراءة/كتابة هذه السجلات.
- ذاكرة التخزين المؤقتة الثابتة: بعد ذلك، لدينا ذاكرة تخزين مؤقتة ثابتة على الشريحة. تُستخدم هذه الذاكرة المؤقتة لتخزين البيانات الثابتة التي يستخدمها الكود الذي يتم تنفيذه على SM. للاستفادة من هذه الذاكرة المؤقتة، يتعين على المبرمجين الإعلان صراحةً عن الكائنات كثوابت في الكود حتى تتمكن وحدة معالجة الرسوميات من تخزينها مؤقتًا والاحتفاظ بها في ذاكرة التخزين المؤقتة الثابتة.
- الذاكرة المشتركة: تحتوي كل وحدة SM أيضًا على ذاكرة مشتركة أو لوحة مؤقتة وهي عبارة عن كمية صغيرة من ذاكرة SRAM القابلة للبرمجة على الشريحة والسريعة ومنخفضة الكمون. وهي مصممة ليتم مشاركتها بواسطة كتلة من الخيوط التي تعمل على الوحدة SM. تكمن الفكرة وراء الذاكرة المشتركة في أنه إذا احتاجت خيوط متعددة إلى العمل بنفس قطعة البيانات، فيجب على واحدة منها فقط تحميلها من الذاكرة العالمية، بينما ستشاركها الخيوط الأخرى. يمكن أن يؤدي الاستخدام الدقيق للذاكرة المشتركة إلى تقليل عمليات التحميل المكررة من الذاكرة العالمية، وتحسين أداء تنفيذ النواة. استخدام آخر للذاكرة المشتركة هو آلية المزامنة بين الخيوط التي يتم تنفيذها داخل كتلة.
- ذاكرة التخزين المؤقت L1: تحتوي كل وحدة SM أيضًا على ذاكرة تخزين مؤقت L1 يمكنها تخزين البيانات التي يتم الوصول إليها بشكل متكرر من ذاكرة التخزين المؤقت L2.
- ذاكرة التخزين المؤقتة L2: توجد ذاكرة تخزين مؤقتة L2 مشتركة بين جميع وحدات SM. وهي تخزن البيانات التي يتم الوصول إليها بشكل متكرر من الذاكرة العالمية لتقليل زمن الوصول. لاحظ أن كل من ذاكرتي التخزين المؤقت L1 وL2 شفافتان بالنسبة لوحدة SM، أي أن وحدة SM لا تعرف أنها تحصل على بيانات من L1 أو L2. أما بالنسبة لوحدة SM، فهي تحصل على البيانات من الذاكرة العالمية. وهذا يشبه طريقة عمل ذاكرات التخزين المؤقتة L1/L2/L3 في وحدات المعالجة المركزية.
- الذاكرة العالمية: تحتوي وحدة معالجة الرسوميات أيضًا على ذاكرة عالمية خارج الشريحة، وهي ذاكرة DRAM عالية السعة وعرض النطاق الترددي. على سبيل المثال، تحتوي Nvidia H100 على ذاكرة عالية النطاق الترددي (HBM) بسعة 80 جيجابايت بعرض نطاق ترددي يبلغ 3000 جيجابايت/ثانية. نظرًا لبعدها عن وحدات المعالجة المركزية، فإن زمن انتقال الذاكرة العالمية مرتفع للغاية. ومع ذلك، تساعد الطبقات الإضافية العديدة من الذواكر الموجودة على الشريحة والعدد الكبير من وحدات الحوسبة في إخفاء هذا الزمن.
الآن بعد أن تعرفنا على المكونات الرئيسية لأجهزة وحدة معالجة الرسومات، دعنا نذهب لخطوة أعمق ونفهم كيف تظهر هذه المكونات في الصورة عند تنفيذ التعليمات البرمجية.
فهم نموذج تنفيذ وحدة معالجة الرسوميات (GPU)
لفهم كيفية تنفيذ وحدة معالجة الرسوميات للنواة، نحتاج أولاً إلى فهم ماهية النواة وما هي تكويناتها. لنبدأ من هنا.
مقدمة موجزة عن نوى CUDA وكتل الخيوط
CUDA هي واجهة البرمجة التي تقدمها شركة Nvidia لكتابة البرامج لوحدات معالجة الرسوميات الخاصة بها. في CUDA، يمكنك التعبير عن عملية حسابية تريد تشغيلها على وحدة معالجة الرسوميات في شكل مشابه لدالة C/C++ وتسمى هذه الدالة نواة. تعمل النواة على متجهات من الأرقام بالتوازي والتي يتم توفيرها لها كمعلمات دالة. ومن الأمثلة البسيطة على ذلك نواة لأداء عملية جمع المتجهات، أي نواة تأخذ متجهين من الأرقام كمدخلات، وتضيفهما عنصريًا وتكتب النتيجة في متجه ثالث.
لتنفيذ نواة على وحدة معالجة الرسوميات، نحتاج إلى تشغيل عدد من الخيوط التي يشار إليها مجتمعة باسم الشبكة. ولكن هناك المزيد من البنية للشبكة. تتكون الشبكة من كتلة خيوط واحدة أو أكثر (يطلق عليها أحيانًا ببساطة الكتل) وتتكون كل كتلة من خيط واحد أو أكثر.
يعتمد عدد الكتل والخيوط على حجم البيانات وكمية التوازي التي نريدها. على سبيل المثال، في مثال إضافة المتجهات، إذا أضفنا متجهات ذات بُعد 256، فقد نقرر تكوين كتلة خيط واحدة من 256 خيطًا بحيث يعمل كل خيط على عنصر واحد من المتجه. بالنسبة للمشكلات الأكبر، قد لا يكون لدينا عدد كافٍ من الخيوط المتاحة على وحدة معالجة الرسومات وقد نرغب في أن يتعامل كل خيط مع نقاط بيانات متعددة.
فيما يتعلق بالتنفيذ، فإن كتابة نواة تتطلب جزأين. الأول هو كود المضيف الذي يتم تنفيذه على وحدة المعالجة المركزية. هنا نقوم بتحميل البيانات وتخصيص الذاكرة على وحدة معالجة الرسومات وتشغيل النواة بشبكة مكونة من الخيوط. والجزء الثاني هو كتابة كود الجهاز (وحدة معالجة الرسومات) الذي يتم تنفيذه على وحدة معالجة الرسومات.
بالنسبة لمثال إضافة المتجه الخاص بنا، يوضح الشكل التالي كود المضيف.
والتالي هو كود الجهاز، الذي يحدد وظيفة kernel الفعلية.
نظرًا لأن التركيز في هذه المقالة ليس على تعليم CUDA، فلن نتعمق أكثر في هذا الكود. الآن، دعنا نلقي نظرة على الخطوات الدقيقة وراء تنفيذ نواة على وحدة معالجة الرسوميات.
خطوات تنفيذ Kernel على وحدة معالجة الرسوميات
نسخ البيانات من المضيف إلى الجهاز
قبل أن يتم جدولة نواة النظام للتنفيذ، يجب نسخ جميع البيانات التي تحتاجها من ذاكرة المضيف (وحدة المعالجة المركزية) إلى الذاكرة العالمية لوحدة معالجة الرسوميات (الجهاز). على الرغم من أنه في أحدث أجهزة وحدة معالجة الرسوميات، يمكن للمرء أيضًا القراءة مباشرة من ذاكرة المضيف باستخدام ذاكرة افتراضية موحدة.
جدولة كتل الخيوط على SMs
بعد أن تحصل وحدة معالجة الرسوميات على كافة البيانات الضرورية في ذاكرتها، تقوم بتعيين كتل الخيوط إلى وحدات المعالجة المركزية. تتم معالجة كافة الخيوط داخل كتلة واحدة بواسطة نفس وحدة المعالجة المركزية في نفس الوقت. لتحقيق ذلك، يجب على وحدة معالجة الرسوميات تخصيص موارد على وحدة المعالجة المركزية لتلك الخيوط قبل أن تتمكن من بدء تنفيذها. في الممارسة العملية، يمكن تعيين كتل خيوط متعددة لنفس وحدة المعالجة المركزية للتنفيذ المتزامن.
نظرًا لوجود عدد محدود من وحدات SM ويمكن أن تحتوي النوى الكبيرة على عدد كبير جدًا من الكتل، فقد لا يتم تعيين جميع الكتل للتنفيذ على الفور. تحتفظ وحدة معالجة الرسوميات بقائمة من الكتل المدرجة في قائمة الانتظار للتعيين والتنفيذ. عندما تنتهي أي كتلة من التنفيذ، تقوم وحدة معالجة الرسوميات بتعيين إحدى الكتل المدرجة في قائمة الانتظار للتنفيذ.
تعليمة واحدة وخيوط متعددة (SIMT) والتشوهات
نحن نعلم أن جميع خيوط الكتلة يتم تعيينها لنفس وحدة المعالجة المركزية. ولكن هناك مستوى آخر من تقسيم الخيوط بعد ذلك. يتم تجميع هذه الخيوط في أحجام 32 (تسمى warp)، ويتم تعيينها معًا للتنفيذ على مجموعة من النوى تسمى كتلة المعالجة.
يقوم SM بتنفيذ جميع الخيوط داخل الالتواء معًا عن طريق جلب نفس التعليمات وإصدارها لجميعها. ثم تقوم هذه الخيوط بتنفيذ هذه التعليمات في وقت واحد، ولكن على أجزاء مختلفة من البيانات. في مثال إضافة المتجهات الخاص بنا، قد تقوم جميع الخيوط في الالتواء بتنفيذ تعليمات الإضافة، ولكنها ستعمل على مؤشرات مختلفة للمتجهات.
يُطلق على نموذج تنفيذ الالتواء هذا أيضًا اسم تعليمة واحدة وخيوط متعددة (SIMT) لأن خيوطًا متعددة تنفذ نفس التعليمات. وهو مشابه لتعليمات تعليمة واحدة وبيانات متعددة (SIMD) في وحدات المعالجة المركزية.
تتوفر آلية بديلة لجدولة التعليمات في الأجيال الأحدث من وحدات معالجة الرسوميات، بدءًا من Volta وما بعدها، والمعروفة باسم جدولة الخيوط المستقلة. وهي تسمح بالتزامن الكامل بين الخيوط، بغض النظر عن التشويه. ويمكن استخدامها لتحسين استخدام موارد التنفيذ، أو كآلية مزامنة بين الخيوط. لن نغطي جدولة الخيوط المستقلة هنا، ولكن يمكنك القراءة عنها في دليل برمجة CUDA.
نسخ بيانات النتيجة من الجهاز إلى ذاكرة المضيف
أخيرًا، عندما يتم الانتهاء من تنفيذ كافة مؤشرات ترابط النواة، تكون الخطوة الأخيرة هي نسخ النتيجة مرة أخرى إلى ذاكرة المضيف.
على الرغم من أننا قمنا بتغطية كل شيء عن تنفيذ kernel النموذجي، إلا أن هناك شيئًا آخر يتطلب قسمًا خاصًا به: تقسيم الموارد الديناميكي.
تقسيم الموارد ومفهوم الإشغال
نقوم بقياس استخدام موارد وحدة معالجة الرسوميات من خلال مقياس يسمى “الإشغال”، والذي يمثل نسبة عدد التشويهات المخصصة لوحدة SM إلى الحد الأقصى للعدد الذي يمكنها دعمه. لتحقيق أقصى إنتاجية، نريد أن يكون لدينا نسبة إشغال 100%. ومع ذلك، في الممارسة العملية ليس من الممكن دائمًا القيام بذلك بسبب القيود المختلفة.
إذًا، لماذا لا يمكننا دائمًا الوصول إلى نسبة الإشغال 100%؟ تحتوي وحدة المعالجة المركزية على مجموعة ثابتة من موارد التنفيذ، بما في ذلك السجلات والذاكرة المشتركة وفتحات كتلة الخيوط وفتحات الخيوط. يتم تقسيم هذه الموارد ديناميكيًا بين الخيوط بناءً على متطلباتها وحدود وحدة معالجة الرسومات. على سبيل المثال، في Nvidia H100، يمكن لكل وحدة معالجة مركزية التعامل مع 32 كتلة و64 تشوهًا (أي 2048 خيطًا) و1024 خيطًا لكل كتلة. إذا أطلقنا شبكة بحجم كتلة يبلغ 1024 خيطًا، فستقوم وحدة معالجة الرسومات بتقسيم فتحات الخيوط المتاحة البالغ عددها 2048 إلى كتلتين.
التقسيم الديناميكي مقابل التقسيم الثابت: يسمح التقسيم الديناميكي باستخدام أكثر فعالية لموارد الحوسبة في وحدة معالجة الرسوميات. إذا قارنا هذا بنظام التقسيم الثابت حيث تتلقى كل كتلة خيطية كمية ثابتة من موارد التنفيذ، فقد لا يكون دائمًا الأكثر كفاءة. في بعض الحالات، قد يتم تخصيص موارد أكثر للخيوط مما تحتاجه، مما يؤدي إلى إهدار الموارد وتقليل الإنتاجية.
الآن، دعنا نلقي نظرة على مثال لنرى كيف يمكن لتخصيص الموارد أن يؤثر على إشغال SM. إذا استخدمنا حجم كتلة يبلغ 32 خيطًا ونحتاج إلى إجمالي 2048 خيطًا، فسيكون لدينا 64 من هذه الكتل. ومع ذلك، لا يمكن لكل SM التعامل إلا مع 32 كتلة في المرة الواحدة. لذا، على الرغم من أن SM يمكنه تشغيل 2048 خيطًا، إلا أنه سيشغل 1024 خيطًا فقط في المرة الواحدة، مما يؤدي إلى معدل إشغال بنسبة 50%.
على نحو مماثل، يحتوي كل SM على 65536 سجلاً. لتشغيل 2048 خيطًا في وقت واحد، يمكن أن يحتوي كل خيط على 32 سجلاً كحد أقصى (65536/2048 = 32). إذا احتاجت النواة إلى 64 سجلاً لكل خيط، فيمكننا فقط تشغيل 1024 خيطًا لكل SM، مما يؤدي مرة أخرى إلى إشغال بنسبة 50%.
التحدي الذي يواجهه الإشغال دون المستوى الأمثل هو أنه قد لا يوفر التسامح اللازم للزمن الكامن أو معدل الإنتاجية الحوسبية المطلوب للوصول إلى الأداء الأقصى للأجهزة.
إن إنشاء نوى وحدة معالجة الرسوميات بكفاءة يعد مهمة معقدة. يجب علينا تخصيص الموارد بحكمة للحفاظ على معدل إشغال مرتفع مع تقليل زمن الوصول إلى أدنى حد. على سبيل المثال، قد يؤدي وجود العديد من السجلات إلى تشغيل التعليمات البرمجية بسرعة ولكن قد يقلل من معدل الإشغال، لذا فإن تحسين التعليمات البرمجية بعناية أمر مهم.
أتفهم أن استيعاب العديد من المصطلحات والمفاهيم الجديدة أمر شاق. دعنا نلخص النقاط الرئيسية لمراجعة سريعة.
- تتكون وحدة معالجة الرسوميات من عدة معالجات متعددة متدفقة (SM)، حيث يحتوي كل SM على عدة أنوية معالجة.
- توجد ذاكرة عالمية خارج الشريحة، وهي عبارة عن HBM أو DRAM. وهي بعيدة عن وحدات SM الموجودة على الشريحة وتتمتع بزمن وصول مرتفع.
- توجد ذاكرة تخزين مؤقتة L2 خارج الشريحة وذاكرة تخزين مؤقتة L1 على الشريحة. تعمل ذاكرات التخزين المؤقت L1 وL2 هذه بشكل مشابه لكيفية عمل ذاكرات التخزين المؤقت L1/L2 في وحدات المعالجة المركزية.
- توجد كمية صغيرة من الذاكرة المشتركة القابلة للتكوين على كل وحدة SM. ويتم تقاسم هذه الذاكرة بين النوى. عادةً، تقوم الخيوط داخل كتلة خيط بتحميل جزء من البيانات في الذاكرة المشتركة ثم إعادة استخدامها بدلاً من تحميلها مرة أخرى من الذاكرة العالمية.
- تحتوي كل وحدة SM على عدد كبير من السجلات، والتي يتم تقسيمها بين الخيوط وفقًا لمتطلباتها. تحتوي وحدة Nvidia H100 على 65,536 سجلاً لكل وحدة SM.
- لتنفيذ نواة على وحدة معالجة الرسوميات، نطلق شبكة من الخيوط. تتكون الشبكة من كتلة خيوط واحدة أو أكثر وتتكون كل كتلة خيوط من خيط واحد أو أكثر.
- تقوم وحدة معالجة الرسوميات بتعيين كتلة واحدة أو أكثر للتنفيذ على SM اعتمادًا على توفر الموارد. يتم تعيين وتنفيذ جميع خيوط كتلة واحدة على نفس SM. هذا للاستفادة من موقع البيانات والمزامنة بين الخيوط.
- يتم تجميع الخيوط المخصصة لوحدة المعالجة المركزية في أحجام 32، وهو ما يسمى بالتشوه. تنفذ جميع الخيوط داخل التشويه نفس التعليمات في نفس الوقت، ولكن على أجزاء مختلفة من البيانات (SIMT). (على الرغم من أن الأجيال الأحدث من وحدات معالجة الرسومات تدعم أيضًا جدولة الخيوط المستقلة.)
- تقوم وحدة معالجة الرسوميات بتقسيم الموارد بشكل ديناميكي بين الخيوط بناءً على متطلبات كل خيط وحدود SM. يحتاج المبرمج إلى تحسين الكود بعناية لضمان أعلى مستوى من شغل SM أثناء التنفيذ.
تُستخدم وحدات معالجة الرسوميات على نطاق واسع اليوم، ولكن بنيتها ونموذج تنفيذها يختلفان اختلافًا جوهريًا عن وحدات المعالجة المركزية. في هذه المقالة، قمنا بتغطية جوانب مختلفة من وحدات معالجة الرسوميات، بما في ذلك بنيتها ونموذج تنفيذها. إذا كنت مهتمًا بمعرفة ما يجعل وحدات معالجة الرسوميات مطلوبة للغاية وكيف تعمل، آمل أن تكون هذه المقالة قد قدمت بعض الأفكار القيمة.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.