2010-06-01 38 views
5

Estoy en una situación real. Por favor ayuda. Es urgente.No se puede matar el kernel defectuoso que se ejecuta en la GPU NVIDIA

Tengo un proceso de host que genera múltiples hilos de host (CPU) (pthreads). Estos hilos a su vez llaman al núcleo CUDA. Estos núcleos CUDA están escritos por usuarios externos. Por lo tanto, podría ser que los kernels malos ingresen al bucle infinito. Para superar esto, he puesto un tiempo de espera de 2 minutos que matará al hilo de la CPU correspondiente.

¿Matar el hilo de la CPU también matará al kernel que se ejecuta en la GPU? En cuanto a lo que he probado, no es así.

¿Cómo puedo matar a todos los hilos que se ejecutan actualmente en la GPU?

Editar: La razón por la que estoy usando subprocesos de CPU que llaman al núcleo es porque, el servidor tiene dos GPU de Tesla. Entonces, el hilo programará el kernel en el dispositivo GPU alternativamente.

Gracias, Arvind

Respuesta

0

Será matar el hilo de la CPU también matan el núcleo en ejecución en la GPU? En cuanto a lo que he probado, no es así.

Probablemente no. En Linux puedes usar cuda-gdb para resolverlo.

No veo el sentido de enviar múltiples núcleos a la GPU usando hilos ... Me pregunto qué pasaría si envía múltiples Kernels a la GPU en el momento ... ¿El planificador de hilos de la GPU lidiará con eso?

+0

Necesito enviar kernels separados a la GPU, porque el contexto varía. Esa es la información de inicialización puede variar. Acerca del uso de hilos ... La plataforma se diseñó teniendo en cuenta la CPU. Pero luego lo reutilizamos para la GPU también. No creo que debería importar El programador de la GPU pondrá en cola las peticiones del kernel (Eso es lo que creo, podría estar equivocado). – arvindkgs

+0

Lo probó, sí, eso es lo que hace ... ¿podría averiguar qué le sucedió? ¿En qué plataforma estás? (Linux, Windows o Mac?) – Nils

+0

No, aún no. Estoy trabajando en Linux (centos 5.4) – arvindkgs

1

Parece que no. Ejecuté un kernel roto y bloqueé uno de mis dispositivos aparentemente indefinidamente (hasta que reinicie). No estoy seguro de cómo matar kernel en ejecución. Sin embargo, creo que hay una manera de limitar el tiempo de ejecución del núcleo a través del controlador, por lo que ese podría ser el camino a seguir.

1

A menos que haya una parte más grande de esto que realmente no estoy obteniendo, podría ser mejor usar la api de CUDA Streams para la tarea de múltiples dispositivos, pero YMMV.

En cuanto a la matanza; si está ejecutando las tarjetas con una pantalla (y el servidor x) conectados, automáticamente se agotarán después de 5 segundos (de nuevo, YMMV).

Suponiendo que no es el caso; echa un vistazo a llamar a cudaDeviceReset() API Reference; desde el hilo 'padre' después de su propio tiempo de espera prescrito 'matar'.

Aún no he implementado esta función en mi propio código, así que honestamente no tengo idea si funcionará en su situación, pero vale la pena investigarlo.

Cuestiones relacionadas