Pregunta

Estoy buscando cosas como reordenar el código que incluso podría romper el código en el caso de un procesador múltiple.

¿Fue útil?

Solución

Wikipedia tiene una lista bastante completa de técnicas de optimización aquí .

Otros consejos

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

En ausencia de vallas de memoria o instrucciones de serialización, el procesador es libre de reordenar los accesos de 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-barreras.txt .

La mayoría de las veces, es mejor usar primitivas de bloqueo de su compilador o biblioteca estándar; estos están bien probados, deberían tener todas las barreras de memoria necesarias y probablemente estén bastante optimizados (optimizar las primitivas de bloqueo es complicado; incluso los expertos pueden equivocarse a veces).

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

Sin embargo, dado que este es un tema interesante: los trucos que usan los compiladores y procesadores 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 correctamente bloqueados antes de acceder, el código se comportará como si se ejecutara secuencialmente.

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

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

Todos deberían ver esto :)

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 consistencia secuencial y uso de mutex, su código aún puede romperse cuando los diferentes hilos que se ejecutan en los núcleos de la CPU almacenan en caché los datos. Algunos lenguajes, Java es un ejemplo, aseguran el estado de los datos entre subprocesos cuando se usa un bloqueo de exclusión mutua, pero rara vez es suficiente para garantizar simplemente que no haya dos subprocesos que puedan acceder a los datos al mismo tiempo. Debe usar el mutex de manera correcta para asegurarse de que el tiempo de ejecución del idioma sincronice el estado de los datos entre los dos subprocesos. 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 trata en el modelo de memoria javas.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top