otimização de performance

Existe uma série de parâmetros de configuração em $HOME/.config/darktable/darktablerc que podem auxiliar a ajustar o desempenho do OpenCL no seu sistema. A performance neste contexto significa principalmente a latência do darktable durante o trabalho interativo (isto é, quanto tempo leva para reprocessar a pixelpipe). Para um fluxo de trabalho cômodo, é essencial manter a latência baixa.

Para obter informações sobre a criação de perfis, você deve iniciar o darktable de um terminal com o comando darktable -d opencl -d perf.

Depois de cada reprocessamento da pixelpipe – causado por mudança de parâmetros de módulo, ampliação, deslocamento da visualização etc – você verá o tempo total gasto na pixelpipe e o tempo em cada um dos kernels OpenCL. O valor mais confiável é o tempo total gasto na pixelpipe. Note que os tempos gastos em cada módulo individual não são confiáveis quando se executa a pixelpipe no OpenCL de forma assíncrona (consulte opencl_async_pixelpipe abaixo).

Para permitir um processamento rápido da pixelpipe com OpenCL, é essencial mantermos a GPU ocupada. Quaisquer interrupções ou um fluxo de dados paralisado aumentará o tempo total de processamento. Isso é especialmente importante para os pequenos buffers de imagem que precisamos manipular durante o trabalho interativo. Eles podem ser processados rapidamente por uma GPU rápida. No entanto, mesmo paradas de curto prazo da pixelpipe podem facilmente se tornar um gargalo.

Por outro lado, o desempenho do darktable durante as exportações de arquivos é mais ou menos governado apenas pela velocidade de nossos algoritmos e pela potência de sua GPU. As paradas de curto prazo não terão um efeito perceptível no tempo total de uma exportação.

O darktable vem com configurações padrão que devem oferecer um desempenho de GPU decente na maioria dos sistemas. No entanto, se você quiser mexer um pouco sozinho e tentar otimizar ainda mais as coisas, aqui está uma descrição dos parâmetros de configuração relevantes.

opencl_async_pixelpipe
Este sinalizador controla a frequência com que o darktable bloqueia a pixelpipe do OpenCL para obter um status de sucesso/falha dos kernels que foram executados. Para uma latência ideal, defina como TRUE, de forma que o darktable execute a pixelpipe de forma assíncrona e tente usar o mínimo de interrupções possível. Se você tiver erros de OpenCL, como kernels com falha, defina o parâmetro como FALSE. O darktable irá interromper após cada módulo para que você possa isolar o problema mais facilmente. Problemas foram relatados com algumas placas AMD/ATI mais antigas, como a HD57xx, que podem produzir saída distorcida se este parâmetro for definido como TRUE. Em caso de dúvida, deixe o padrão FALSE.
opencl_number_event_handles
Identificadores de evento são usados para que o darktable possa monitorar o sucesso/falha de kernels e informações de perfil, mesmo se a pixelpipe for executada de forma assíncrona. O número de identificadores de eventos é um recurso limitado do driver OpenCL. Com certeza eles podem ser reciclados, mas há um número limitado que pode ser usado ao mesmo tempo. Infelizmente, não há como descobrir quais são os limites de recursos, então o darktable precisa adivinhar. O valor padrão de 25 é bastante conservador. Você pode querer ver se valores mais altos como 100 oferecem melhor desempenho do OpenCL. Se o seu driver ficar sem identificadores livres, você enfrentará falhas nos kernels do OpenCL com o código de erro -5 (CL_OUT_OF_RESOURCES) ou até mesmo travamentos ou congelamentos do sistema. Reduza o número novamente se isso acontecer. Um valor de 0 impedirá que a darktable use quaisquer identificadores de evento. Isso impedirá que o darktable monitore adequadamente o sucesso de seus kernels OpenCL, mas economiza algum overhead de controlador. A consequência é que qualquer falha provavelmente levará a uma saída distorcida sem que seja percebida pelo darktable. Isso só é recomendado se você tiver certeza de que seu sistema funciona perfeitamente. Você também pode definir este parâmetro como -1, o que significa que o darktable não assume nenhuma restrição no número de identificadores de evento. Isso não é recomendado.
opencl_synch_cache
Este parâmetro, se definido como TRUE, forçará o darktable a buscar buffers de imagem de sua GPU após cada módulo e armazená-los em seu cache de pixelpipe. Esta é uma operação que consome recursos, mas pode fazer sentido dependendo de sua GPU (inclusive se a GPU for bastante lenta). Neste caso, o darktable pode, de fato, economizar algum tempo quando os parâmetros do módulo forem alterados, pois pode voltar a algum estado intermediário armazenado em cache e reprocessar apenas parte da pixelpipe. Em muitos casos, este parâmetro deve ser definido como “active module” (o padrão), que armazenará apenas em cache a entrada do módulo atualmente em foco.
opencl_micro_nap
Em um caso ideal, você manterá sua GPU ocupada em 100% ao reprocessar a pixelpipe. Isso é bom. Por outro lado, sua GPU também pode ser necessária para fazer atualizações regulares da interface. Pode acontecer que não haja tempo suficiente para esta tarefa. A consequência seria uma reação brusca de sua interface ao fazer panorâmicas, ampliações ou ao mover os controles deslizantes. Para resolver esse problema, o darktable pode adicionar pequenos cochilos em seu processamento de pixelpipe para que a GPU recupere o fôlego e execute atividades relacionadas à interface do usuário. O parâmetro opencl_micro_nap controla a duração desses cochilos em microssegundos. Você precisará experimentar para encontrar um valor ideal para o seu sistema. Valores de 0, 100, 500 e 1000 são bons pontos de partida para tentar. O padrão é 1000.
opencl_use_pinned_memory
Durante a colocação lado a lado, grandes quantidades de memória precisam ser transferidas entre o host e o dispositivo. Em alguns dispositivos (nomeadamente AMD), as transferências diretas de memória de e para uma região de memória host arbitrária podem causar uma grande penalidade de desempenho. Isso é especialmente perceptível ao exportar imagens grandes. Definir este parâmetro de configuração como TRUE diz ao darktable para usar um tipo especial de buffer intermediário para transferências de dados do dispositivo host. Em alguns dispositivos, isso pode acelerar a exportação de arquivos grandes por um fator de 2 a 3. Dispositivos e drivers NVIDIA parecem ter uma técnica de transferência de memória mais eficiente, mesmo para regiões de memória arbitrárias. Como eles podem não mostrar nenhum ganho de desempenho e até mesmo produzir uma saída distorcida, opencl_use_pinned_memory deve ser deixada em seu padrão FALSE para esses dispositivos.
opencl_building_gpuXXX
Adicione manualmente esta configuração a darktablerc para adicionar opções de compilação OpenCL extras para sua(s) GPU(s), onde XXX é o nome da GPU. Essas opções são usadas ao compilar kernels OpenCL e podem ser fornecidas para ajuste de desempenho ou para contornar bugs. Você deve remover todos os kernels existentes para recompilá-los com as novas opções. Fornece uma string vazia para recompilar sem opções. Remova a configuração inteiramente para recompilar com as opções padrão.

Você pode fazer referência à sua GPU por seu ID (por exemplo, opencl_building_gpu0) ou por seu nome canônico (por exemplo, opencl_building_gpugeforce10606gb). Inicie o darktable com darktable -d opencl para encontrar o nome canônico da GPU e as opções de compilação padrão.

Por exemplo, as linhas a seguir adicionariam opções de compilação extras para a GPU com ID 0 e para a GPU chamada “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