darktable page lede image
darktable page lede image

Optimización del desempeño de OpenCL

10.2.7. Optimización del desempeño de OpenCL

Hay algunos parámetros de configuración en $HOME/.config/darktable/darktablerc que le ayudarán a optimizar el desempeño de OpenCL en su sistema. El desempeño en este contexto significa principalmente la latencia de darktable durante el trabajo interactivo, i.e. cuanto tiempo toma re-procesar su pixelpipe. Para un flujo de trabajo cómodo es esencial mantener la latencia baja.

Para obtener la información de perfilado, debe iniciar darktable desde una terminal con

darktable -d opencl -d perf

Luego de cada re-procesamiento del pixelpipe – causado por cambios en los parámetros del módulo, acercamiento, paneo, etc. – obtendrá el tiempo total y el tiempo consumido en cada uno de los kernels OpenCL. El valor mas confiable es el tiempo total bastado en el pixelpipe. Por favor, note que el tiempo dado para cada módulo individual es poco fiable al correr un pixel pipe OpenCL asíncrono (vea opencl_async_pixelpipe a continuación).

Para permitir un rápido procesamiento del pixelpipe con OpenCL, es esencial que se mantenga al GPU ocupado. Cualquier interrupción o bloqueo del flujo de datos se agregará al tiempo de procesamiento total. Esto es especialmente importante para los buffers de las imágenes pequeñas que necesitamos manejar durante el trabajo interactivo. Pueden ser procesados rápidamente por un GPU rápido. Sin embargo, incluso una pequeña pausa en el pixelpipe puede convertirse en un cuello de botella.

Por otra parte, el desempeño de darktable durante el exportado de archivos es mas o menos gobernado únicamente por la velocidad de nuestros algoritmos y los caballos de poder de su GPU. Pequeña pausas no tendrán efectos notables sobre el tiempo total de la exportación.

darktable viene con un conjunto de configuraciones por defecto que le deberían proveer un desempeño decente de su GPU en la mayoría de los sistemas. Sin embargo, si quiere jugar un poco por si mismo y tratar de optimizar las cosas un poco mas, aquí tiene una descripción de los parámetros de configuración más relevantes.

opencl_async_pixelpipe

Esta etiqueta boolean controla con que frecuencia bloquearemos el pixelpipe de OpenCL y obtendremos un estado de éxito/fallo de todos los kernels que han estado activos. Para una mejor latencia configure esto a VERDADERO, para que darktable corra el pixelpipe de forma asíncrona y trate de utilizar la menor cantidad de interruptores posibles. Si experimenta errores de OpenCL como kernels que fallan, ajuste el parámetro a FALSO. darktable entonces se interrumpirá luego de cada módulo, para que pueda aislar el problema más fácilmente. Algunos problemas han sido reportados con viejas tarjetas ATI/AMD, como la HD57xx, la cual puede producir una salida ilegible si este parámetro está ajustado a VERDADERO. Si tiene dudas, déjelo en FALSO por defecto.

opencl_number_event_handles

Los manejadores de eventos son utilizados para poder monitorear el éxito/falla de los kernels y perfilar la información incluso si el pixelpipe corre de forma asíncrona. El número de manejadores de eventos es un recurso limitado de su propio driver OpenCL. Por supuesto que podemos reciclarlos, pero hay un número limitado que podemos utilizar al mismo tiempo. Desafortunadamente, no hay forma de saber cuales son los límites del recurso; así que necesitamos adivinar. Nuestro valor por defecto de 25 es bastante conservador. Quizás quiera intentar si valores mayores como 100 pueden darle un mejor desempeño del OpenCL. Si su driver se queda sin manejadores quizás experimente un fallo en los kernels OpenCL con un error de código -5 (CL_OUT_OF_RESOURCES) o incluso bloqueará o congelará su sistema; en ese caso reduzca el número nuevamente. Un valor de 0 bloqueará darktable de utilizar cualquier manejador de eventos. Esto prevendrá que darktable haga un monitoreo apropiadamente el éxito de sus kernels OpenCL, pero le ahorrará el consumo de su driver. La consecuencia será que cualquier falla lo llevará muy probablemente a una salida ilegible de la que darktable no se dará cuenta; solo es recomendada si da por hecho que su sistema corre fuerte como una roca sólida. También puede ajustar este parámetro a -1, lo cual significa que darktable no asume restricciones en el número de manejadores de eventos; esto no es recomendado.

opencl_synch_cache

Este parámetro, si se configura a VERDADERO, forzará a darktable a buscar buffers de imágenes desde su GPU luego de cada módulo y los almacene en la caché del pixelpipe. Esta es una operación que consume muchos recursos. Solo tiene sentido si tiene un GPU bastante lento. En ese caso, darktable quizás le ahorre algo de tiempo cuando los parámetros de los módulos sean cambiados, ya que puede regresar a algún estado intermedio en cache y re-procesar solo parte del pixelpipe. En la mayoría de los casos, este parámetro deberá ser configurado a FALSO (por defecto)

opencl_micro_nap

En un caso idea, mantenga su GPU ocupado al 100% cuando esté re-procesando el pixelpipe. Eso es bueno. Por otra parte, su GPU también necesita realizar actualizaciones regulares de la interfaz. Quizás le suceda que no hay suficiente tiempo disponible para esta tarea. Las consecuencias serán una reacción nerviosa de su GUI durante el paneo, el acercamiento o al mover los deslizadores. darktable puede agregar pequeñas siestas en el proceso del pixelpipe para que su GPU pueda tomar aliento y para que pueda realizar tareas en la GUI. El parámetro opencl_micro_nap controla la duración de estas siestas en micro-segundos. Necesita experimentar para encontrar el valor óptimo para su sistema. Los valores de 0, 100, 500 y 1000 son buenos puntos de inicio para intentar. Valor por defecto es 1000.

opencl_use_pinned_memory

Durante las bandas, grandes cantidades de memoria se necesitarán para ser transferidas entre el huésped y el dispositivo. En algunos dispositivos (es decir, AMD) las transferencias directas de memoria hacia y desde regiones arbitrarias de memoria del huésped quizás ocasionen una gran penalidad en el desempeño. Esto es notable esencialmente cuando se exportan imágenes grandes. Al ajustar este parámetro de configuración a VERDADERO, le indica a darktable que utilice un tipo especial de buffer intermedio para las transferencias de información entre el huésped y el dispositivo. En algunos dispositivos, esto puede acelerar el exportado de grandes archivos por un factor de 2 a 3. Los dispositivos y drivers NVIDIA parecen tener una técnica mas eficiente para la transferencia de memoria, incluso en las regiones de memoria arbitraria. Ya que es posible que no se muestre una ganancia en el desempeño y quizás produzca una salida ilegible, opencl_use_pinned_memory debería ser dejado en su valor por defecto de FALSO para esos dispositivos.