الاختزال النهائي متعدد الكتل
ادمج المجاميع الجزئية لكل كتلة.
الاختزال النهائي متعدد الكتل درس مجاني في CUDA Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CUDA Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CUDA Academy 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Blocks Cannot Talk
A reduction within a block is easy, but blocks run independently and cannot synchronize with each other mid-kernel. So one launch cannot sum everything.
Each Block Produces a Partial
So every block reduces its own chunk to one number, a partial sum, and writes it to a small output array indexed by blockIdx.
if (tid == 0)
out[blockIdx.x] = data[0];Now You Have Fewer Values
With 1000 blocks you go from a million inputs to 1000 partials. The hard part is done; only a tiny array remains to combine.
Strategy One: Launch Again
The simplest finish is a second launch of the same kernel on the partials. Repeat until only one value is left.
Recursive Until One
Each pass shrinks the array by the block size. A few recursive launches reduce millions down to a single final sum.
Strategy Two: Atomics
Alternatively, thread 0 of each block can add its partial straight into one global total with atomicAdd, avoiding a second kernel.
if (tid == 0)
atomicAdd(total, data[0]);Atomics Trade Off
Atomics are simple and need only one launch, but many blocks contending on the same address can serialize. With few partials it is usually fine.
Strategy Three: Grid-Stride
A grid-stride loop lets each thread first sum many elements into a register, so far fewer blocks are needed before the final step.
for (int i = gid; i < n; i += gridDim.x * blockDim.x)
sum += in[i];Fewer Blocks, Less Overhead
Doing more work per thread up front means fewer partials and fewer launches. This often beats spawning one thread per element.
Zero the Total First
If you use atomics, remember to zero the global total before launching, or your sum starts from garbage left in that memory.
Pick by Problem Size
Small inputs love atomics for their simplicity; huge inputs favor a two-pass or grid-stride design. Measure on your data to choose.
Quick Check
Think about why a single kernel launch cannot sum the whole array directly.
Recap
Blocks each emit a partial sum, then you combine them with a second launch, atomics, or grid-stride. You can now reduce arrays of any size. 🏁
الأسئلة الشائعة
هل درس «الاختزال النهائي متعدد الكتل» مجاني؟
نعم — نص درس «الاختزال النهائي متعدد الكتل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة CUDA Academy، انتقل إلى CoddyKit PRO. تتضمن دورة CUDA Academy 4 دروس في المجموع.
ماذا ستتعلم في «الاختزال النهائي متعدد الكتل»؟
ادمج المجاميع الجزئية لكل كتلة. تتمرن على CUDA Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ CUDA Academy؟
لا تُشترط خبرة سابقة. CUDA Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الاختزال النهائي متعدد الكتل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس CUDA Academy هذا؟
نعم. كل درس في CUDA Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فكرة شجرة الاختزال
- القضاء على تفرّع Warp
- العنونة التسلسلية
- الاختزال النهائي متعدد الكتل