la creación de matrices en el kernel de NVIDIA CUDA
Pregunta
Hola Sólo quería saber si es posible hacer lo siguiente en el interior del núcleo NVIDIA CUDA
__global__ void compute(long *c1, long size, ...)
{
...
long d[1000];
...
}
o el siguiente
__global__ void compute(long *c1, long size, ...)
{
...
long d[size];
...
}
Solución
Puede hacer el primer ejemplo, no he probado el segundo.
Sin embargo, si puede evitarlo, es posible que desee volver a diseñar su programa no hacerlo. Usted no quiere asignar 4000 bytes de memoria en su núcleo. Que dará lugar a una gran cantidad de uso de CUDA memoria local, ya que no será capaz de poner todo en registros. CUDA memoria local es lenta (400 ciclos de latencia de la memoria).
Otros consejos
Se puede hacer # 1, pero cuidado con esto se hará en hilo de TODOS!
Su segundo fragmento no va a funcionar, porque la asignación de memoria dinámica en tiempo de ejecución del kernel no es compatible.
Puede asignar memoria compartida dinámicamente cuando se inicia el kernel.
__global__ void compute(long *c1, long size, ...)
{
...
extern __shared__ float shared[];
...
}
compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );
guía de programación CUDA:
el tamaño de la matriz se determina en tiempo de lanzamiento (véase la Sección 4.2.3).
asignación de memoria dinámica en tiempo de ejecución del kernel es compatible, por ejemplo comprobar el SDK, nueva eliminación.