الدرس 8: حلقات grid-stride و N الاعتباطي
حتى الآن افترضنا أن كل thread يعالج عنصرًا واحدًا، مع if (i < n) الذي يحرس الحدود. لكن ماذا يحدث عندما يكون n أكبر من عدد الـ threads التي أطلقناها؟ مع مليون عنصر و262,144 threads فقط، لا يُحسَب نصف المصفوفة أبدًا. الحل هو حلقة grid-stride: كل thread يبدأ من مؤشره العام (global index)، ثم يقفز إلى ا
تخيّل 100 كرسي لترتيبها لكن لديك 10 مساعدين فقط. بدلًا من أن يرتّب كل واحد كرسيًا واحدًا ثم يذهب إلى بيته، يبدأ كل مساعد من كرسيه ويقفز 10 كراسٍ إلى الأمام في كل مرة: 1، 11، 21... وهكذا يغطّي 10 أشخاص كل الكراسي الـ 100.
- حلقة grid-stride
- نمط يعالج فيه كل thread عدة عناصر، قافزًا بينها بمقدار حجم الشبكة (grid) بأكملها حتى يتجاوز المؤشر n.
- الخطوة (stride)
- المسافة التي يقفزها المؤشر إلى الأمام: blockDim.x * gridDim.x، أي إجمالي عدد الـ threads في الشبكة (grid).
- gridDim
- عدد الـ blocks في الشبكة (grid). gridDim.x * blockDim.x يعطي إجمالي الـ threads على طول بُعد واحد.
- N اعتباطي
- مدخل بأي حجم، حتى وإن كان أكبر من عدد الـ threads. تغطّيه حلقة grid-stride دون تغيير تهيئة الإطلاق.