سؤال

مرحبًا ، أردت فقط أن أعرف ما إذا كان من الممكن القيام بما يلي داخل نفيديا كودا kernel

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

أو ما يلي

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
هل كانت مفيدة؟

المحلول

يمكنك القيام بالمثال الأول ، لم أجرب الثانية.

ومع ذلك ، إذا تمكنت من مساعدته ، فقد ترغب في إعادة تصميم برنامجك بعدم القيام بذلك. لا تريد تخصيص 4000 بايت من الذاكرة في نواةك. سيؤدي ذلك إلى الكثير من استخدام الذاكرة المحلية CUDA ، لأنك لن تكون قادرًا على وضع كل شيء في السجلات. الذاكرة المحلية CUDA بطيئة (400 دورة من زمن انتقال الذاكرة).

نصائح أخرى

يمكنك القيام رقم 1 ، ولكن حذار سيتم القيام بذلك في كل موضوع!

لن يعمل المقتطف الثاني ، لأن تخصيص الذاكرة الديناميكية في وقت تشغيل kernel غير مدعوم.

يمكنك تخصيص الذاكرة المشتركة بشكل ديناميكي عند تشغيل kernel.

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

دليل برمجة CUDA:

يتم تحديد حجم الصفيف في وقت الإطلاق (انظر القسم 4.2.3).

يتم دعم تخصيص الذاكرة الديناميكية في وقت تشغيل kernel ، والتحقق من مثال SDK ، New Delete.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top