2009-03-05 14 views
10

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 Wikipedia article en la arquitectura, 10+ o más de 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 al requisito del proveedor del sistema operativo de que memcpy() esté ajustado para cada línea de procesador en función de las características del procesador, por lo que una implementación stock memcpy() debe ser razonable en una gran cantidad de marcas y líneas.memcpy/memmove completamente optimizado para la arquitectura Core 2 o Core i7?

Mi pregunta: ¿Existe una versión altamente disponible y sintonizada para los procesadores Core 2 o Core i7 que pueden utilizarse en un programa en C? Estoy seguro de que no soy la única persona que lo necesita, y sería un gran desperdicio de esfuerzo para todos optimizar micro su propio memcpy().

Respuesta

6

Si especifica/ARCH: SSE2 a MSVC debería proporcionarle una memcpy ajustada (al menos, la mía lo hace).

En caso contrario, utilice los intrínsecos de carga/almacenamiento alineados SSE usted mismo para copiar la memoria en trozos grandes, utilizando un dispositivo Duff's de lecturas de palabras donde sea necesario para manejar la cabeza y cola de datos para obtener un límite alineado. También deberá usar los intrínsecos de gestión de caché para obtener un buen rendimiento.

Su factor limitante es probablemente fallas de caché y ancho de banda Southbridge, en lugar de ciclos de CPU. Dado que siempre habrá mucho tráfico en el bus de memoria, normalmente me complace llegar a aproximadamente el 90% del rendimiento del ancho de banda de la memoria teórica en dichas operaciones.

+1

La memcpy de MSVC se vectoriza cuando se cumplen estas condiciones (aproximadamente, no soy un experto en esto): las direcciones de fuente y de destino están alineadas por lo menos de 8 bytes (64 bits) y el tamaño de movimiento es superior un cierto umbral. La alineación de 64 bits proviene de la garantía de MSVC de que su propio 'malloc' devuelve la alineación de 64 bits. Luego, en compilaciones de 32 bits, se usará SSE2 de 128 bits (con mezcla de 64 bits si es necesario), y en compilaciones de 64 bits, usará registros de propósito general de 64 bits (con el dispositivo de Duff) para hacer el movimiento porque cuando se hace correctamente es "lo suficientemente rápido" en comparación con SSE2. – rwong

+1

/arch: CPU mínimos requisitos de arquitectura, uno de: SSE2 - (predeterminado) permitir el uso de las instrucciones disponibles con SSE2 habilitado CPU Esta es vc visual del vs2013.update3 estudio ++ salida . En el cual SSE2 es el valor predeterminado, basado en mi punto de referencia, use/ARCH: SSE2 no mejorará el rendimiento de memcpy, y yo evalué, incluso/ARCH: AVX no mejora el rendimiento de memcpy. – zhaorufei

2

Puedes escribir la tuya. Intente usar el intel optimising compiler para apuntar directamente a la arquitectura?

Intel también produce algo llamado VTune (compilador e idioma independiente) para la optimización de aplicaciones.

Aquí hay un article en la optimización de un motor de juego.

+0

¿Cuánta mejora proporciona el compilador de Intel sobre gcc con el mismo interruptor de optimización ... decir -O3? –

+0

La última vez que lo probé, alrededor del 35%, pero eso fue hace unos años. – Crashworks

+0

¿Podría el detractor dejar un comentario? Gracias. –

7

Al medir el ancho de banda, ¿tuvo en cuenta que memcpy era tanto de lectura como de escritura, por lo que 3 GB/s de memoria copiados es en realidad 6 GB/s de ancho de banda?

Recuerde, el ancho de banda es el máximo teórico: el uso del mundo real será mucho menor. Por ejemplo, un error de página y su ancho de banda caerá a MB/s.

memcpy/memmove son intrínsecos al compilador y por lo general serán inline a rep movsd (o las instrucciones de SSE apropiadas si su compilador puede apuntar a eso). Puede ser imposible mejorar el codegen con respecto a esto, ya que las CPU modernas manejarán las instrucciones de rep de esta manera muy, muy bien.