2009-01-30 20 views
28

He notado que las aplicaciones CUDA tienden a tener un tiempo de ejecución máximo aproximado de 5-15 segundos antes de que fallen y salgan. Me doy cuenta de que es ideal no tener la aplicación CUDA durante tanto tiempo, pero suponiendo que es la opción correcta para usar CUDA y debido a la cantidad de trabajo secuencial por hilo debe durar tanto tiempo, ¿hay alguna manera de extender este período de tiempo o para evitarlo?El tiempo de espera de las aplicaciones CUDA falla después de varios segundos: ¿cómo solucionarlo?

Respuesta

5

La solución más básica es elegir un punto en el cálculo en un porcentaje del camino, estoy seguro de que la GPU con la que estoy trabajando puede completarla a tiempo, guardar toda la información de estado y detenerla, luego comenzar de nuevo.

Actualización: Para Linux: Salir de X le permitirá ejecutar aplicaciones CUDA todo el tiempo que desee. No se requiere Tesla (se usó un A 9600 para probar esto)

Una cosa a tener en cuenta, sin embargo, es que si X nunca se ingresa, los controladores probablemente no se cargarán y no funcionará.

También parece que para Linux, simplemente no tener ninguna X en pantalla en el momento también funcionará, por lo que no es necesario salir de X siempre que seleccione una terminal de pantalla completa que no sea X.

+0

