2011-03-09 26 views
5

¿Es posible asignar dinámicamente memoria en la memoria global de una GPU dentro del Kernel?
No sé cuán grande será mi respuesta, por lo tanto, necesito una forma de asignar memoria para cada parte de la respuesta. CUDA 4.0 nos permite usar la RAM ... ¿es una buena idea o reducirá la velocidad?Memoria de asignación dinámica en la GPU

Respuesta

10

es posible usar malloc dentro de un kernel. comprobar lo siguiente que se toma de guía NVIDIA CUDA:

__global__ void mallocTest() 
{ 
    char* ptr = (char*)malloc(123); 
    printf(“Thread %d got pointer: %p\n”, threadIdx.x, ptr); 
    free(ptr); 
} 
void main() 
{ 
    cudaThreadSetLimit(cudaLimitMallocHeapSize, 128*1024*1024); 
    mallocTest<<<1, 5>>>(); 
    cudaThreadSynchronize(); 
} 

will output: 
Thread 0 got pointer: 00057020 
Thread 1 got pointer: 0005708c 
Thread 2 got pointer: 000570f8 
Thread 3 got pointer: 00057164 
+0

@ scatman: Supongo que la memoria asignada estará en el dispositivo una vez que llame a malloc dentro de un kernel ... ¿Estoy en lo cierto? – Manolete

+0

Dado que una CPU no puede malloc tan rápido como 2048 núcleos de gtx980, sospecho que se asigna en gpu. de lo contrario, sería solo para gpus integrado no discreto. –

1

De CUDA 4.0 usted será capaz de utilizar new y delete operadores de C++ en lugar de malloc y free de c.

Cuestiones relacionadas