استخدام cuBLAS GEMM على النحو الصحيح
المقابض، وترتيب الأعمدة، والأبعاد البادئة
استخدام cuBLAS GEMM على النحو الصحيح درس مجاني في CUDA Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CUDA Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CUDA Academy 4 دروس في المجموع.
استفد من خبرة NVIDIA
من الصعب كتابة matmul سريع يدويًا. توفر cuBLAS عملية GEMM مجرّبة وموثوقة تستخلص من وحدة GPU أداءً قريبًا من ذروتها. 🚀
ما معنى GEMM؟
اختصار GEMM يعني ضرب مصفوفة عامة في مصفوفة. وتحسب العملية C = alpha * A * B + beta * C، وهي أساس الرسومات والتعلم العميق.
C = alpha * (A * B) + beta * Cكل استدعاء يحتاج إلى مقبض
تحفظ cuBLAS حالتها في مقبض. أنشئه عند بدء التشغيل، وأعد استخدامه في كل استدعاء، ثم دمّره في النهاية.
cublasHandle_t h;
cublasCreate(&h);
// ... use h ...
cublasDestroy(h);مفاجأة الترتيب العمودي
تتوقع cuBLAS مصفوفات مرتبة عموديًا، وفق تخطيط Fortran. أما مصفوفات C++ فتكون عادةً مرتبة صفّيًا، ولذلك يربك هذا الاختلاف الجميع تقريبًا.
البعد الرئيسي
يخبر البعد الرئيسي cuBLAS بالخطوة الفاصلة بين الأعمدة في الذاكرة. وبالنسبة إلى مصفوفة مرتبة عموديًا بحجم M في N ومعبأة بإحكام، فإنه يساوي M ببساطة.
int lda = M; // rows, column-major strideحيلة التبديل
حل أنيق: ضرب A في B بترتيب الصفوف يساوي منقول ضرب B في A بترتيب الأعمدة. يكتفي كثيرون بتبديل المعاملين بدلًا من نقل البيانات.
تعيش القيم العددية في alpha و beta
تمرّر alpha وbeta كمؤشرين. استخدم alpha = 1 وbeta = 0 للحصول على C = A * B عادي من دون إضافة أي شيء.
const float alpha = 1.0f, beta = 0.0f;استدعاء cublasSgemm
cublasSgemm هو GEMM للأعداد العشرية أحادية الدقة. وقائمة الوسائط الطويلة الخاصة به ليست سوى الأبعاد، وأعلام النقل، والقيم العددية، والمؤشرات الثلاثة إلى ذاكرة الجهاز.
cublasSgemm(h, CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K, &alpha, dA, M, dB, K, &beta, dC, M);يجب أن تكون المؤشرات في الجهاز
تشير dA وdB وdC إلى ذاكرة الجهاز. إذا مرّرت مؤشرات المضيف عن طريق الخطأ، يعيد cuBLAS خطأً بدلًا من نتيجة.
اختر لاحقة الدقة
يحدّد الحرف النوع: S لـ float، وD لـ double، وC وZ للأنواع المركبة. اختر Dgemm عندما تحتاج إلى دقة مزدوجة.
cublasDgemm(...); // double precision GEMMتحقّق من حالة الإرجاع
يعيد كل استدعاء لـ cuBLAS قيمة من النوع cublasStatus_t. قارنها بـ CUBLAS_STATUS_SUCCESS حتى لا يمرّ مقبض أو بُعد غير صحيح من دون ملاحظة.
if (status != CUBLAS_STATUS_SUCCESS) { /* handle */ }تحقّق سريع
فكّر في تخطيط البيانات الذي يفترضه cuBLAS.
مراجعة
أنشأت handle، والتزمت بتخطيط ترتيب الأعمدة والأبعاد الرائدة، وضبطت alpha وbeta، واستدعيت Sgemm باستخدام مؤشرات إلى ذاكرة الجهاز. 🎯
تعلم C++ مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «استخدام cuBLAS GEMM على النحو الصحيح» مجاني؟
نعم — نص درس «استخدام cuBLAS GEMM على النحو الصحيح» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة CUDA Academy، انتقل إلى CoddyKit PRO. تتضمن دورة CUDA Academy 4 دروس في المجموع.
ماذا ستتعلم في «استخدام cuBLAS GEMM على النحو الصحيح»؟
المقابض، وترتيب الأعمدة، والأبعاد البادئة تتمرن على CUDA Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ CUDA Academy؟
لا تُشترط خبرة سابقة. CUDA Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «استخدام cuBLAS GEMM على النحو الصحيح»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس CUDA Academy هذا؟
نعم. كل درس في CUDA Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استخدام cuBLAS GEMM على النحو الصحيح
- متجهات وتحويلات Thrust
- Reduce وScan وSort في Thrust
- cuDNN للتعلّم العميق