Antecedentes: Implementé un algoritmo estocástico que requiere un orden aleatorio para lograr la mejor convergencia. Sin embargo, hacerlo obviamente destruye la localidad de memoria. Descubrí que, al precapturar los datos de la siguiente iteración, se reduce al mínimo el rendimiento.¿Cómo puedo captar previamente una región de memoria más fácilmente?
puedo precargar n líneas de caché utilizando _mm_prefetch
en un simple sistema operativo + compilador portable de la manera, en su mayoría - pero lo que es la longitud de una línea de caché? En este momento, estoy usando un valor codificado de 64, que parece ser la norma hoy en día en los procesadores x64, pero no sé cómo detectar esto en tiempo de ejecución, y a question about this last year found no simple solution.
He visto GetLogicalProcessorInformation en Windows, pero estoy preocupado por el uso de una API tan compleja para algo tan simple, y eso no funcionará en Mac o Linux de todos modos.
Quizás haya alguna otra API/intrínseca que pueda captar previamente una región de memoria identificada en términos de bytes (o palabras, o lo que sea) y me permita captar previamente sin conocer la longitud de la línea de caché?
Básicamente, ¿existe una alternativa razonable a _mm_prefetch
con #define CACHE_LINE_LEN 64
?
Duplicado: http://stackoverflow.com/questions/794632 –
Me doy cuenta de que existe una pregunta; sin embargo, no hay respuesta a mi pregunta, y es mucho más general (solo me preocupan las plataformas x64 en las que _mm_prefetch existe y solo para fines de captación previa). Quizás esto pueda resolverse sin obtener explícitamente la longitud de la línea de caché. No, no tengo muchas esperanzas aquí ... –
@EamonNerbonne: Si solo preguntas por la arquitectura x64, ponlo en tu pregunta. –