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 uma pixelpipe. Existem quatro tipos diferentes de pixelpipe no darktable. Um tipo é responsável por processar a visualização da imagem central (ou visualização completa) no modo de sala escura, outra pixelpipe processa a imagem de visualização (janela de navegação). Pode haver uma de cada uma dessas duas pixelpipes em execução a qualquer momento, com as pixelpipes completas e de visualização executadas em paralelo. Além disso, pode haver várias pixelpipes paralelas realizando exportações de arquivos, bem como várias pixelpipes paralelas gerando miniaturas. Se um dispositivo OpenCL estiver disponível, o darktable dinamicamente o aloca para uma pixelpipe específica 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 é mais exigente. Uma pixelpipe de exportação completa é ainda mais exigente.
O parâmetro de configuração “opencl_device_priority” contém uma cadeia de caracteres com a seguinte estrutura: a,b,c.../k,l,m.../o,p,q.../x,y,z...
. Cada letra representa um dispositivo OpenCL específico. Existem quatro 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) da pixelpipe. O segundo campo (k,l,m...
) define os que processam a pixelpipe de visualização. O terceiro campo (o,p,q...
), os que processam as pixelpipes de exportação. Finalmente, o quarto campo (x,y,z...
) define os dispositivos que processam as pixelpipes em miniatura. 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 (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 uma determinada 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 da 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,*/*/*
.
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 a pixelpipe de visualização. Como consequência, se houver apenas uma GPU disponível em seu sistema, a 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 à exportação e miniaturas de pixelpipes.
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 Radeon HD7950 e uma GeForce GTS450 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 darktable:
[opencl_init] 0 'GeForce GTS 450'
[opencl_init] 1 'Tahiti'
[opencl_init] FINALLY: opencl está DISPONÍVEL neste sistema.
Aqui, a placa GeForce GTS 450 é detectada como o primeiro dispositivo e a Radeon HD7950 (‘Tahiti’) 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 GTS450 é mais lenta que a HD7950, um “opencl_device_priority” otimizado poderia ser parecido com: !GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*
.
A GTS450 é explicitamente excluída do processamento da pixelpipe da imagem central; isso é reservado para “todos” os outros dispositivos (ou seja, a HD7950/Tahiti). Por outro lado, para a pixelpipe de visualização, a Tahiti é excluído, de modo que apenas a GTS450 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 Tahiti está livre, porque é mais rápido. Se não estiver livre, todos os outros dispositivos – na verdade, apenas o GTS450 – são verificados.