Tengo un programa que escala mal a varios subprocesos, aunque, teóricamente, debe escalar linealmente: es un cálculo que se divide en fragmentos más pequeños y no necesita llamadas al sistema, llamadas a la biblioteca, bloqueo, etc. Correr con cuatro hilos es solo el doble de rápido que correr con un solo hilo (en un sistema de cuatro núcleos), mientras que yo esperaría un número más cercano a cuatro veces más rápido.Rendimiento y perfilado multiproceso
El tiempo de ejecución de las implementaciones con pthreads, C++ 0x hilos y OpenMP de acuerdo.
Para identificar la causa, probé gprof (inútil) y valgrind (no vi nada obvio). ¿Cómo puedo comparar de manera efectiva lo que está causando la desaceleración? ¿Alguna idea genérica sobre sus posibles causas?
- Actualización -
El cálculo implica la integración Monte Carlo y me di cuenta de que una cantidad razonable de tiempo se dedica a la generación de números aleatorios. Aunque todavía no sé por qué sucede esto con cuatro hilos, noté que el generador de números aleatorios no se vuelve a introducir. Al usar mutexes, el tiempo de ejecución explota. Volveré a implementar esta parte antes de buscar otros problemas.
Reimplement las clases de muestreo que mejoraron sustancialmente el rendimiento. El problema restante era, de hecho, contención de los cachés de CPU (fue revelado por cachegrind como Evgeny sospechaba).