requisitos de memória

Processing a raw image in Ansel requires a great deal of system memory. A simple calculation makes this clear: For a 20 megapixel image, Ansel requires a 4x32-bit floating point cell to store each pixel, meaning that each full image of this size will require approximately 300MB of memory just to store the image data. In order to actually process this image through a given module, Ansel needs at least two buffers (input and output) of this size, with more complex modules potentially requiring several additional buffers for intermediate data. Without further optimization, anything between 600MB and 3GB of memory might be required to store and process image data as the pixelpipe executes. On top of this is Ansel’s code segment, the code and data of any dynamically-linked system libraries, as well as further buffers that Ansel uses to store intermediate states (cache) for quick access during interactive work.

Em resumo, o Ansel requer pelo menos 4 GB de RAM física mais 4 a 8 GB de espaço de troca adicional para ser executado, mas terá um desempenho melhor quanto mais memória você tiver.

Além de serem executados em sua CPU, muitos módulos Ansel também possuem implementações OpenCL que podem aproveitar ao máximo o processamento paralelo oferecido por sua placa gráfica (GPU). Da mesma forma, quanto mais memória GPU você tiver, melhor será o desempenho da Ansel.

mosaico

Se o Ansel não tiver memória suficiente para processar a imagem inteira de uma só vez, os módulos podem optar por usar uma “estratégia de mosaico”, em que a imagem é dividida em partes menores (ladrilhos) que são processadas independentemente e, em seguida, costuradas novamente no fim. Embora isso permita que as imagens sejam processadas com uma pegada de memória muito menor, também apresenta algumas desvantagens:

  • tiling is always slower – sometimes up to 10x slower, though for some modules the difference is negligible,
  • tiling is not technically possible for some modules because of the nature of the underlying algorithms

Para a maioria dos sistemas, o mosaico provavelmente será usado apenas para exportações de imagem em tamanho real, com o trabalho interativo na sala escura sendo processado com mais eficiência. Para obter o melhor desempenho (e evitar os modos de mosaico), você deve executar o Ansel juntamente com o menor número possível de outros aplicativos e configurar o Ansel para usar o máximo possível da memória do sistema e da GPU.

ajuste de performance

There are a number of configuration parameters that can help you to fine-tune your system’s performance. Some of these parameters are available in Preferences > Processing > CPU, GPU, Memory and others need to be modified directly in Ansel’s configuration file (found in $HOME/.config/Ansel/Anselrc).

Esta seção fornece algumas orientações sobre como ajustar essas configurações.

como testar

Para determinar o quanto suas modificações melhoram (ou não) o desempenho do Ansel, você precisará de uma ou mais imagens de amostra para testar e um método para avaliar a velocidade do pixelpipe.

For sample images, you are advised to use some of the more intensive modules, such as diffuse or sharpen or denoise (profiled). Exports are likely to have more consistent and comparable timings between pipe runs than interactive work (and will also push your hardware more).

Para obter informações sobre a criação de perfis, você deve iniciar o Ansel de um terminal com o comando Ansel -d opencl -d perf. Se você deseja mais informações sobre a técnica de mosaico, você deve usar Ansel -d opencl -d tiling -d perf.

Each time the pixelpipe is processed (when you change module parameters, zoom, pan, export etc.) you will see (in your terminal session) the total time spent in the pixelpipe and the time spent in each of the OpenCL kernels. The most reliable value is the total time spent the in pixelpipe and you should use this to assess your changes.


Nota: Os tempos fornecidos para cada módulo individual não são confiáveis ao executar o pixelpipe OpenCL de forma assíncrona (consulte modo assíncrono abaixo).


Para permitir um processamento eficiente com OpenCL, é essencial que a GPU seja mantida 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 usados durante o trabalho interativo, que podem ser processados rapidamente por uma GPU rápida. No entanto, mesmo paradas de curto prazo do pixelpipe podem facilmente se tornar um gargalo.

Por outro lado, o desempenho do Ansel durante as exportações de arquivos é mais ou menos governado apenas pela velocidade dos 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.

recursos do Ansel

The “Ansel resources” preference (in Preferences > Processing > CPU, GPU, Memory) allows you to choose between four different approaches to allocating your system’s resources to Ansel. Each of these options controls multiple individual parameters, which are defined independently in $HOME/.config/Ansel/Anselrc. You can amend any of these directly within your Anselrc file to tweak values for your selected resource level, though you cannot add your own custom resource level to the preferences drop-down.

