الدرس 29: عرض النطاق والكثافة الحسابية
كل kernel ينجز نوعين من العمل: الحساب (عمليات الفاصلة العائمة، FLOPs) ونقل البيانات (البايتات من الذاكرة وإليها). مقياسان بسيطان يتيحان لنا فهم ما يهم. الأول هو عرض النطاق (bandwidth): كم بايت تنقله الذاكرة في الثانية. نحسبه بقسمة البايتات على الزمن، ونحوّله إلى GB في الثانية بالقسمة على 1e9. مثلاً،
تخيّل شاحنة توصّل الطوب إلى بنّاء: عرض النطاق هو كم طوبة توصّلها الشاحنة في الدقيقة، والكثافة هي مقدار العمل الذي يبذله البنّاء في كل طوبة. عندما تكون الكثافة منخفضة، يظل البنّاء منتظراً الشاحنة دائماً — الذاكرة هي عنق الزجاجة. وعندما تكون الكثافة عالية، تنتظر الشاحنة البنّاء — الحساب هو عنق الزجاجة.
- عرض النطاق (GB/s)
- البايتات التي تنقلها الذاكرة في الثانية. تُحسب بقسمة البايتات على الزمن، وتُحوَّل إلى GB/s بالقسمة على 1e9.
- الكثافة الحسابية (FLOP/byte)
- عدد FLOPs المنفَّذة مقسوماً على البايتات المنقولة من الذاكرة. منخفضة = مقيّد بالذاكرة (memory-bound)؛ عالية = مقيّد بالحوسبة (compute-bound).
- مقيّد بالذاكرة (memory-bound)
- kernel ذو كثافة منخفضة يحكم زمنَ تشغيله عرضُ النطاق. لتسريعه تقلّل البايتات، لا أن تضيف FLOPs.
- مقيّد بالحوسبة (compute-bound)
- kernel ذو كثافة عالية يحكم زمنَ تشغيله وحدات الحساب، فلا تكون الذاكرة عنق الزجاجة.