c++ - ¿Pueden los punteros "no nativos" dañar el rendimiento del caché?
optimization prefetch (2)
Por lo que puedo decir, los buscadores previos de hardware al menos detectarán y buscarán pasos constantes a través de la memoria. Además, puede monitorear los patrones de acceso a los datos , lo que sea que realmente signifique. Lo que me llevó a preguntarme: ¿los prefiladores de hardware basan sus decisiones en datos reales almacenados en la memoria, o simplemente en el comportamiento que exhibe un programa?
La razón por la que pregunto es porque ocasionalmente usaré punteros "no nativos" como punteros. Un ejemplo simple de esto sería una matriz preasignada de cosas y pequeños enteros que indexan esta matriz en lugar de punteros. Si necesito almacenar una gran cantidad de estos "punteros", los ahorros en memoria pueden acumularse rápidamente y, a su vez, mejorar indirectamente el rendimiento del caché al usar menos memoria.
Pero por lo que sé, esto podría interferir con el funcionamiento de los buscadores previos de hardware. ¡O no!
Ciertamente puedo imaginar, realista o no, una unidad de búsqueda previa que examina las líneas de caché que ingresan en la memoria caché L1 para direcciones de punteros nativos y comienza a buscarlas en L2 o algo así. En ese caso, mi inteligente truco para salvar la memoria de repente parece menos decididamente inteligente.
Entonces, ¿qué hacen realmente los prefetchers de hardware modernos? ¿Se pueden hacer tropezar con punteros "no nativos"?
El prefetcher de hardware no ve los punteros, ve las direcciones de memoria. No importa de dónde vino la dirección o qué tipo tenía en el programa de C ++ que escribió. Simplemente mira en qué dirección se le dice a la CPU que lea o escriba.
Entonces, no, la indexación en una matriz no va a ser una cosa nueva y aterradora que la CPU nunca haya encontrado antes.
La captación previa de estructuras de datos vinculadas (LDS) sigue siendo un problema conocido en la arquitectura de la computadora. No estoy familiarizado con ninguna CPU moderna que realmente haga eso, pero en teoría es posible. A lo largo de los años, ha habido varios artículos de la academia que proponen algunas variaciones sobre:
- Un HW dedicado que puede detectar valores similares a una dirección dentro de las líneas de caché recuperadas, y emitir prefetches a estas direcciones.
- Una técnica asistida por compilador en la que el compilador reconoció las dependencias de la estructura de datos e inserta parches previos de SW u otras sugerencias.
Ambos métodos pueden verse afectados por su técnica (el primero sería inútil, el segundo podría funcionar si el compilador es lo suficientemente inteligente).
Por supuesto, tendría que ejecutar realmente en una máquina así, por lo que es solo teórico, y no debería cambiar su práctica si le funciona bien, pero esto demuestra que el perfil debe ser específico por microarquitectura y El sistema, y lo que le ayuda en un caso, puede ser menos eficiente en otro.
En general, no solo confíe en que la CPU haga o no realice una optimización (a menos que esté documentada), siempre verifique que obtenga el comportamiento esperado.
Por cierto, tenga en cuenta que incluso si el HW ve el contenido de la memoria, todavía está en el espacio de direcciones virtuales, el HW tendría que hacer algún tipo de traducción a la dirección física para usarlo, por lo que en un sentido no hay t tiene que ser cualquier sobrecarga adicional.
Algunos bibliografía: