Ho scritto diverse funzioni di copia alla ricerca di una buona strategia di memoria su PowerPC. L'utilizzo dei registri Altivec o fp con hint cache (dcb *) raddoppia le prestazioni su un semplice ciclo di copia byte per i dati di grandi dimensioni. Inizialmente soddisfatto, ho inserito una normale memepia per vedere come si confronta ... 10 volte più veloce del mio meglio! Non ho intenzione di riscrivere memcpy, ma spero di imparare da esso e accelerare diversi filtri di immagini semplici che passano la maggior parte del loro tempo spostando i pixel da e verso la memoria.Cosa rende memcpy di Apple PowerPC così veloce?
L'analisi degli squali rivela che il loro ciclo interno utilizza dcbt per il prefetch, con 4 letture vettoriali, quindi 4 scritture vettoriali. Dopo aver modificato la mia funzione migliore per trasportare 64 byte per iterazione, il vantaggio prestazionale di memcpy è ancora imbarazzante. Sto usando dcbz per liberare larghezza di banda, Apple non usa nulla, ma entrambi i codici tendono ad esitare nei negozi.
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
Qualcuno ha qualche idea sul perché codice molto simile ha un divario di prestazioni così drammatico? Mi piacerebbe marinare i filtri delle immagini reali in qualunque cosa stia usando la memcpia salsa segreta!
Ulteriori informazioni: Tutti i dati sono allineati con vettori. Sto facendo copie filtrate dell'immagine, non sostituendo l'originale. Il codice funziona su PowerPC G4, G5 e Cell PPU. La versione di SPU Cell è già incredibilmente veloce.
CacheGrind non funziona assolutamente su PPC/Darwin. –
@Nick, sei sicuro? http://en.wikipedia.org/wiki/Valgrind "A partire dalla versione 3.4.0, Valgrind supporta Linux su x86, x86-64 e PowerPC" –
@Andreas: funziona su * linux *, ma sicuramente non su Darwin. L'unico supportato (ea malapena) Darwin è x86. –