نواة جمع المتجهات
يجمع كل خيط زوجًا واحدًا من العناصر.
نواة جمع المتجهات درس مجاني في CUDA Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CUDA Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CUDA Academy 4 دروس في المجموع.
الفكرة الأساسية
تُعدّ عملية جمع المتجهات النواة الأولى المثالية: فكل مخرج ليس إلا C[i] = A[i] + B[i]. وكل عنصر independent، لذا يمكن تشغيلها جميعًا في الوقت نفسه. 🚀
خيط واحد لكل عنصر
الفكرة كلها بسيطة: تعيّن one thread to one element. وبدلًا من تكرار المرور على المصفوفة، ينفّذ آلاف الخيوط عملية جمع واحدة بالتوازي.
وَسْمها كنواة
الدالة التي تعمل على GPU هي نواة، ويُشار إليها بالمؤهل __global__. تخبر هذه الكلمة nvcc بأن هذا الرمز سيُطلَق على الجهاز.
__global__ void vecAdd(const float* A, const float* B, float* C, int n) {
// body comes next
}تعيد النوى void
يكون نوع الإرجاع للنواة دائمًا void. فلا توجد قيمة إرجاع لإرسالها إلى CPU، ولذلك يجب كتابة النتائج في ذاكرة الجهاز بدلًا من ذلك.
العثور على فهرس هذا الخيط
يحسب كل خيط global index الخاص به ليعرف العنصر الذي سيتولى معالجته. وتجمع الصيغة التقليدية بين إحداثيات الكتلة والخيط.
int i = blockIdx.x * blockDim.x + threadIdx.x;وحدة العمل الواحدة
ما إن يعرف الخيط فهرسه i، يصبح العمل الفعلي سطرًا واحدًا. لا حلقة ولا تفرّع، بل عملية جمع واحدة لكل خيط.
C[i] = A[i] + B[i];لماذا يُعد فحص الحدود مهمًا
عادةً ما تطلق عددًا من الخيوط أكبر من عدد العناصر، لذا أضف حارسًا if (i < n). وبدونه، تقرأ الخيوط الإضافية بعد نهاية المصفوفة ويتعطل البرنامج. 🛡️
if (i < n) {
C[i] = A[i] + B[i];
}النواة الكاملة
عند جمع الأجزاء، لا تتجاوز نواة vecAdd الكاملة بضعة أسطر. إنها شيفرة صغيرة، لكنها تعمل على آلاف الخيوط في الوقت نفسه.
__global__ void vecAdd(const float* A, const float* B, float* C, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) C[i] = A[i] + B[i];
}توجد المؤشرات على الجهاز
يجب أن تشير المؤشرات A وB وC إلى device memory. فإذا مرّرت إلى النواة مؤشرًا عاديًا للمضيف، فستقرأ بيانات غير صحيحة أو تتسبب في خطأ.
عرّف المدخلات كـ const
لا تُقرأ A وB إلا للقراءة، لذا عرّفهما كـ const float*. يوثّق ذلك القصد، ويسمح للمصرّف بتحسين المدخلات للقراءة فقط بحرية أكبر.
لا حاجة إلى حالة مشتركة
بما أن كل خيط يتعامل مع عنصر different، فلا توجد حالات تسابق ولا حاجة إلى أقفال. وهذا الاستقلال هو تحديدًا ما يجعل GPU متألقة هنا.
تحقّق سريع
لماذا تحتاج نواة جمع المتجهات إلى الحارس if (i < n)؟
مراجعة
كتبت نواتك الأولى: __global__ void vecAdd، خيطًا لكل عنصر، وفهرسًا عامًا، وفحصًا للحدود. شيفرة بسيطة وتوازٍ هائل. 🎉
الأسئلة الشائعة
هل درس «نواة جمع المتجهات» مجاني؟
نعم — نص درس «نواة جمع المتجهات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة CUDA Academy، انتقل إلى CoddyKit PRO. تتضمن دورة CUDA Academy 4 دروس في المجموع.
ماذا ستتعلم في «نواة جمع المتجهات»؟
يجمع كل خيط زوجًا واحدًا من العناصر. تتمرن على CUDA Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ CUDA Academy؟
لا تُشترط خبرة سابقة. CUDA Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نواة جمع المتجهات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس CUDA Academy هذا؟
نعم. كل درس في CUDA Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نواة جمع المتجهات
- توصيل جانب المضيف
- التحقق من النتيجة على CPU
- قياس أول تسارع لك