múltiplos dispositivos

O agendamento de dispositivos OpenCL pode ser otimizado na maioria dos sistemas usando as configurações de “perfil de agendamento do OpenCL”. No entanto, se o seu sistema estiver equipado com mais de uma GPU, você pode querer definir a prioridade relativa do dispositivo manualmente. Para fazer isso, você precisa selecionar o perfil de agendamento “padrão” e alterar as configurações no parâmetro de configuração “opencl_device_priority”.

É importante entender como o darktable usa dispositivos OpenCL. Cada sequência de processamento de uma imagem – para converter uma entrada em saída final usando uma pilha de histórico – é executada em um pixelpipe. Existem cinco tipos diferentes de pixelpipe no darktable. Um tipo é responsável por processar a visualização central da imagem (ou visualização completa) no modo câmara escura, outro pixelpipe processa a imagem de visualização (janela de navegação, também necessária para histogramas e mais itens internos relevantes para a saída correta da visualização completa). Pode haver um de cada um desses três pixelpipes em execução a qualquer momento, com os pixelpipes completos e de visualização executados em paralelo. Além disso, pode haver vários pixelpipes paralelos realizando exportações de arquivos, bem como vários pixelpipes paralelos gerando miniaturas. Se um dispositivo OpenCL estiver disponível, o darktable dinamicamente o aloca para um pixelpipe específico para uma execução e o libera depois.

A demanda computacional varia significativamente dependendo do tipo de pixelpipe sendo executado. A imagem de visualização e as miniaturas são de baixa resolução e podem ser processadas rapidamente, enquanto o processamento da visualização da imagem central ou da segunda janela é mais exigente. Um pixelpipe de exportação completa é ainda mais exigente.

O parâmetro de configuração “opencl_device_priority” contém uma string com a seguinte estrutura:

a,b,c.../d,e,f.../g,h,i.../j,k,l...,m,n,o...

Cada letra representa um dispositivo OpenCL específico. Existem cinco campos separados por barras, cada um representando um tipo de pixelpipe. O primeiro campo (a,b,c...) define os dispositivos que têm permissão para processar a imagem central (completa) do pixelpipe. Da mesma forma, os dispositivos d,e,f... podem processar o pixelpipe de visualização, os dispositivos g,h,i... os pixelpipes de exportação, os dispositivos j,k,l... os pixelpipes em miniatura e finalmente os dispositivos m,n,o... visualiza pixelpipe para a segunda janela. Um campo vazio significa que nenhum dispositivo OpenCL pode servir este tipo de pixelpipe.

O darktable tem um sistema de numeração interno, pelo qual o primeiro dispositivo OpenCL disponível recebe o número 0. Todos os outros dispositivos são numerados consecutivamente. Este número, junto com o nome do dispositivo, é exibido quando você inicia o darktable com darktable -d opencl. Você pode especificar um dispositivo por número ou nome canônico (maiúsculas/minúsculas e espaços em branco não importam). Se você tiver mais de um dispositivo com o mesmo nome, precisará usar os números dos dispositivos para diferenciá-los.

Um especificador de dispositivo pode ser prefixado com um ponto de exclamação !, em cujo caso o dispositivo é excluído do processamento de um determinado pixelpipe. Você também pode usar um asterisco * como um caractere coringa, representando todos os dispositivos não mencionados anteriormente explicitamente naquele grupo.

A ordem de sequência dentro de um grupo é importante – o darktable irá ler a lista da esquerda para a direita e sempre que tentar alocar um dispositivo OpenCL para um pixelpipe, ele fará a varredura dos dispositivos nessa ordem, pegando o primeiro dispositivo livre que encontrar.

Se um processo pixelpipe estiver prestes a ser iniciado e todas as GPUs no grupo correspondente estiverem ocupadas, o darktable processa automaticamente a imagem na CPU por padrão. Você pode forçar o processamento na GPU prefixando a lista de GPUs permitidas com um sinal de mais +. Neste caso, o darktable não usará a CPU, mas suspenderá o processamento até que o próximo dispositivo OpenCL permitido esteja disponível.

A configuração padrão do darktable para “opencl_device_priority” é */!0,*/*/*/!0,*.

Qualquer dispositivo OpenCL detectado tem permissão para processar a imagem da vista central. O primeiro dispositivo OpenCL (0) não tem permissão para processar ambos pixelpipe de visualização. Como consequência, se houver apenas uma GPU disponível em seu sistema, o pixelpipe de visualização sempre será processado na CPU, mantendo sua única GPU exclusivamente para a visualização da imagem central mais exigente. Esta é uma configuração razoável para a maioria dos sistemas. Essas restrições não se aplicam aos pixelpipes de exportação e miniaturas.

O padrão é uma boa escolha se você tiver apenas um dispositivo. Se você tiver vários dispositivos, ele constitui um ponto de partida razoável. No entanto, como seus dispositivos podem ter níveis bastante diferentes de poder de processamento, faz sentido investir algum tempo otimizando sua lista de prioridades.

Aqui está um exemplo: vamos supor que temos um sistema com dois dispositivos, uma rápida Nvidia Quadro RTX 4000 e uma GeForce GTX 1050 mais antiga e mais lenta. O darktable (iniciado com darktable -d opencl) relatará os seguintes dispositivos:

[opencl_init] iniciado com sucesso.
[opencl_init] aqui estão números internos e nomes de 
              dispositivos OpenCL disponíveis para o darktable:
[opencl_init]           0       'NVIDIA GeForce GTX 1050'
[opencl_init]           1       'NVIDIA CUDA Quadro RTX 4000'
[opencl_init] FINALLY: opencl está DISPONÍVEL neste sistema.

com os nomes canônicos mostrados acima como nvidiagforcegtx1050 e nvidiacudaquadrortx4000

Aqui, a placa GeForce GTX 1050 é detectada como o primeiro dispositivo e a Quadro RTX 4000 como o segundo. Esta ordem normalmente não mudará a menos que a configuração do hardware ou controlador seja modificada, mas é melhor usar nomes de dispositivos em vez de números para ficar mais seguro.

Como a GTX 1050 é mais lenta que a RTX 4000, um “opencl_device_priority” otimizado poderia ser parecido com:

!nvidiagforcegtx1050,*/!nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/!nvidiacudaquadrortx4000.

A GTX 1050 é explicitamente excluída do processamento do pixelpipe da imagem central; isso é reservado para “todos” os outros dispositivos (ou seja, a RTX 4000). Por outro lado, para os pixelpipe de visualização, a RTX 4000 é excluída, de modo que apenas a GTX 1050 tem permissão para fazer o trabalho.

Para exportação de arquivos e geração de miniaturas, queremos todas as mãos ao trabalho. No entanto, o darktable deve primeiro verificar se o dispositivo RTX 4000 está livre, porque é mais rápido. Se não estiver livre, todos os outros dispositivos – na verdade, apenas o GTX 1050 – são verificados.

translations