2011-07-25 19 views
5

Estoy utilizando una aplicación actualmente que genera un montón de pthreads (linux), y cada uno de ellos crea su propio contexto CUDA. (usando cuda 3.2 ahora mismo).CUDA streams and context

El problema que estoy teniendo es que parece que cada hilo que tiene su propio contexto cuesta mucha memoria en la GPU. Algo así como 200 MB por hilo, así que esto realmente me limita.

¿Puedo simplemente crear streams en el hilo del host, pasar la referencia de flujo a los hilos de trabajo, que luego podrían pasar a mi biblioteca CUDA su número de flujo, y todo funciona fuera del mismo contexto?

¿Un subproceso de trabajador conoce automáticamente el mismo contexto CUDA que su subproceso principal?

Gracias

Respuesta

6

Cada contexto CUDA es el costo de un poco de memoria del dispositivo y sus recursos están divididos estrictamente el uno del otro. Por ejemplo, la memoria del dispositivo asignada en el contexto A no puede ser accedida por el contexto B. Las transmisiones también son válidas solo en el contexto en el que fueron creadas.

La mejor práctica sería crear un contexto CUDA por dispositivo. De forma predeterminada, ese contexto CUDA solo se puede acceder desde el subproceso de la CPU que lo creó. Si desea acceder al contexto CUDA desde otros hilos, llame a cuCtxPopCurrent() para extraerlo del hilo que lo creó. Entonces, el contexto se puede insertar en la pila de contexto actual de cualquier otra CPU, y las llamadas CUDA posteriores harían referencia a ese contexto.

Context push/pop son operaciones ligeras y desde CUDA 3.2, se pueden hacer en aplicaciones de tiempo de ejecución CUDA. Así que mi sugerencia sería inicializar el contexto de CUDA, luego llamar a cuCtxPopCurrent() para hacer que el contexto "flote" a menos que algunos subprocesos quieran operarlo. Considere que el estado "flotante" es el natural: siempre que un hilo quiera manipular el contexto, corchetee su uso con cuCtxPushCurrent()/cuCtxPopCurrent().

+0

¿un PopCurrent() en realidad lo elimina de la "cola" que contiene el contexto, por lo que no es accesible para los otros hilos? ¿Puedo mostrar el contexto actual desde el hilo del host, y simplemente pasar ese contexto a los hilos de trabajo, y "empujarlo" a la pila de contexto? Parece que el contexto tendría que estar en una "cola concurrente" y tener un mutex, ¿verdad? – Derek

+0

Cuando se crea un contexto, se empuja a una pila de contexto actual. Al mostrar el contexto, deja de estar disponible para cualquier subproceso de la CPU hasta que se haya insertado en otra pila de contexto actual con cuCtxPushCurrent(). Entonces, el flujo de trabajo que describes es exactamente lo que la API fue diseñada para habilitar. Los contextos son seguros para subprocesos, por lo que la única sincronización adicional de subprocesos que debe implementar sería aplicar un orden u otra semántica según lo necesite su aplicación. – ArchaeaSoftware

+0

Estoy usando 'cuCtxSetCurrent (CUcontext ctx)' para cada hilo. ¿Esto necesita algo para dejarlo ir, de manera similar a ese pop después del empuje, cuando el hilo ya no necesita más contexto? –