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
¿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
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
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? –