¿El procesamiento paralelo es más lento que el secuencial?

¿El procesamiento paralelo es más lento que el secuencial?

EDITAR: Para cualquiera que se encuentre con esto en el futuro: Imagemagick usa una biblioteca MP. Es más rápido usar los núcleos disponibles si están disponibles, pero si tiene trabajos paralelos, no es útil.

Haz una de las siguientes:

  • haz tus trabajos en serie (con Imagemagick en modo paralelo)
  • establezca MAGICK_THREAD_LIMIT=1 para su invocación del binario imagemagick en cuestión.

Al hacer que Imagemagick use solo un subproceso, se ralentiza entre un 20% y un 30% en mis casos de prueba, pero significó que podía ejecutar un trabajo por núcleo sin problemas, para un aumento neto significativo en el rendimiento.

Pregunta original:

Mientras convertía algunas imágenes usando ImageMagick, noté un efecto algo extraño. El uso de xargs fue significativamente más lento que un bucle for estándar. Dado que xargs limitados a un solo proceso deberían actuar como un bucle for, lo probé y descubrí que era más o menos lo mismo.

Así, tenemos esta demostración.

  • Cuatro núcleos (AMD Athalon X4, 2,6 GHz)
  • Trabajando completamente en tempfs (16 g de ram en total; sin intercambio)
  • Ninguna otra 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

¿Alguien puede pensar en una razón por la cual ejecutar dos instancias de este programa requiere más del doble de tiempo en tiempo real y más de diez veces más tiempo de procesador para completar la misma tarea? Después de ese golpe inicial, más procesos no parecen tener un efecto tan significativo.

Pensé que podría tener que ver con la búsqueda de disco, así que hice esa prueba completamente en la RAM. ¿Podría tener algo que ver con el funcionamiento de Convert y tener más de una copia a la vez significa que no puede usar la caché del procesador con tanta eficiencia o algo así?

EDITAR: cuando se hace con archivos de 1000x 769 KB, el rendimiento es el esperado. Interesante.

/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

Respuesta1

¿Qué tamaño tienen los archivos que desea convertir en comparación con su caché L1? ¿Tu caché L2?

Sin una mejor mirada al interior, sospecho que la contención de la caché está provocando que sus CPU estén inactivas mientras esperan que los datos se vuelvan a almacenar en la caché porque los otros procesos siguen expulsando cosas importantes de la memoria rápida.

Ver tambiénesta respuesta la di en Stack Overflow.

información relacionada