optimización del rendimiento

Hay una serie de parámetros de configuración en $HOME/.config/darktable/darktablerc que pueden ayudar a ajustar el rendimiento de OpenCL de su sistema. El rendimiento en este contexto significa principalmente la latencia de darktable durante el trabajo interactivo (es decir, cuánto tiempo lleva reprocesar el pixelpipe). Para un flujo de trabajo cómodo, es esencial mantener baja la latencia.

Para obtener información de creación de perfiles, debe iniciar darktable desde una terminal con darktable -d opencl -d perf.

Después de cada reprocesamiento del pixelpipe – causado por cambios en los parámetros del módulo, zoom, panorámica, etc. – verá el tiempo total pasado en el pixelpipe y el tiempo gastado en cada uno de los kernels OpenCL. El valor más confiable es el tiempo total invertido en pixelpipe. Tenga en cuenta que los tiempos dados para cada módulo individual no son confiables cuando se ejecuta OpenCL pixelpipe de forma asíncrona (consulte opencl_async_pixelpipe a continuación).

Para permitir un procesamiento rápido de píxeles con OpenCL, es esencial que mantengamos ocupada la GPU. Cualquier interrupción o un flujo de datos estancado se sumará al tiempo total de procesamiento. Esto es especialmente importante para los pequeños búferes de imágenes que necesitamos manejar durante el trabajo interactivo. Estos se pueden procesar rápidamente con una GPU rápida. Sin embargo, incluso las paradas a corto plazo del pixelpipe pueden convertirse fácilmente en un cuello de botella.

Por otro lado, el rendimiento de darktable durante las exportaciones de archivos se rige más o menos solo por la velocidad de nuestros algoritmos y la potencia de su GPU. Los puestos a corto plazo no tendrán un efecto notable en el tiempo total de una exportación.

darktable viene con una configuración predeterminada que debería ofrecer un rendimiento de GPU decente en la mayoría de los sistemas. Sin embargo, si desea jugar un poco por sí mismo e intentar optimizar las cosas aún más, aquí hay una descripción de los parámetros de configuración relevantes.

