الدرس 11: تباعد الـ warp
الـ warp هو مجموعة من 32 thread تنفّذ الأمر نفسه معاً (lockstep) ضمن نموذج SIMT. طالما اتّبع كل thread في الـ warp المسار البرمجي نفسه، تشغّلها العتاد معاً في خطوة واحدة. لكن ماذا يحدث عندما يرسل if/else بعض الـ threads إلى فرع if وأخرى إلى فرع else؟ هذا هو تباعد الـ warp (warp divergence): لا يستطي
تخيّل جوقة من 32 مغنياً يجب أن يغنّوا النغمة نفسها في كل لحظة. إذا احتاج النصف إلى غناء 'la' والنصف 'do'، يدع القائد أولاً جميع مغنّي 'la' يغنّون (والبقية يصمتون) ثم جميع مغنّي 'do'. يستغرق ذلك ضعف الوقت. لكن إذا غنّت جوقة كاملة 'la' وغنّت جوقة ثانية كاملة 'do'، تغنّيان معاً دفعة واحدة دون أي هدر.
- تباعد الـ warp (warp divergence)
- عندما تسلك threads في الـ warp نفسه فروع if/else مختلفة، فيشغّل العتاد المسارات على التوالي — الزمن هو مجموع المسارات.
- lockstep
- جميع الـ 32 thread في الـ warp تنفّذ الأمر نفسه في الخطوة نفسها. هذا أساس SIMT.
- التقنيع/predication
- عندما تكون بعض الـ threads فقط في فرع نشطة، تكون البقية مُقنّعة: تشغّل الأمر نفسه لكنها لا تكتب نتيجة.
- فرع متجانس (uniform branch)
- شرط تقيّمه جميع الـ threads في الـ warp بالطريقة نفسها (مثلاً حسب warpId)، فلا يوجد تباعد ولا عقوبة.