Cada uma das quatro opções de “recursos da Ansel” é definida da seguinte forma:

1resource_default=512 8 128 700
2resource_large=700 16 128 900
3resource_small=128 4 64 400
4resource_unrestricted=16384 1024 128 900

Mais geralmente, elas podem ser representadas como resource_level=a b c d onde a - d são definidos da seguinte forma:

a. memória do sistema para processamento do módulo
A quantidade máxima de memória do sistema disponibilizada para processamento do módulo. Valores mais baixos forçam os módulos que consomem muita memória a processar imagens com um número crescente de ladrilhos. Este número é uma fração da quantidade total de memória do sistema, dividida por 1024. Por exemplo, em um sistema com 16 GB de memória total do sistema, a quantidade atribuída por resource_default (em GB) é 16 * 512 / 1024, ou 8 GB de RAM do sistema.
b. tamanho mínimo do buffer de mosaico
O tamanho mínimo de um único buffer de ladrilho, expresso de forma semelhante como uma fração da memória total do sistema. Por exemplo, em um sistema com 16 GB de memória total do sistema, a quantidade atribuída por resource_default (em GB) é 16 * 8 / 1024, ou 0,125 GB de RAM do sistema. Observe que essa configuração é em grande parte histórica e não tem mais uso prático – você é aconselhado a deixá-la em seu valor padrão.
c. memória cache de miniaturas
A quantidade de memória a ser usada para o cache de miniaturas. Novamente, isso é expresso como uma fração da memória total do sistema e, em um sistema de 16 GB, a quantidade atribuída por resource_default é 16 * 128 / 1024, ou 2 GB de RAM do sistema.
d. memória OpenCL (GPU)
A quantidade máxima de memória GPU disponibilizada para processamento do módulo. Assim como na memória do sistema, valores mais baixos forçarão os módulos que consomem muita memória a processar imagens com um número crescente de ladrilhos. A memória da GPU provavelmente também será usada por outros aplicativos em seu sistema. No entanto, em contraste com a memória do sistema, sua GPU não é capaz de aproveitar os arquivos de troca e pode ser difícil para o Ansel saber exatamente quanta memória está disponível em um determinado momento. Se este parâmetro for definido muito alto, o Ansel pode ser forçado a retornar ao processamento da CPU (o que será significativamente mais lento). Por esse motivo, a fração do parâmetro de memória da GPU também inclui 400 MB extras de espaço livre na tentativa de evitar a alocação excessiva de memória. Por exemplo, em uma GPU com 6 GB de memória, o Ansel usará aproximadamente (6 - 0,4) * 700 / 1024, ou 3,8 GB de RAM da GPU ao usar o nível resource_default.

Além dos níveis de recursos apresentados na interface do usuário, as seguintes opções podem ser definidas por meio da linha de comando (por exemplo, Ansel --conf resourcelevel="notebook"). Esses modos são projetados para depurar problemas de mosaico e testar o desempenho de sistemas comuns em máquinas de desenvolvimento maiores. As seguintes opções são fornecidas:

  • “mini” (1GB ram, 2MB single buffer, 128MB thumbnail cache, 200MB OpenCL memory)
  • “notebook” (4GB ram, 32MB single buffer, 512MB thumbnail cache, 1GB OpenCL memory)
  • “reference” (8GB ram, 32MB single buffer, 512MB thumbnail cache, 2GB OpenCL memory)

ajuste do uso de memória da GPU

Se você quiser fazer uso máximo da memória da GPU para OpenCL, você tem três opções:

  • Choose the “large” resource level. For a 6GB card, this will use approximately 5GB of GPU memory, leaving 1GB for the rest of your system.
  • Alter Anselrc to increase the last number (the OpenCL memory fraction) for your selected resource level. For example, increasing the OpenCL memory fraction to 950 would increase the available memory on a 6GB GPU to approximately 5.3GB.
  • Set preferences > processing > cpu / gpu / memory > tune OpenCL performance to “memory size”, which will use all of your device’s memory, less a 400MB headroom. Please see the section below for other options related to this setting.

configuração OpenCL específica de dispositivo

