Processamento paralelo mais lento que sequencial?

Processamento paralelo mais lento que sequencial?

EDIT: Para quem se deparar com isso no futuro: Imagemagick usa uma biblioteca MP. É mais rápido usar os núcleos disponíveis se eles estiverem disponíveis, mas se você tiver trabalhos paralelos, isso não ajuda.

Faça um dos seguintes:

  • faça seus trabalhos em série (com Imagemagick em modo paralelo)
  • defina MAGICK_THREAD_LIMIT=1 para sua invocação do binário imagemagick em questão.

Ao fazer o Imagemagick usar apenas um thread, ele diminui a velocidade em 20-30% em meus casos de teste, mas significou que eu poderia executar um trabalho por núcleo sem problemas, para um aumento líquido significativo no desempenho.

Pergunta original:

Ao converter algumas imagens usando o ImageMagick, notei um efeito um tanto estranho. O uso de xargs foi significativamente mais lento que um loop for padrão. Como o xargs limitado a um único processo deve agir como um loop for, testei isso e descobri que era quase o mesmo.

Assim, temos esta demonstração.

  • Quad core (AMD Athalon X4, 2,6 GHz)
  • Trabalhando inteiramente em um tempfs (16g de RAM no total; sem troca)
  • Nenhuma outra carga importante

Resultados:

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real        0m3.784s
user        0m2.240s
sys         0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real        0m9.097s
user        0m28.020s
sys         0m0.910s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real        0m9.844s
user        0m33.200s
sys         0m1.270s

Alguém consegue pensar em uma razão pela qual a execução de duas instâncias deste programa leva mais que o dobro do tempo em tempo real e mais de dez vezes mais tempo em tempo de processador para concluir a mesma tarefa? Após esse golpe inicial, mais processos não parecem ter um efeito tão significativo.

Achei que poderia ter a ver com busca de disco, então fiz esse teste inteiramente na memória RAM. Poderia ter algo a ver com o funcionamento do Convert, e ter mais de uma cópia ao mesmo tempo significa que ele não pode usar o cache do processador com a mesma eficiência ou algo assim?

EDIT: Quando concluído com arquivos de 1000x 769 KB, o desempenho é o esperado. Interessante.

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.679s
user    5m6.980s
sys 0m6.340s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.152s
user    5m6.140s
sys 0m6.530s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real    2m7.578s
user    5m35.410s
sys     0m6.050s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 4 convert -auto-level

real    1m36.959s
user    5m48.900s
sys     0m6.350s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real    1m36.392s
user    5m54.840s
sys     0m5.650s

Responder1

Qual o tamanho dos arquivos que você deseja converter em comparação com o cache L1? Seu cache L2?

Sem uma análise melhor do interior, eu suspeitaria que a contenção do cache está fazendo com que suas CPUs fiquem ociosas enquanto esperam que os dados sejam armazenados novamente em cache porque os outros processos continuam expulsando coisas importantes da memória rápida.

Veja tambémessa resposta que dei no Stack Overflow.

informação relacionada