إنشاء صفائف في نفيديا كودا kernel
سؤال
مرحبًا ، أردت فقط أن أعرف ما إذا كان من الممكن القيام بما يلي داخل نفيديا كودا 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.