¿Construcciones del lenguaje de programación para la optimización de caché?

7

La optimización clara de los usos del caché está destinada a mejorar la eficiencia de mi programa. Sorprendentemente, no veo demasiados lenguajes de programación que tengan este tipo de característica. Así que aquí está mi pregunta:

  1. ¿Qué tipo de construcciones de lenguaje has visto que ayudan a mejorar el uso del caché?
  2. ¿Cómo innovar en el uso de caché, ya que la mayoría de los sistemas no revelarán fácilmente cosas como su tamaño de caché L1? (Windows tiene API o quizás / proc / cpuinfo en Linux, pero estoy buscando algo más simple para el desarrollador intermedio)
pregunta Fanatic23 05.12.2010 - 06:14

2 respuestas

4

Esta es solo una lista que no está en la cabeza.

Conceptos

  • localidad espacial
  • Localidad temporal.
  • Patrones de acceso a memoria fácilmente predecibles.
    • Por ejemplo, leer / escribir megabytes de datos secuencialmente no es del todo ineficaz, porque la CPU puede predecir la siguiente dirección y leer automáticamente de forma anticipada.

Construcciones en lenguaje de programación.

  • Directivas de alineación de datos.
  • Cambio entre matriz de estructura y estructura de matriz.
  • Contenedores de datos vectorizados proporcionados por bibliotecas de alto rendimiento.

El compilador ya ha hecho parte del trabajo por ti. Por ejemplo, los grupos de funciones que están estrechamente relacionados (por ejemplo, es probable que se llamen en una secuencia sucesiva) se compilarán en instrucciones binarias y luego se almacenarán cerca unas de otras, de modo que residan dentro del mismo bloque de páginas de 4KB. Simplemente no hay forma de que un desarrollador atienda dichos detalles manualmente.

Para los idiomas compilados nativos, las variables locales se almacenan en la pila, y es probable que el área más cercana a la posición de pila actual se almacene en caché. Si se asigna una variable grande (varios KB o más) desde la pila, la CPU puede tener que desalojar otra cosa del caché para dejar espacio. Por otro lado, si la variable grande se usa con mucha frecuencia, entonces la asignación desde la pila se puede justificar.

    
respondido por el rwong 05.12.2010 - 09:33
0

no hay respuesta trivial aquí. en un sistema de multiprocesamiento (es decir, cualquier sistema operativo moderno), no puede hacer muchas suposiciones sobre el estado de la memoria virtual. Sin embargo, puedes hacer algunas observaciones generales con respecto a las estructuras de datos. las técnicas de hashing pueden permitirle desarrollar una afinidad más confiable entre los datos y el almacenamiento, mientras que las estructuras de datos como los árboles tenderán a emplear compensaciones que degradan la efectividad del almacenamiento en caché ... PERO tome esto con una gran advertencia ... perfilando los beneficios de Una técnica sobre otra será extremadamente difícil y específica para su propia arquitectura y jerarquía de memoria.

la respuesta más corta aquí es para el "desarrollador intermedio", está mucho mejor usando bibliotecas bien probadas que tienen límites de rendimiento claramente establecidos y patrones de consumo de memoria bien entendidos. intentar optimizar el almacenamiento en caché en una plataforma de hardware específica parece ser un último y doloroso recurso para los problemas más difíciles.

    
respondido por el Brad Clawsie 05.12.2010 - 06:29

Lea otras preguntas en las etiquetas