As configurações padrão da Ansel devem fornecer um desempenho de GPU razoável na maioria dos sistemas. No entanto, se você quiser tentar otimizar ainda mais as coisas, esta seção descreve os parâmetros de configuração relevantes (todos os quais são definidos em seu arquivo Anselrc).

A partir do darktable 4.0, a maioria das opções relacionadas ao OpenCL são gerenciadas com uma estratégia “por dispositivo”. O parâmetro de configuração para cada dispositivo se parece com:

cldevice_v4_quadrortx4000=0 250 0 16 16 1024 0 0 0.017853

ou, mais genericamente

cldevice_versão_nomecanônico=a b c d e f g h i

Uma entrada será criada automaticamente no Anselrc para cada dispositivo recém-detectado quando você iniciar o Ansel pela primeira vez, com o nome canônico correto do dispositivo e o número da versão. Os parâmetros a - i são definidos da seguinte forma e podem ser editados manualmente:

a. avoid atomics
1 = avoid atomics; 0 = use atomics
Atomic operations in OpenCL are a special method of data synchronization and are only used in a few modules. Unfortunately, some old AMD/ATI devices are extremely slow in processing atomics and, on these cards, it is better to process the affected modules on the CPU rather than accepting an ultra-slow GPU codepath. Set this parameter to 1 if you experience slow processing within modules like local contrast or if you get intermittent system freezes. Please note that this should not affect any card manufactured since 2015.
b. micro nap
padrão 250
Em um caso ideal, você manterá sua GPU 100% ocupada ao processar o pixelpipe. No entanto, se sua GPU também precisar atualizar sua tela e o Ansel estiver usando-a em 100%, pode não haver tempo suficiente para essa tarefa. Isso geralmente se manifestará como atualizações irregulares da interface ao deslocar a imagem, realizar um zoom ou ao mover controles deslizantes. Para resolver esse problema, o Ansel pode adicionar pequenas pausas em seu processamento do pixelpipe para que a GPU possa recuperar o fôlego e realizar atividades relacionadas à interface gráfica. O parâmetro “micro nap” (micro soneca) controla a duração dessas pausas em microssegundos. Nos sistemas atuais, você está bastante seguro com o valor padrão, mesmo para placas gráficas integradas. Se você estiver usando vários dispositivos ou não estiver usando sua GPU dedicada para desenhar na tela, esse valor poderá ser definido como 0 para o dispositivo não desktop.
c. pinned memory
0 = use gui to select mode; 1 = enforce pinned transfer; 2 = disable pinned transfer
During tiling huge amounts of memory need to be transferred between host and device. On some devices direct memory transfers to and from an arbitrary host memory region may give a large performance penalty. This is especially noticeable when exporting large images on smaller graphics cards or while using newer modules like diffuse or sharpen or the guided laplacians mode in the highlight reconstruction module.

There is no safe method or general rule to predict whether or not this parameter will provide a performance benefit, so you will have to experiment for yourself. This mode can also be set globally by setting the “tune OpenCL performance” option to “memory transfer” (in Preferences > Processing > CPU, GPU, Memory), in which case this parameter should be set to 0. Otherwise, you can enable/disable it at a device level using this parameter.

d. clroundup wh / e. clroundup ht
Esses parâmetros devem ser deixados com seus valores padrão – testes não mostraram nenhum benefício em usar outros valores.
f. número de manipuladores de eventos
Os manipuladores de eventos são usados pelo Ansel para monitorar o sucesso/falha dos kernels e fornecer informações de criação de perfil, mesmo que o pixelpipe seja executado de forma assíncrona. O número de manipuladores de eventos é um recurso limitado do seu driver OpenCL – embora possam ser reciclados, 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 para um determinado dispositivo, então o Ansel usa uma estimativa muito conservadora de 128 por padrão. Na maioria dos dispositivos e drivers atuais, você pode esperar que um número de até 1024 seja seguro e leve a um desempenho OpenCL ligeiramente melhor. Se o seu driver ficar sem manipuladores livres, você experimentará falhas nos kernels OpenCL com a mensagem de erro CL_OUT_OF_RESOURCES ou até mesmo travamentos ou congelamentos do sistema.

