language agnostic - ¿Cuáles son algunos trucos que hace un procesador para optimizar el código?
language-agnostic optimization (4)
El más importante sería el reordenamiento de acceso a la memoria.
Sin vallas 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).
Se puede encontrar un muy buen tratamiento del tema en la documentación 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).
Estoy buscando cosas como la reordenación de código que incluso podría romper el código en el caso de un procesador múltiple.
La respuesta de DavidK es correcta, sin embargo, también es muy importante conocer 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 usa un bloqueo mutex, pero raramente es suficiente 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 de javas.
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 video realmente bueno de Herb Sutter hablando de esto aquí:
http://video.google.com/videoplay?docid=-4714369049736584770
Todos deberían ver esto :)
Wikipedia tiene una lista bastante completa de técnicas de optimización aquí .