opencl_async_pixelpipe
Esta bandera controla la frecuencia con la que darktable bloquea el pixelpipe de OpenCL para obtener un estado de éxito/fracaso de los núcleos que se han ejecutado. Para una latencia óptima, establezca esto en TRUE, de modo que darktable ejecute el pixelpipe de forma asincrónica e intente utilizar la menor cantidad de interrupciones posible. Si experimenta errores de OpenCL como kernels defectuosos, establezca el parámetro en FALSE. darktable interrumpirá después de cada módulo para que pueda aislar más fácilmente el problema. Se han informado problemas con algunas tarjetas AMD / ATI más antiguas, como la HD57xx, que pueden producir una salida confusa si este parámetro se establece en TRUE. En caso de duda, déjelo en su valor predeterminado de FALSO.
opencl_number_event_handles
Los identificadores de eventos se utilizan para que darktable pueda monitorear el éxito / fracaso de los kernels y la información de creación de perfiles, incluso si el pixelpipe se ejecuta de forma asincrónica. El número de controladores de eventos es un recurso limitado de su controlador OpenCL. Seguro que se pueden reciclar, pero hay un número limitado que se puede utilizar al mismo tiempo. Desafortunadamente, no hay forma de averiguar cuáles son los límites de recursos, por lo que darktable debe adivinar. El valor predeterminado de 25 es bastante conservador. Es posible que desee ver si valores más altos como 100 ofrecen un mejor rendimiento de OpenCL. Si su controlador se queda sin identificadores libres, experimentará fallas en los kernels OpenCL con el código de error -5 (CL_OUT_OF_RESOURCES) o incluso fallas o el sistema se congela. Reduzca el número nuevamente si eso sucede. Un valor de 0 impedirá que darktable use cualquier controlador de eventos. Esto evitará que darktable monitoree adecuadamente el éxito de sus núcleos OpenCL, pero ahorra algunos gastos generales del controlador. La consecuencia es que cualquier falla probablemente dará lugar a una salida distorsionada sin que se dé cuenta de darktable. Esto solo se recomienda si está seguro de que su sistema funciona perfectamente. También puede establecer este parámetro en -1, lo que significa que darktable no asume ninguna restricción en el número de controladores de eventos. No se recomienda.
opencl_synch_cache
Este parámetro, si se establece en “true”, forzará a darktable a buscar búferes de imagen de su GPU después de cada módulo y almacenarlos en su caché de pixelpipe. Esta es una operación que consume recursos, pero puede tener sentido dependiendo de su GPU (incluso si la GPU es bastante lenta). En este caso, darktable podría, de hecho, ahorrar algo de tiempo cuando los parámetros del módulo hayan cambiado, ya que puede volver a algún estado intermedio almacenado en caché y reprocesar solo una parte del pixelpipe. En muchos casos, este parámetro debe establecerse en “módulo activo” (el predeterminado), que solo almacenará en caché la entrada del módulo actualmente enfocado.
opencl_micro_nap
En un caso ideal, mantendrá su GPU ocupada al 100% al reprocesar el pixelpipe. Eso es bueno. Por otro lado, es posible que su GPU también sea necesaria para realizar actualizaciones regulares de la GUI. Puede suceder que no quede tiempo suficiente para esta tarea. La consecuencia sería una reacción entrecortada de su GUI al hacer panorámicas, hacer zoom o al mover los controles deslizantes. Para resolver este problema, darktable puede agregar pequeñas siestas en su procesamiento pixelpipe para que la GPU recupere el aliento y realice actividades relacionadas con la GUI. El parámetro opencl_micro_nap controla la duración de estas siestas en microsegundos. Deberá experimentar para encontrar un valor óptimo para su sistema. Los valores de 0, 100, 500 y 1000 son buenos puntos de partida para probar. El valor predeterminado es 1000.
opencl_use_pinned_memory
Durante el proceso de mosaico, es necesario transferir grandes cantidades de memoria entre el host y el dispositivo. En algunos dispositivos (a saber, AMD), las transferencias de memoria directa desde y hacia una región de memoria del host arbitraria pueden suponer una gran penalización en el rendimiento. Esto se nota especialmente al exportar imágenes grandes. Establecer este parámetro de configuración en TRUE le dice a darktable que use un tipo especial de búfer intermedio para las transferencias de datos del dispositivo host. En algunos dispositivos, esto puede acelerar la exportación de archivos grandes en un factor de 2 a 3. Los dispositivos y controladores NVIDIA parecen tener una técnica de transferencia de memoria más eficiente incluso para regiones de memoria arbitrarias. Como pueden no mostrar ninguna ganancia de rendimiento e incluso pueden producir resultados confusos, opencl_use_pinned_memory debe dejarse en su valor predeterminado FALSE para esos dispositivos.
opencl_building_gpuXXX
agregue manualmente esta configuración a darktablerc para agregar opciones adicionales de compilación de OpenCL para sus GPU, donde XXX es el nombre de la GPU. Estas opciones se utilizan al compilar kernels de OpenCL y se pueden proporcionar para ajustar el rendimiento o solucionar errores. Debe eliminar los núcleos existentes para volver a compilarlos con las nuevas opciones. Proporcione una cadena vacía para volver a compilar sin ninguna opción. Elimine la configuración por completo para volver a compilar con las opciones predeterminadas.

Puede hacer referencia a su GPU por su ID (por ejemplo, opencl_building_gpu0) o por su nombre canónico (por ejemplo, opencl_building_gpugeforce10606gb). Inicie darktable con darktable -d opencl para encontrar el nombre canónico de su GPU y las opciones de compilación predeterminadas.

Por ejemplo, las siguientes líneas agregarían opciones de compilación adicionales para la GPU con ID 0 y para la GPU denominada “geforce10606gb”:

opencl_building_gpu0=-cl-mad-enable -cl-no-signed-zeros -cl-unsafe-math-optimizations -cl-finite-math-only -cl-fast-relaxed-math
opencl_building_gpugeforce10606gb=-cl-mad-enable -cl-no-signed-zeros

translations