2008-11-07 6 views

Respuesta

0

Wikipedia tiene una lista bastante completa de las técnicas de optimización here.

+3

+0: Responde cómo los compiladores optimizan el código, no cómo lo hacen los procesadores. –

0

Sí, pero ¿cuál es exactamente tu pregunta?

Sin embargo, dado que este es un tema interesante: los trucos que los compiladores y procesadores usan para optimizar el código no deberían romper el código, incluso con múltiples procesadores, en ausencia de condiciones de carrera en ese código. Esto se denomina garantía de coherencia secuencial: si su programa no tiene condiciones de carrera y todos los datos están bloqueados correctamente antes de acceder, el código se comportará como si se hubiera ejecutado de forma secuencial.

Hay un muy buen video de Herb Sutter hablar de esto aquí:

http://video.google.com/videoplay?docid=-4714369049736584770

Todo el mundo debería ver este :)

13

El más importante sería el reordenamiento de acceso a la memoria.

En ausencia de cercas de memoria o instrucciones de serialización, el procesador puede reordenar los accesos a la memoria. Algunas arquitecturas de procesador tienen restricciones sobre cuánto pueden reordenar; Alpha es conocido por ser el más débil (es decir, el que puede reordenar más).

Puede encontrar un buen tratamiento del tema en la documentación de la fuente del kernel de Linux, en Documentation/memory-barriers.txt.

La mayoría de las veces, es mejor utilizar primitivas de bloqueo de su compilador o biblioteca estándar; estos están bien probados, deben tener todas las barreras de memoria necesarias y probablemente estén bastante optimizados (la optimización de las primitivas de bloqueo es complicada, incluso los expertos pueden equivocarse a veces).

+0

Pregunta relacionada: http://stackoverflow.com/questions/286629/what-is-mean-by-memory-fences – CesarB

0

La respuesta de DavidK es correcta, sin embargo, también es muy importante tener en cuenta el modelo de memoria para su idioma/tiempo de ejecución. Incluso sin condiciones de carrera y con coherencia secuencial y uso de mutex, su código aún puede romperse cuando los datos están siendo almacenados en caché por diferentes hilos que se ejecutan en los diferentes núcleos de la CPU. Algunos lenguajes, Java es un ejemplo, aseguran el estado de los datos entre subprocesos cuando se utiliza un bloqueo mutex, pero rara vez es suficiente simplemente para asegurar que no haya dos subprocesos que puedan acceder a los datos al mismo tiempo. Debe usar el mutex de forma correcta para asegurarse de que el idioma de ejecución sincroniza el estado de datos entre los dos hilos. En java esto se hace haciendo que los dos hilos se sincronicen en el mismo objeto.

Aquí hay una buena página que explica el problema y cómo se maneja en el modelo de memoria javas.

http://gee.cs.oswego.edu/dl/cpj/jmm.html

Cuestiones relacionadas