0Pricing
CUDA Academy · درس

الذاكرة المشتركة الديناميكية

حدّد حجم الذاكرة المشتركة وقت التشغيل.

الذاكرة المشتركة الديناميكية درس مجاني في CUDA Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CUDA Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CUDA Academy 4 دروس في المجموع.

عندما لا يكون الحجم معروفًا بعد

أحيانًا يعتمد حجم المصفوفة المشتركة على قيمة وقت التشغيل، ولذلك لا يمكنكم تثبيته مسبقًا في الشيفرة. تحل CUDA هذه المشكلة باستخدام الذاكرة المشتركة الديناميكية.

تصريح extern

تُصرّحون عنها باستخدام extern __shared__ وأقواس مربعة فارغة. لا يُكتب أي حجم في الشيفرة، لذلك يتركه المصرّف مفتوحًا.

extern __shared__ float sdata[];

تحديد الحجم عند الإطلاق

تمرّرون عدد البايتات باعتباره المعامل الثالث للإطلاق، بين عدد الخيوط والأقواس الختامية. وهكذا يُحدَّد الحجم في وقت التشغيل.

kern<<<blocks, threads, n * sizeof(float)>>>();

الحجم دائمًا بالبايتات

خطأ شائع: ذلك المعامل الثالث يحدد الحجم بوحدة البايتات، وليس عدد العناصر. احرصوا دائمًا على ضرب العدد في sizeof للحصول على القيمة الصحيحة.

القيمة الافتراضية صفر بايت

إذا تخطيتم المعامل الثالث، تحجز CUDA مقدار صفر بايت من الذاكرة المشتركة الديناميكية. عندئذٍ تصبح قراءة sdata سلوكًا غير معرّف، فلا تنسوه أبدًا.

استخدام الذاكرة الساكنة والديناميكية معًا

يمكنكم استخدام النوعين في kernel واحد. تحتفظ المصفوفات الساكنة بأحجام ثابتة، بينما يتكيف الجزء الديناميكي مع معامل الإطلاق.

مخزن واحد، ومصفوفات عديدة

تمنحكم الذاكرة المشتركة الديناميكية مخزنًا مسطحًا واحدًا. ولتخزين عدة مصفوفات، تقسّمونه بأنفسكم باستخدام إزاحات المؤشرات. 🔪

التقسيم باستخدام الإزاحات

وجّهوا المصفوفة الثانية إلى موضع يقع داخل المخزن. واحرصوا فقط على محاذاة كل جزء حتى لا يبدأ float في منتصف كلمة.

extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];

لماذا نستخدم الذاكرة الديناميكية؟

تتيح لكم استخدام kernel واحد مُصرَّف مع أحجام بلاطات عديدة. ويمكنكم ضبط حجم الذاكرة المشتركة عند كل إطلاق من دون إعادة التصريف لكل حالة.

انتبهوا إلى حد العتاد

لا يزال ممنوعًا تجاوز الحد الأقصى لكل كتلة. إذا طلبتم عددًا كبيرًا جدًا من البايتات عند الإطلاق، فسيفشل kernel ببساطة في البدء.

تفعيل التخصيصات الكبيرة

لتجاوز الحد الافتراضي في وحدات GPU الأحدث، يجب عليكم تفعيل الخيار صراحةً باستخدام cudaFuncSetAttribute قبل الإطلاق. وإلا فستُرفض الطلبات الكبيرة.

تحقق سريع

لنتحقق من كيفية تحديد حجم الذاكرة المشتركة الديناميكية.

مراجعة

تعلّمتم أن مصفوفات extern __shared__ تحصل على حجمها بالبايت عند الإطلاق، ويمكن تقسيمها إلى عدة مصفوفات، مع الالتزام بالحد الأقصى لكل كتلة. اكتمل المقرر! 🎉

الأسئلة الشائعة

هل درس «الذاكرة المشتركة الديناميكية» مجاني؟

نعم — نص درس «الذاكرة المشتركة الديناميكية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف مصفوفات __shared__
  2. المزامنة باستخدام __syncthreads
  3. تجنّب تعارضات البنوك
  4. الذاكرة المشتركة الديناميكية
← العودة إلى CUDA Academy