2008-08-09 15 views
5

Estoy trabajando en un proyecto donde necesitamos más rendimiento. Con el tiempo, hemos seguido evolucionando el diseño para trabajar más en paralelo (tanto enhebrado como distribuido). Luego, el último paso ha sido mover parte de él en una máquina nueva con 16 núcleos. Me doy cuenta de que tenemos que volver a pensar cómo hacemos las cosas para escalar a esos muchos núcleos en un modelo de memoria compartida. Por ejemplo, el asignador de memoria estándar no es lo suficientemente bueno.Escalar aplicaciones multiproceso en máquinas multinúcleo

¿Qué recursos recomendaría la gente?

Hasta ahora, he encontrado que la columna de Sutter, el Dr. Dobbs, es un buen comienzo. Acabo de recibir The Art of Multiprocessor Programming y The O'Reilly book on Intel Threading Building Blocks

Respuesta

5

Un par de otros libros que van a ser útiles son:

Además, considere confiar menos en el estado compartido entre concu procesos actuales Escalará mucho, mucho mejor si puede evitarlo, ya que podrá parcelar unidades de trabajo independientes sin tener que hacer tanta sincronización entre ellas.

Incluso si necesita compartir algún estado, vea si puede particionar el estado compartido del procesamiento real. Eso le permitirá hacer la mayor parte del procesamiento en paralelo, independientemente de la integración de las unidades de trabajo completadas al estado compartido. Obviamente, esto no funciona si tiene dependencias entre las unidades de trabajo, pero vale la pena investigar en lugar de simplemente asumir que el estado siempre será compartido.

3

Es posible que desee comprobar Google's Performance Tools. Han lanzado su versión de malloc que usan para aplicaciones de subprocesos múltiples. También incluye un buen conjunto de herramientas de creación de perfiles.

1

El asignador en FreeBSD recibió recientemente una actualización para FreeBSD 7. El nuevo se llama jemaloc y aparentemente es mucho más escalable con respecto a varios subprocesos.

No mencionó qué plataforma está utilizando, por lo que tal vez este asignador esté disponible para usted. (Creo Firefox 3 uses jemalloc, incluso en las ventanas Así que los puertos deben existir en alguna parte..)

2

Como monty python diría "y ahora para algo completamente diferente", podría probar un lenguaje/entorno que no use hilos, sino procesos y mensajes (sin estado compartido). Uno de los más maduros es erlang (y este excelente y divertido libro: http://www.pragprog.com/titles/jaerlang/programming-erlang). Puede que no sea exactamente relevante para sus circunstancias, pero aún puede aprender muchas ideas que puede aplicar en otras herramientas.

Para otros entornos:

.Net tiene F # (para aprender la programación funcional). JVM tiene Scala (que tiene actores, muy parecido a Erlang, y es un lenguaje híbrido funcional).También existe el marco "fork join" de Doug Lea para Java que hace mucho del trabajo duro para usted.

0

Eche un vistazo a Hoard si está asignando mucha memoria.

Haga rodar su propio Lock Free List. Un buen recurso está aquí, está en C# pero las ideas son portátiles. Una vez que te acostumbras a cómo funcionan, comienzas a ver otros lugares donde se pueden usar y no solo en las listas.

0

Tendré que retirar Hoard, Google Perftools y jemalloc en algún momento. Por ahora estamos usando scalable_malloc de Intel Threading Building Blocks y funciona bastante bien.

Para bien o para mal, usamos C++ en Windows, aunque gran parte de nuestro código se compilará con gcc. A menos que haya una razón convincente para pasar a redhat (la principal distribución de Linux que usamos), dudo que valga la pena el dolor de cabeza/problemas políticos para mover.

Me encantaría usar Erlang, pero hay mucho aquí para rehacerlo ahora. Si pensamos en los requisitos en torno al desarrollo de Erlang en una configuración de telecomunicaciones, son muy similares a nuestro mundo (comercio electrónico). El libro de Armstrong está en mi para leer la pila :)

En mis pruebas para escalar de 4 núcleos a 16 núcleos, aprendí a apreciar el costo de cualquier bloqueo/contención en la porción paralela del código. Afortunadamente, tenemos una gran parte que se escala con los datos, pero incluso eso no funcionó al principio debido a un bloqueo adicional y al asignador de memoria.

Cuestiones relacionadas