Pregunta

El máximo teórico de ancho de banda de memoria para un procesador Core 2 con memoria de doble canal DDR3 es impresionante: según el Artículo de Wikipedia sobre la arquitectura, 10+ o 20+ gigabytes por segundo. Sin embargo, las llamadas stock memcpy () no logran esto. (3 GB / s es el más alto que he visto en tales sistemas). Probablemente, esto se debe a la necesidad del proveedor del sistema operativo de que memcpy () se ajuste a cada línea de procesador en función de las características del procesador, por lo que una implementación de memcpy () Debería ser razonable en un gran número de marcas y líneas.

Mi pregunta: ¿Existe una versión sintonizada y de alta disponibilidad para los procesadores Core 2 o Core i7 que se puede utilizar en un programa C? Estoy seguro de que no soy la única persona que lo necesita, y sería una gran pérdida de esfuerzo para todos micro-optimizar su propio memcpy ().

¿Fue útil?

Solución

Si especifica / ARCH: SSE2 a MSVC, debería proporcionarle un memcpy sintonizado (al menos, el mío lo hace).

Si falla, use los intrínsecos de carga / almacenamiento alineados con SSE para copiar la memoria en grandes porciones, empleando un Dispositivo de Duff de lecturas de palabras donde sea necesario para tratar la cabecera y la cola de los datos para llegar a un límite alineado. También tendrás que usar los intrínsecos de la administración de caché para obtener un buen rendimiento.

Su factor limitante es probablemente fallas de caché y ancho de banda de southbridge, en lugar de ciclos de CPU. Dado que siempre habrá mucho más tráfico en el bus de memoria, normalmente estoy contento de obtener aproximadamente el 90% del rendimiento del ancho de banda teórico de la memoria en tales operaciones.

Otros consejos

Cuando midió el ancho de banda, ¿tuvo en cuenta que memcpy era tanto una lectura como una escritura, por lo que 3 GB / s de memoria copiada son en realidad 6 GB / s de ancho de banda?

Recuerde, el ancho de banda es el máximo teórico: el uso en el mundo real será mucho menor. Por ejemplo, una página falla y su ancho de banda se reducirá a MB / s.

memcpy / memmove son intrínsecos del compilador y generalmente estarán en línea para rep movsd (o las instrucciones SSE apropiadas si su compilador puede apuntar a eso). Puede ser imposible mejorar el codegen sobre esto, ya que las CPU modernas manejarán muy, muy bien las instrucciones de los representantes como estas.

Podrías escribir el tuyo. Intente utilizar el compilador de optimización de inteligencia directamente apuntar a la arquitectura?

Intel también produce algo llamado VTune (compilador e idioma independientes) para optimizar aplicaciones.

Aquí hay un artículo sobre la optimización de un motor de juego.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top