2010-10-20 10 views
7

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?

+0

Duplicado: http://stackoverflow.com/questions/794632 –

+2

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í ... –

+0

@EamonNerbonne: Si solo preguntas por la arquitectura x64, ponlo en tu pregunta. –

Respuesta

5

Hay una pregunta que pregunta casi lo mismo here. Puede leerlo desde el CPUID si tiene ganas de profundizar en algún ensamblaje. Tendrás que escribir un código específico de plataforma para esto, por supuesto.

Probablemente ya esté familiarizado con Agner Fog's manuals for optimization que proporciona la información de caché para muchos procesadores populares. Si puede determinar las CPU esperadas que encontrará, puede simplemente codificar el tamaño de la línea de caché y buscar la información del proveedor de la CPU para establecer el tamaño de la línea.

+0

No estaba familiarizado con eso, ¡gracias! –

Cuestiones relacionadas