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

After each reprocessing of pixelpipe – caused by module parameter change, zooming, panning, etc. – you will get the total time and the time spent in each of our OpenCL kernels. The most reliable value is the total time spent in pixelpipe. Please note that the timings given for each individual module are unreliable when running the OpenCL pixelpipe asynchronously (see opencl_async_pixelpipe below).

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 establece en "verdadero", forzará a darktable a recuperar los búferes de imagen de su GPU después de cada módulo y los almacenará en su memoria temporal. Es una operación que consume recursos, aunque tiene sentido según la GPU existente (incluso si la GPU es bastante lenta). En ese caso, darktable tendría que poder ahorrar algo de tiempo cuando los parámetros del módulo han cambiado, ya que puede volver a un estado en memoria temporal intermedio y reprocesar solo una parte del proceso total de imagen. En muchos casos, este parámetro debe configurarse como "módulo activo" (predeterminado), que solo almacenará en memoria temporal la entrada del módulo en el que se esté centrado en ese momento.

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.