2012-09-06 11 views
8

Para mi desarrollo CUDA, estoy usando una máquina con 16 núcleos y 1 GTX 580 GPU con 16 SM. Para el trabajo que estoy haciendo, planeo lanzar 16 subprocesos de host (1 en cada núcleo) y 1 lanzamiento de kernel por subproceso, cada uno con 1 bloque y 1024 subprocesos. Mi objetivo es ejecutar 16 kernels en paralelo en 16 SM. ¿Es esto posible/factible?Múltiples hilos de host que inician kernels CUDA individuales

He intentado leer todo lo posible sobre contextos independientes, pero parece que no hay demasiada información disponible. Según lo entiendo, cada subproceso de host puede tener su propio contexto de GPU. Pero no estoy seguro de si los kernels se ejecutarán en paralelo si utilizo contextos independientes.

Puedo leer todos los datos de los 16 hilos de host en una estructura gigante y pasarlos a la GPU para ejecutar un kernel. Sin embargo, será demasiada copia y ralentizará la aplicación.

+0

Los contextos múltiples no pueden usar simultáneamente una sola GPU, por lo que no, esto no funcionará. – talonmies

+0

Gracias. ¿Pueden poner lo anterior como una respuesta para poder aceptarlo? – gmemon

+0

@gmemon, consulte mi comentario a continuación para crear y ejecutar múltiples contextos en CUDA 5.5. ¿Has ejecutado con éxito 16 kernels en 16SM? ¿Cuál fue tu solución finalmente? – Tariq

Respuesta

4

Mientras que una aplicación de subprocesos múltiples puede contener varios contextos CUDA simultáneamente en la misma GPU, esos contextos no pueden realizar operaciones al mismo tiempo. Cuando está activo, cada contexto tiene un uso exclusivo de la GPU y debe ceder antes de que otro contexto (que podría incluir operaciones con una API de procesamiento o un administrador de visualización) pueda tener acceso a la GPU.

Así que, en una palabra, esta estrategia no puede funcionar con ninguna versión o hardware CUDA.

+0

Estoy usando CUDA 5.5. ¿Admite la ejecución concurrente de múltiples contextos CUDA en una sola GPU? – Tariq

+0

Estoy creando dos hilos separados en el host y creo el contexto CUDA usando la API del controlador. Este contexto se está ejecutando al mismo tiempo en CUDA 5.5. – Tariq

6

Solo puede tener un contexto en una GPU a la vez. Una forma de lograr el tipo de paralelismo que requiere sería usar transmisiones CUDA. Puede crear 16 streams dentro del contexto e iniciar memcopies y kernels en streams por nombre. Puede leer más en un seminario web rápido sobre el uso de transmisiones en: http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf. La referencia completa de API se encuentra en los manuales de herramientas de CUDA. El manual de CUDA 4.2 está disponible en http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_Toolkit_Reference_Manual.pdf.

Cuestiones relacionadas