2012-02-12 13 views
7

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).

Respuesta

4

Puede usar oprofile. O pseudo-perfilador de un pobre: ​​ejecuta el programa bajo gdb, detente y mira donde está parado. "valgrind --tool = cachegrind" le mostrará qué tan eficientemente se utiliza la memoria caché de la CPU.

La integración de Monte Carlo parece ser un algoritmo muy intensivo en memoria. Intente estimar cómo se usa el ancho de banda de memoria. Puede ser el factor limitante para el rendimiento de su programa. Además, si su sistema es solo de 2 núcleos con hyperthreading, no debería funcionar mucho más rápido con 4 hilos, en comparación con 2 hilos.

Cuestiones relacionadas