الدرس 3: أول kernel لك — __global__ و<<<>>>
حتى الآن كان الـGPU مجرد فكرة — آلاف العمّال الصغار في انتظار مهمة؛ والآن نمنحهم أول عمل لهم. الكود الذي يشغّله كل عامل على الـGPU يُسمّى kernel: دالة صغيرة واحدة يشغّلها جميع الـthreads معًا، كلٌّ على بياناته الخاصة. تُعلِّمها بالكلمة المفتاحية __global__، وهي تُرجِع void دائمًا، وتُطلقها من الـCPU
الـkernel أشبه بوصفة تُعلّقها على لوحة إعلانات مطبخ عملاق. أنت (الـCPU) لا تطبخ — أنت فقط تعلّق الوصفة وتنادي <<<2 طاولات، 4 طهاة>>>. يبدأ الطهاة الثمانية العمل، وتمضي أنت لتفعل شيئًا آخر دون انتظار انتهائهم.
- __global__
- يُعلِّم kernel: دالة تعمل على الـGPU وتُطلَق من الـCPU. تُرجِع void دائمًا.
- صيغة الإطلاق <<<>>>
- الصيغة kernel<<<numBlocks, threadsPerBlock>>>(args) التي تحدّد كم عدد الـblocks وكم عدد الـthreads في كل block.
- grid وblock
- الـblock مجموعة من الـthreads؛ والـgrid مجموعة الـblocks لإطلاق واحد. إجمالي الـthreads = numBlocks مضروبًا في threadsPerBlock.
- الإطلاق غير المتزامن
- لا ينتظر الـCPU انتهاء الـkernel؛ بل يواصل فورًا. تلزم مزامنة صريحة قبل قراءة النتائج.