Um valor de 0 impedirá que o Ansel use quaisquer manipuladores de eventos. Isso impedirá que o Ansel monitore adequadamente o sucesso de seus kernels OpenCL, mas economiza alguma sobrecarga de driver, levando a um melhor desempenho. A consequência é que quaisquer falhas provavelmente levarão a saídas distorcidas sem que o Ansel perceba. Isso só é recomendado se você tiver certeza de que seu sistema é sólido como uma rocha.

g. modo assíncrono
1 = usar modo assíncrono; 0 = não usar
Este sinalizador controla a frequência com que o Ansel bloqueia o pixelpipe do OpenCL para obter um status de sucesso/falha dos kernels que foram executados. Para uma latência ideal, defina como 1, de forma que o Ansel execute o pixelpipe de forma assíncrona e tente usar o mínimo de interrupções/eventos possível. Se você tiver erros de OpenCL, como kernels com falha, redefina o parâmetro como 0 (o padrão). Isto fará com que o Ansel interrompa 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 1. Em caso de dúvida, deixe o padrão 0.
h. desabilitar dispositivo
0 = habilitar dispositivo; 1 = desabilitar dispositivo
Se o Ansel detectar um dispositivo com defeito, ele o marcará automaticamente como tal, definindo esse parâmetro como 1. Se você tiver um dispositivo que retorna muitos erros, poderá desativá-lo manualmente definindo este campo como 0.
i. benchmark
Quando o Ansel detectar um novo dispositivo em seu sistema, ele fará um pequeno benchmark e armazenará o resultado aqui. Você pode alterar isso de volta para 0 para forçar o Ansel a refazer o benchmark, mas na maioria dos casos você não deve editar essa configuração.

Nota: se o Ansel detectar uma chave de configuração de dispositivo “com erros”, ela será reescrita para os valores padrão.


configuração OpenCL específica de id

A second device-specific configuration key is also provided, which takes into account both the device name and the device id (just in case you have two identical devices). In this case, the usual key name cldevice_version_canonicalname is followed by _idX with X being the device id. For example, if the above example device was referred to as device 0, the second configuration setting would (by default) be cldevice_v4_quadrortx4000_id0=400.

Esta chave de configuração atualmente tem apenas um único parâmetro definido:

forced headroom (default 400)
The amount of memory (in MB) that will not be used by Ansel during OpenCL processing. This setting is only valid if you set preferences > processing > tune OpenCL performance to “memory size”.

Se você definir este parâmetro para zero (0) então, na primeira execução de um pixelpipe, o Ansel tentará determinar quanta memória GPU está realmente disponível e usa isso (com uma margem de segurança de 100MB) como a quantidade máxima de memória que o Ansel usará, pelo restante da sua sessão. Isso geralmente é seguro, a menos que você inicie outros aplicativos (que usam uma quantidade razoável de memória da GPU) enquanto o Ansel está em execução. Caso contrário, o uso dessa opção pode levar a erros de falta de memória, o que fará com que o Ansel retorne à CPU, reduzindo significativamente o desempenho. Você pode desativar e ativar esta opção para solicitar que o Ansel execute seu cálculo de memória novamente (no início da próxima execução do pixelpipe). Observe que existem problemas conhecidos com a auto-detecção de memória em drivers Nvidia mais novos, assim a auto-detecção deve ser usada com cuidado e por isso é desabilitada por padrão.

Se você tiver certeza de que nenhum aplicativo (ou seu sistema operacional) usa o dispositivo específico, você pode definir este parâmetro como 1 para o dispositivo não usado para que o Ansel use toda a memória desse dispositivo.

O padrão de 400 MB deve ser adequado para a maioria dos sistemas. Se você encontrar problemas de desempenho devido ao Ansel voltar para a CPU, tente alterá-lo para 600 ou desabilitar o “ajuste para o tamanho da memória”.

outras chaves de configuração

As seguintes chaves de configuração adicionais também estão disponíveis no Anselrc:

cldevice_version_canonicalname_building
Esta opção é usada ao compilar kernels OpenCL e pode ser fornecida para ajuste de desempenho ou para contornar bugs. Você deve remover quaisquer kernels existentes para recompilá-los com as novas opções. Forneça uma string vazia para recompilar sem nenhuma opção. Remova a configuração inteiramente para recompilar com as opções padrão. O padrão é -cl-fast-relaxed-math
opencl_synch_cache
Se definido como “true”, este parâmetro forçará o Ansel 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 Ansel 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 do 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.