⚠️ Este é um site de tradução não oficial, sem relação com a ImageMagick Studio LLC. Para informações oficiais, consulte a página original (https://imagemagick.org/openmp/).

Execução Paralela (OpenMP)

Muitos dos algoritmos internos do ImageMagick são paralelizados em threads para aproveitar os ganhos de velocidade oferecidos pelos chips de processador multicore e pelo OpenMP. O OpenMP é uma especificação de API para programação paralela. Se o seu compilador suportar diretivas OpenMP (por exemplo, gcc, Visual Studio 2005), o ImageMagick inclui o suporte automaticamente. Para verificar, procure pelo recurso OpenMP do ImageMagick com este comando:

$ magick identify -version
Version: ImageMagick 7.0.10-50 2021-01-04 Q16 https://imagemagick.org
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)

Com o OpenMP habilitado, a maioria dos algoritmos do ImageMagick é executada em paralelo em todos os núcleos do seu sistema. O ImageMagick normalmente divide o trabalho de modo que cada thread processe 64 linhas de pixels. À medida que as linhas são concluídas, o OpenMP atribui mais blocos de linhas de pixels a cada thread até que o algoritmo seja concluído. Por exemplo, se você tem um sistema quad-core e tenta redimensionar uma imagem, o redimensionamento ocorre em 4 núcleos (8 se o hyperthreading estiver habilitado).

Você pode aumentar ainda mais o desempenho reduzindo a contenção de bloqueios com a biblioteca de alocação de memória tcmalloc. Para habilitá-la, adicione --with-tcmalloc à linha de comando do configure ao compilar o ImageMagick.

Os Perigos da Execução Paralela

Pode ser difícil prever o comportamento em um ambiente paralelo. O desempenho pode depender de vários fatores, incluindo o compilador, a versão da biblioteca OpenMP, o tipo de processador, o número de núcleos, a quantidade de memória, se o hyperthreading está habilitado, a combinação de aplicativos que estão sendo executados simultaneamente com o ImageMagick ou o algoritmo de processamento de imagem específico que você utiliza. A única maneira de ter certeza do desempenho ótimo, em termos do número de threads, é fazer um benchmark. O ImageMagick inclui threading progressivo ao fazer benchmark de um comando e retorna o tempo decorrido e a eficiência para uma ou mais threads. Isso pode ajudá-lo a identificar quantas threads são mais eficientes no seu ambiente. Aqui está um exemplo de benchmark para as threads 1-8:

$ magick -bench 40 model.png -sharpen 0x1 null:
Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070

Um desempenho melhor está correlacionado com valores mais altos de IPS (iterações por segundo). No nosso exemplo, 8 núcleos são ótimos. No entanto, em certos casos pode ser ótimo definir o número de threads como 1 (por exemplo, -limit thread 1) ou desabilitar o OpenMP completamente. Para desabilitar esse recurso, adicione --disable-openmp à linha de comando do seu script configure, depois recompile e reinstale o ImageMagick.