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.¿Cuáles son algunos trucos que un procesador hace para optimizar el código?
Respuesta
Wikipedia tiene una lista bastante completa de las técnicas de optimización here.
+0: Responde cómo los compiladores optimizan el código, no cómo lo hacen los procesadores. –
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 :)
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).
Pregunta relacionada: http://stackoverflow.com/questions/286629/what-is-mean-by-memory-fences – CesarB
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.
- 1. ¿Cuáles son algunos consejos para optimizar el código de ensamblado generado por un compilador?
- 2. ¿Cuáles son algunos recursos que puedo usar para aprender a perfilar/optimizar?
- 3. ¿Cuáles son algunos recursos para aprender MSIL?
- 4. ¿Cuáles son algunos indicios de que un algoritmo debe paralelizarse?
- 5. ¿Cuáles son algunos guiones de shell interesantes?
- 6. ¿Cuáles son algunos EWD imperdibles?
- 7. ¿Cuáles son algunos usos de los cierres para OOP?
- 8. ¿Cuáles son algunos ejemplos impresionantes de código funcional?
- 9. ¿Cuáles son tus trucos favoritos de optimización de código de bajo nivel?
- 10. ¿Cuáles son algunos buenos recursos informáticos para un programador ciego?
- 11. ¿Cuáles son algunos recursos para aprender el cálculo de Lambda?
- 12. ¿Cuáles son algunos buenos recursos de DirectX para un principiante?
- 13. ¿Cuáles son las ventajas de un procesador de 64 bits?
- 14. ¿El enlace de datos excesivo hace que la aplicación WPF sea lenta? ¿Cuáles son las técnicas de optimización disponibles?
- 15. ¿Cuáles son los mejores trucos de depuración con Weld/CDI?
- 16. ¿Cuáles son algunos de los mejores recursos para aprender MSBuild?
- 17. ¿Cuáles son algunos ejemplos de interfaces Go?
- 18. ¿Cuáles son algunos ISP decentes que host Subversion
- 19. ¿Cuáles son algunos buenos complementos para desarrollar Java en VIM?
- 20. ¿Cuáles son algunos buenos tutoriales de Wireshark?
- 21. ¿Cuáles son algunos buenos minimizadores css y js para el código de producción?
- 22. ¿Cuáles son algunos buenos recursos para estudiar el código fuente de Hadoop?
- 23. ¿Cuáles son algunos métodos de refactorización para reducir el tamaño del código compilado?
- 24. ¿Cuáles son algunos buenos libros UX?
- 25. ¿Cuáles son algunos sitios importantes que usan Amazon EC2?
- 26. ¿Cuáles son algunos buenos perfiladores PHP que se pueden utilizar?
- 27. ¿Cuáles son algunos usos válidos para spEL (Spring Expression Language)?
- 28. ¿Cuáles son algunos malentendidos comunes sobre TDD?
- 29. ¿Cuáles son algunos buenos perfiladores .NET?
- 30. ¿Cuáles son algunos de los proyectos de código abierto mejor escritos que haya visto?
Podría por favor actualice a esta frase en la forma de una pregunta? –
¿Te refieres al compilador? Porque obtendrás respuestas muy diferentes ... –
¿Qué compilador? ¿Cual plataforma? –