Si no está cargando X, puede utilizar una secuencia de comandos para cargar el controlador CUDA. Consulte la guía Getting Started (http://developer.download.nvidia.com/compute/cuda/3_2_prod/docs/Getting_Started_Linux.pdf) para obtener más información. – Tom

5

Esto no es posible. El tiempo de espera está ahí para evitar que los errores en los cálculos ocupen la GPU durante largos períodos de tiempo.

Si usa una tarjeta dedicada para el trabajo de CUDA, el límite de tiempo se levanta. No estoy seguro si esto requiere una tarjeta Tesla, o si se puede usar una GeForce sin monitor conectado.

+0

Sería útil determinar cuál de estos casos es. Tendré que probar una tarjeta que no sea de tesla sin monitor adjunto y averiguarlo. – rck

+2

Acabo de probar esto. No se necesita tarjeta Tesla. Usando Linux, en realidad no me molesté en entrar en X y el Límite fue levantado. – rck

+0

Entonces, como sugieren otras respuestas, en realidad es posible ... ¿puedes reformular tu respuesta? – einpoklum

10

En Windows, el controlador de gráficos tiene un temporizador de vigilancia que elimina los programas de sombreado que se ejecutan durante más de 5 segundos. Tenga en cuenta que los controladores Xorg/XFree86 no hacen esto, por lo que una solución posible es ejecutar las aplicaciones CUDA en Linux.

AFAIK no es posible desactivar el temporizador de vigilancia en Windows. La única forma de evitar esto en Windows es usar una segunda tarjeta que no tenga pantallas desplegadas. No tiene que ser un Tesla, pero no debe tener pantallas activas.

+2

En realidad, en Windows, cualquier dispositivo con un controlador WDDM tendrá el problema del temporizador de vigilancia, ya sea que tenga una pantalla conectada o no. Las tarjetas Tesla de NVIDA solucionan este problema al tener un tipo de controlador completamente diferente (el controlador de computación de TCC o Tesla), que no identifica la GPU en el sistema operativo como adaptador de pantalla. Si solo conecta una segunda tarjeta de video (Radeon o GeForce) sin pantallas adjuntas, el sistema operativo seguirá reconociéndola como un dispositivo adaptador de pantalla WDDM, y el temporizador de vigilancia se seguirá aplicando. –

25

No soy un experto en CUDA, --- He estado desarrollando con AMD Stream SDK, que es comparable con AFAIK.

puede desactivar el temporizador de vigilancia de Windows, pero eso es altamente no recomendable, por razones que deberían ser obvias. Para deshabilitarlo, necesita regenerizar HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck, crear una REG_DWORD y establecerla en 1. También puede necesitar hacer algo en el panel de control de NVidia. Busque alguna referencia a "Recuperación de VPU" en los documentos de CUDA.

Idealmente, debería ser capaz de dividir las operaciones de su kernel en múltiples pasadas sobre sus datos para dividirlo en operaciones que se ejecutan en el límite de tiempo.

Como alternativa, puede dividir el dominio del problema para que esté computando menos píxeles de salida por comando. Es decir, en lugar de calcular 1,000,000 de píxeles de salida de una sola vez, emita 10 comandos a la GPU para calcular 100,000 cada uno.

La unidad básica que tiene que caber dentro del intervalo de tiempo no es toda su aplicación, sino la ejecución de un único búfer de comando. En el AMD Stream SDK, una secuencia larga de operaciones se puede dividir en varias franjas horarias al enjuagar explícitamente la cola de comandos con una llamada CtxFlush(). Tal vez CUDA tiene algo similar?

Debe no tiene que leer todos sus datos hacia adelante y hacia atrás a través del bus PCIX en cada segmento de tiempo; puedes dejar tus texturas, etc. en la memoria local gpu; solo tiene algunos búferes de comandos completos de vez en cuando, para demostrar al sistema operativo que no está atrapado en un bucle infinito.

Finalmente, las GPU son rápidas, por lo que si su aplicación no puede hacer un trabajo útil en esos 5 o 10 segundos, tomaría eso como una señal de que algo anda mal.

[EDITAR Mar 2010 para actualizar:] La clave de registro anterior no está actualizada. Creo que esa fue la clave para Windows XP de 64 bits. Hay nuevas claves de registro para Vista y Windows 7. Se puede encontrar aquí: http://www.microsoft.com/whdc/device/display/wddm_timeout.mspx o aquí: http://msdn.microsoft.com/en-us/library/ee817001.aspx

[EDIT Abr 2015 para actualizar:] Esto se está poniendo muy de moda. La forma más fácil de deshabilitar TDR para programación Cuda, suponiendo que tiene instaladas las herramientas NVIDIA Nsight, es abrir el monitor Nsight, hacer clic en "Opciones de monitor Nsight" y en "General" configurar "TDR WDDM habilitado" en falso. Esto cambiará la configuración del registro para usted. Cierra y reinicia. Cualquier cambio en la configuración del registro TDR no tendrá efecto hasta que reinicie.

+12

No soy programador SIMD, ni toco uno en TV, pero en mi humilde opinión es un poco demasiado general decir que "finalmente, las GPU son rápidas, así que si su aplicación no puede hacer un trabajo útil en ese 5 o 10 segundos, tomaría eso como una señal de que algo anda mal ". En aplicaciones científicas (como CUDA se usa a menudo), a veces solo tienes que calcular mucho. –

+0

San Jacinto: Vea la respuesta de Tom a continuación. El tiempo de espera es razonable en el caso en que la GPU en la que está trabajando también sea su GPU de pantalla. En el caso de que no se use para mostrar, tiene más opciones. –

+0

Definitivamente es incorrecto decir que el perro guardián no debe ser desactivado. El perro guardián está completamente roto: se dispara cuando se avanza una sola vez en el depurador, y tiende a congelar por completo el sistema en configuraciones de monitor múltiple/puerto de visualización, lo que no ayuda a nadie. –

3

La solución que uso es:

1. Pasar toda la información al dispositivo.
2. Ejecute versiones iterativas de algoritmos, donde cada iteración invoca el kernel en la memoria ya almacenada dentro del dispositivo.
3. Finalmente, transfiera la memoria al host solo después de que hayan finalizado todas las iteraciones.

Esto permite controlar las iteraciones desde la CPU (incluida la opción de abortar), sin el costoso dispositivo < - > transferencia de la memoria del host entre iteraciones.

3

El temporizador de vigilancia solo se aplica en las GPU con una pantalla adjunta.

En Windows, el temporizador es parte de la WDDM, es posible modificar la configuración (tiempo de espera, comportamiento al alcanzar el tiempo de espera, etc.) con algunas claves de registro; consulte este Microsoft article para obtener más información.

+0

Hola Tom, he modificado el temporizador de vigilancia ya (a ~ 6 días) y he logrado obtener un núcleo único para ejecutar durante 40 segundos. He intentado ejecutar uno significativamente más grande pero sigo recibiendo un error "ErrorLaunch TimeOut". Solo tengo una GPU, así que me preguntaba si hay algo más que pueda estar forzando a la GPU a responder antes de que finalice el kernel, especialmente porque solo se tarda entre 4 y 5 minutos en ejecutarse y el tiempo de espera se establece en tal ¿gran número? Gracias por su tiempo, realmente lo aprecio. –

2

Es posible deshabilitar este comportamiento en Linux. Aunque el "perro guardián" tiene un propósito obvio, puede causar algunos resultados muy inesperados al hacer extensos cálculos usando sombreadores/CUDA.

La opción puede ser fijada en su X-configuración (probablemente /etc/X11/xorg.conf)

Adición: Opción "interactivo" "0" a la sección del dispositivo de su GPU hace el trabajo.

ver CUDA Visual Profiler 'Interactive' X config option?

Para más detalles sobre la configuración

y

ver ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive

Para una descripción del parámetro.

8

Resolver Detección de tiempo de espera y recuperación - Windows 7 (32/64 bits)

crear una clave de registro de Windows para cambiar la configuración del TDR a una cantidad mayor, por lo que Windows permitirá un mayor retraso antes de comienza el proceso de TDR.

Abrir Regedit desde Run o DOS.

En Windows 7 Vaya a la zona clave de registro correcta, para crear la nueva clave :

HKEY_LOCAL_MACHINE> Sistema> CurrentControlSet> Control> GraphicsDrivers.

Probablemente habrá una clave allí llamada DxgKrnlVersion como DWord.

clic derecho y seleccione para crear una nueva clave REG_DWORD, y el nombre de TdrDelay. El valor que se le asigna es el número de segundos antes de que TDR entre en acción - it> actualmente es 2 automáticamente en Windows (incluso aunque el valor de la clave de registro no existe> hasta que lo cree). Asignar con un nuevo valor (probé 4 segundos), que duplica el tiempo antes de TDR. Luego reinicia la PC. Debe reiniciar la PC antes de que funcione el valor .

Fuente de Win7 TDR (Driver Timeout Detection & Recovery) También he verificado esto y funciona bien.

+0

Esto resolvió un problema similar para mí ... – einpoklum

Cuestiones relacionadas