He escrito varias funciones de copia en busca de una buena estrategia de memoria en PowerPC. El uso de los registros Altivec o fp con sugerencias de caché (dcb *) duplica el rendimiento en un bucle de copia de bytes simple para datos grandes. Inicialmente satisfecho con eso, lancé una memcpy regular para ver cómo se comparaba ... ¡10 veces más rápido que lo mejor! No tengo intención de volver a escribir memcpy, pero espero aprender de él y acelerar varios filtros de imagen simples que pasan la mayor parte del tiempo moviendo píxeles hacia y desde la memoria.¿Qué hace que ApplePC memcpy sea tan rápido?
El análisis de tiburones revela que su bucle interno usa dcbt para captar previamente, con 4 lecturas vectoriales, luego 4 escrituras vectoriales. Después de ajustar mi mejor función para transportar también 64 bytes por iteración, la ventaja de rendimiento de memcpy sigue siendo embarazosa. Estoy usando dcbz para liberar ancho de banda, Apple no usa nada, pero ambos códigos tienden a vacilar en las tiendas.
prefetch dcbt future dcbt distant future load stuff lvx image lvx image + 16 lvx image + 32 lvx image + 48 image += 64 prepare to store dcbz filtered dcbz filtered + 32 store stuff stvxl filtered stvxl filtered + 16 stvxl filtered + 32 stvxl filtered + 48 filtered += 64 repeat
¿Alguien tiene algunas ideas sobre qué código muy similar tiene una diferencia de rendimiento tan dramático? ¡Me encantaría marinar los filtros de imagen reales en cualquier salsa secreta que memcpy esté usando!
Información adicional: Todos los datos están alineados con vectores. Estoy haciendo copias filtradas de la imagen, no reemplazando el original. El código se ejecuta en PowerPC G4, G5 y Cell PPU. La versión de Cell SPU ya es increíblemente rápida.
CacheGrind absolutamente no funciona en PPC/Darwin. –
@Nick, ¿estás seguro? http://en.wikipedia.org/wiki/Valgrind "A partir de la versión 3.4.0, Valgrind admite Linux en x86, x86-64 y PowerPC" –
@Andreas: Funciona en * linux *, pero definitivamente no es Darwin. El único soportado (y apenas) Darwin es x86. –