الدرس 12: معالجة الأخطاء والمزامنة
تُعيد كل استدعاءات CUDA Runtime تقريبًا قيمة من النوع cudaError_t. عندما يكون كل شيء على ما يرام تكون القيمة cudaSuccess، وقيمتها العددية 0؛ وأي قيمة أخرى تشير إلى خطأ. نقطة جوهرية: إطلاق kernel باستخدام <<<>>> غير متزامن — فهو يعود إلى host فورًا، قبل أن ينتهي kernel (وأحيانًا حتى قبل أن يبدأ). لذل
إرسال kernel إلى GPU يشبه إسقاط رسالة في صندوق البريد: في اللحظة التي تُسقطها فيها، تصبح حرًا في المتابعة — لكنك لا تعرف بعد إن كانت قد وصلت. يتحقق cudaGetLastError مما إذا كان العنوان على المظروف صالحًا (خطأ وقت الإرسال)، وcudaDeviceSynchronize يشبه انتظار تأكيد التسليم الذي يخبرك إن كان قد حدث خطأ ما في الطريق.
- cudaError_t
- النوع الذي تُعيده كل استدعاءات CUDA تقريبًا. cudaSuccess (القيمة 0) يعني النجاح؛ وأي قيمة أخرى هي خطأ.
- cudaGetLastError
- يُعيد آخر رمز خطأ ويصفّره. يُستدعى مباشرة بعد إطلاق kernel لالتقاط أخطاء الإطلاق.
- cudaDeviceSynchronize
- يحجب host حتى ينهي GPU كل العمل، ويُعيد الأخطاء التي حدثت أثناء تنفيذ kernel.
- إطلاق غير متزامن
- إطلاق kernel يعود إلى host فورًا، قبل أن ينتهي kernel. لذلك لا يستطيع سطر الإطلاق الإبلاغ عن أخطاء زمن التشغيل.