الدرس 4: تحديد حجم الشبكة — عدد كافٍ من الـ threads للـ N
يختبئ في كل عملية إطلاق على الـ GPU لغز عدّ صغير: لديك n عنصرًا لمعالجتها، لكن الـ threads تأتي في بلوكات ذات حجم ثابت — إذًا كم بلوكًا يلزم لتغطيتها جميعًا دون أن تفوت العناصر الأخيرة؟ هذا هو موضوع هذا الدرس: التأكد من وجود عدد كافٍ من الـ threads. أنت تعرف بالفعل كيف تُعرّف kernel وتُطلقه باستخدام
عليك نقل 1000 شخص في حافلات تتسع كل منها لـ 256 مقعدًا. 1000 مقسومًا على 256 يساوي حوالي 3.9، لكنك لا تستطيع طلب 3.9 حافلة — تحتاج إلى 4 حافلات كاملة، وإلا بقي الركاب الأخيرون خارجًا. صيغة السقف تُقرّب دائمًا لأعلى إلى حافلة كاملة. صحيح أن الحافلة الرابعة بها بعض المقاعد الفارغة — تلك هي الـ threads الإضافية التي تجلس بهدوء ببساطة.
- قسمة السقف
- قسمة تُقرّب دائمًا لأعلى. في الأعداد الصحيحة تُكتب على صورة (n + d - 1) / d للحصول على عدد المجموعات التي تُغطّي كل الـ n عنصرًا.
- threads لكل بلوك
- عدد الـ threads في كل بلوك (الرقم الثاني في <<<>>>). القيمة الشائعة هي 256. وهو المقام في صيغة عدد البلوكات.
- حجم الـ grid
- عدد البلوكات المُطلقة، numBlocks. يُختار بحيث يكون إجمالي الـ threads (numBlocks مضروبًا في threadsPerBlock) على الأقل n.
- حارس الحدود
- الشرط if (i < n) داخل الـ kernel الذي يجعل الـ threads الفائضة (تلك التي يتجاوز فهرسها n) تتجنب لمس الذاكرة.