2012-04-25 16 views
13

En mi aplicación, en un momento dado necesito realizar cálculos en un gran bloque contiguo de datos de memoria (100 s de MB). Lo que estaba pensando era seguir captando la parte del bloque que mi programa tocará en el futuro, de modo que cuando realice cálculos en esa parte, los datos ya estén en la memoria caché.Recuperación de datos en la memoria caché para x86-64

¿Alguien me puede dar un ejemplo simple de cómo lograr esto con gcc? Leí _mm_prefetch en algún lugar, pero no sé cómo usarlo correctamente. También tenga en cuenta que tengo un sistema multinúcleo, pero cada núcleo trabajará en una región diferente de memoria en paralelo.

+6

Si el acceso a la memoria es secuencial, el precaptador de hardware ya lo hará por usted. Por lo tanto, probablemente no obtenga mucha mejoría con la captación previa manual. – Mysticial

+6

Consulte esta pregunta para ver un ejemplo de dónde la recuperación previa realmente ayuda: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

Quiere decir que el precaptador de hardware de alguna manera reconoce que estoy utilizando áreas contiguas en la memoria y traigo esas partes en caché ? – pythonic

Respuesta

16

gcc utiliza funciones integradas como interfaz para las instrucciones de bajo nivel. En particular para su caso __builtin_prefetch. Pero solo debería ver una diferencia mensurable al usar esto en los casos en que el patrón de acceso no es fácil de predecir automáticamente.

13

Las CPU modernas tienen una captación previa automática bastante buena y es posible que descubra que hace más daño que bien si intenta iniciar la captación previa de software. Es muy probable que haya mucha más "fruta fácil de colgar" en la que pueda concentrarse para la optimización si descubre que realmente tiene un problema de rendimiento. La captura previa suele ser una de las últimas cosas que puede intentar, cuando está desesperado por obtener un porcentaje de rendimiento más.

+4

+1 He intentado realizar la búsqueda previa en al menos 10 ocasiones diferentes. Solo una vez logré obtener una aceleración notable. (el que vinculé en los comentarios.) – Mysticial

+4

Estoy de acuerdo, incluso en CPU más antiguas con captación previa automática menos sofisticada, siempre fue difícil obtener algún beneficio de la captación previa de software; los principales problemas son que normalmente se necesita iniciar la captación previa de unos cientos de ciclos de reloj antes de tiempo y, por supuesto, necesita tener algún ancho de banda de memoria de repuesto que pueda aprovechar, que a menudo no es el caso en el código de alto rendimiento. –

+1

La captura previa no es necesaria, hasta que sea necesario. En mi aplicación actual, los patrones de acceso a memoria no fueron detectados por el pre-buscador de hardware. Y desafortunadamente, cambiar esos patrones de acceso para ser más amigables antes de la captura no era una opción. Por lo tanto, _mm_prefetch. El rendimiento disminuyó en ~ 10%, pero logramos los números de latencia que queríamos. Fue una compensación muy consciente que se hizo después de mucho perfilar a través de perf y vtune. – quixver

Cuestiones relacionadas