2011-12-05 16 views
5

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.Compactación de corriente CUDA: entendiendo el concepto

Ahora, ¿qué significa realmente "eliminación" aquí? Supongamos que la matriz original A y tiene longitud 6. Si 2 elementos no son válidos (por cualquier condición que pueden proporcionar), entonces

  1. ¿El sistema de crear un nuevo matriz de tamaño 4 en GPU-memoria para almacenar la elementos válidos para obtener el resultado final?

  2. O ¿elimina físicamente los elementos no válidos de la memoria y reduce el conjunto original A hasta el tamaño 4 manteniendo solo los elementos válidos?

En cualquier caso, ¿no significa que la asignación de memoria dinámica está ocurriendo debajo del capó? Pero había oído que la asignación de memoria dinámica no es posible en el mundo CUDA.

+2

Existe otra posibilidad, que es que el tamaño de la asignación de memoria no cambia, y los primeros 4 elementos son válidos, los últimos 2 no están definidos. Pero, en realidad, esta pregunta se trata de cuestiones de implementación, y ¿quién puede decir que CUDPP o thrust funcionan de la misma manera? – talonmies

+0

ArrayFire es una opción mejor/más fácil que Thrust y también gratuita, al menos para el uso de una sola GPU. http://accelereyes.com/arrayfire – arrayfire

Respuesta

4

En primer lugar, 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 malloc/free y new/delete en las funciones __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.

+1

Eso no es lo que hace Thrust :) Los algoritmos de compactación en Thrust (por ejemplo, '' 'thrust :: copy_if''') normalmente solicitan un búfer de salida. –

+0

Gracias. Editado mi respuesta. ¿Qué sucede si el iterador de resultados apunta a una asignación que no es lo suficientemente grande? ¿Hay algún tamaño automático? – harrism

+0

No; si el iterador apunta a un buffer insuficiente, el comportamiento no está definido (es decir, se bloquea). –