فك حلقات التكرار باستخدام #pragma unroll
خفّض كلفة الحلقات وأظهر ILP.
فك حلقات التكرار باستخدام #pragma unroll درس مجاني في CUDA Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CUDA Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CUDA Academy 4 دروس في المجموع.
للحلقات تكاليف خفية
ينفق كل تكرار في الحلقة عملًا على العداد والمقارنة والتفرع. وتُسمى هذه الأعمال التنظيمية loop overhead، وتتراكم في الحلقات الداخلية كثيرة التنفيذ.
ما الذي يفككه التكرار
ينسخ Loop unrolling جسم الحلقة عدة مرات في كل تكرار، وبذلك تُنفَّذ الحلقة مرات أقل. فتنجزون العمل نفسه مع عدد أقل من عمليات العد والتفرع.
for (int i = 0; i < n; i += 2) {
out[i] = in[i] * 2;
out[i + 1] = in[i + 1] * 2;
}دعوا المصرّف يتولى ذلك
تمنحكم CUDA تلميحًا حتى لا تضطروا إلى نسخ التعليمات يدويًا. ضعوا #pragma unroll مباشرةً قبل الحلقة، وسيقوم المصرّف بفكّها نيابةً عنكم.
#pragma unroll
for (int i = 0; i < 4; i++)
sum += a[i];اختيار معامل محدد
يمكنكم طلب مقدار محدد بكتابة رقم بعد التوجيه. يؤدي #pragma unroll 4 إلى فك الحلقة أربع تكرارات في كل مرة.
#pragma unroll 4
for (int i = 0; i < n; i++)
acc += w[i] * x[i];إيقاف فكّ الحلقة
أحيانًا يؤدي فك الحلقة بالكامل إلى تضخيم الشيفرة أو استهلاك السجلات. وتخبر #pragma unroll 1 المصرّف بترك الحلقة كما هي من دون فك.
#pragma unroll 1
for (int i = 0; i < n; i++)
process(i);تفيد أعداد التكرارات الثابتة
يعمل فك الحلقة بأفضل صورة عندما يكون عدد التكرارات معروفًا وقت الترجمة. إذ يتيح trip count ثابت للمصرّف نشر الحلقة بالكامل في شيفرة متسلسلة.
يكشف فك الحلقة عن ILP
غالبًا لا توجد تبعية بين التكرارات المنسوخة. وهذا يمنح المجدول مزيدًا من التعليمات independent لدمجها، فيخفي زمن الانتظار من دون تكلفة إضافية.
فروع أقل، ومسار أسرع
بعد فك الحلقة، تتحقق العتاد من condition الخروج مرات أقل. وتعني الفروع الأقل تدفقًا أكثر سلاسة وقدرة أكبر على التنبؤ بالتعليمات.
المقايضة المتعلقة بالسجلات
تعني زيادة القيم الحية في كل تكرار استخدام مزيد من register. وقد يؤدي فك الحلقة المكثف إلى تسريب السجلات وخفض الإشغالّية فعليًا، لذا لا يكون مفيدًا دائمًا.
يزداد حجم الشيفرة أيضًا
تزيد كل نسخة مفكوكة من حجم النواة. وقد تضغط الشيفرة الأكبر على instruction cache، لذا قد يؤدي فك الحلقات الكبيرة بالكامل إلى نتيجة عكسية على العتاد الفعلي.
قيسوا قبل الوثوق بالنتيجة
فك الحلقة اقتراح، وليس سحرًا. دعوا profiler دائمًا يؤكد أن المعامل المختار يجعل نواتكم تعمل أسرع فعلًا على وحدة GPU الخاصة بكم.
تحقق سريع
تريدون من المصرّف فك حلقة صغيرة وثابتة بالكامل. ماذا تكتبون؟
مراجعة: استبدال العد بالسرعة
تعلّمتم أن #pragma unroll يقلل تكلفة الحلقة ويكشف ILP، لكن عليكم مراقبة تكلفته من حيث السجلات وحجم الشيفرة. قيسوا كل معامل للتأكد. 🧩
تعلم C++ مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «فك حلقات التكرار باستخدام #pragma unroll» مجاني؟
نعم — نص درس «فك حلقات التكرار باستخدام #pragma unroll» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة CUDA Academy، انتقل إلى CoddyKit PRO. تتضمن دورة CUDA Academy 4 دروس في المجموع.
ماذا ستتعلم في «فك حلقات التكرار باستخدام #pragma unroll»؟
خفّض كلفة الحلقات وأظهر ILP. تتمرن على CUDA Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ CUDA Academy؟
لا تُشترط خبرة سابقة. CUDA Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «فك حلقات التكرار باستخدام #pragma unroll»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس CUDA Academy هذا؟
نعم. كل درس في CUDA Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التوازي على مستوى التعليمات
- فك حلقات التكرار باستخدام #pragma unroll
- التحميلات المتجهة باستخدام float4
- ضغط السجلات وعمليات التفريغ