unificada tipos sociales resueltos rendimiento reglas redes rams que problema politica para memoria mandamientos manager las influencia importancia grafico factores estructura escritura ejercicios diseño directa dieter determinan definicion curso correspondencia community caracteristicas caché cache buen bloques biografia c++ caching inline

c++ - tipos - reglas del buen diseño



la disminución de la caché falla a través de un buen diseño (6)

Además, si haces C ++ y multihilo, debes considerar el uso compartido falso, la localidad y el calor de los datos en la memoria caché de cada procesador. Eso puede hacer una gran diferencia. También especialmente en la computación multiproceso, las cosas de manera LIFO son más eficientes que la computación de una manera FIFO, pero también son válidas en la arquitectura de un solo procesador.

¿Cómo disminuir el número de errores de caché posibles al diseñar un programa en C ++?

¿Las funciones de alineación ayudan en todo momento? ¿o es bueno solo cuando el programa está limitado por la CPU (es decir, el programa está orientado a computación y no orientado a E / S)?


Aquí hay algunas cosas que me gusta considerar al trabajar en este tipo de código.

  • Considere si desea "estructuras de matrices" o "matrices de estructuras". Lo que quiere usar dependerá de cada parte de los datos.
  • Intente mantener las estructuras en múltiplos de 32 bytes para que empaqueten las líneas de caché de manera uniforme.
  • Particiona tus datos en elementos fríos y calientes. Si tiene una matriz de objetos de la clase o, y usa ox, oy, oz con frecuencia, pero solo ocasionalmente necesita acceder a oi, oj, ok, entonces considere poner ox, oy y oz juntos y mover el i, j, y k partes a una estructura de datos axilar paralela.
  • Si tiene matrices multidimensionales de datos, entonces con los diseños habituales de orden de filas, el acceso será muy rápido cuando escanee a lo largo de la dimensión preferida y muy lento a lo largo de los demás. Asignarlo a lo largo de una curve space-filling lugar ayudará a equilibrar las velocidades de acceso al atravesar en cualquier dimensión. (Las técnicas de bloqueo son similares, solo son orden Z con una base más grande).
  • Si debe incurrir en un error de caché, intente hacer todo lo posible con esos datos para amortizar el costo.
  • ¿Estás haciendo algo multihilo? Tenga cuidado con la ralentización de los protocolos de coherencia de caché. Bandejas de pad y pequeños contadores para que estén en líneas de caché separadas.
  • SSE en Intel proporciona algunos intrínsecos de captación previa si sabe a qué accederá con la suficiente antelación.

Evite usar memoria dinámica cuando no sea necesario. Usar nuevos, eliminar, punteros inteligentes, etc., tiende a extender los datos de su programa a través de la memoria. Eso no es bueno. Si puede mantener la mayoría de sus datos en conjunto (al declarar objetos en la pila, por ejemplo), su caché seguramente funcionará mucho mejor.


Hay un video muy bonito de Herb Sutter que menciona este tema aquí

Para operaciones vinculadas a datos

  1. utilizar matrices y vectores sobre listas, mapas y conjuntos

  2. procesar por filas sobre columnas


La ejecución de las funciones de la línea de entrada puede dañar la caché de instrucciones. Y si la memoria no se puede vincular, es poco probable que haga mucha (si la hay) diferencia.

Como siempre, cualquier optimización debe ser informada por perfiles en lugar de corazonadas. Sin mencionar que tendrá que comprender lo que el generador de perfiles le está diciendo, lo que implica familiaridad con el lenguaje ensamblador y las características particulares de la plataforma para la que está optimizando.

Un poco viejo ahora, pero el "Libro negro de programación de gráficos" de Mike Abrash todavía tiene muchos buenos consejos generales.


Permitir que la CPU realice una captación de datos de manera eficiente. Por ejemplo, puede disminuir el número de memoria caché no procesa matrices multidimensionales por filas en lugar de por columnas, desenrollar bucles, etc.

Este tipo de optimización depende de la arquitectura del hardware, por lo que es mejor usar algún tipo de generador de perfiles específico de plataforma como Intel VTune para detectar posibles problemas con la memoria caché.