algorithm - for - Compactación CUDA Stream: entendiendo el concepto
cuda reference (1)
Primero, la asignación de memoria dinámica es posible en CUDA en Compute Capability 2.0 y dispositivos superiores. La biblioteca de tiempo de ejecución de CUDA admite funciones malloc / free y new / delete en __device__
. Pero eso no está relacionado con la respuesta, realmente.
Por lo general, se proporciona una matriz de salida lo suficientemente grande (preasignada, a menudo del mismo tamaño que la matriz de entrada) y la salida se escribe en ella. No se requiere asignación dinámica, pero potencialmente hay desperdicio de almacenamiento. Esto es lo que hacen CUDPP y thrust. Una alternativa sería realizar un conteo de elementos válidos primero, luego asignar la memoria GPU de salida dinámicamente usando cudaMalloc llamado desde la CPU del host.
Estoy usando CUDA / Thrust / CUDPP. Según tengo entendido, en la compactación de Stream, ciertos elementos de una matriz se marcan como no válidos y luego se eliminan.
Ahora, ¿qué significa realmente "eliminación" aquí? Supongamos que el conjunto original A
tiene una longitud 6. Si 2 elementos no son válidos (por cualquier condición que podamos proporcionar), entonces
¿El sistema crea una nueva matriz de tamaño 4 en la memoria GPU para almacenar los elementos válidos para obtener el resultado final?
O ¿elimina físicamente los elementos inválidos de la memoria y reduce la matriz original A al tamaño 4 manteniendo solo los elementos válidos?
En cualquier caso, ¿no significa eso que la asignación de memoria dinámica está sucediendo bajo el capó? Pero escuché que la asignación de memoria dinámica no es posible en el mundo de CUDA.