Domanda
Questa è davvero prendendo il mio tempo. Non riuscivo a trovare un modo semplice per stima Flops per un codice che segue (l'anello), Quanto flop sono per una singola iterazione del ciclo:
float func(float * atominfo, float energygridItem, int xindex, int yindex)
{
...
for (atomid=0; atomid<numatoms*4; atomid+=4)
{
float dy = coory - atominfo[atomid+2];
float dysqpdzsq = (dy * dy) + atominfo[atomid+3];
float dx1 = coorx1 - atominfo[atomid+1];
float s, y, t;
s = atominfo[atomid] * (1.0f / sqrtf(dx1*dx1 + dysqpdzsq));
y = s - energycomp1;
t = energyvalx1 + y;
energycomp1 = (t - energyvalx1) - y;
energyvalx1 = t;
}
...
}
Sembra semplice, ma mi sono confuso con alcuni altri numeri dati in precedenza, quindi sarebbe bello se qualcuno può dare un numero esatto.
Grazie.
Soluzione
Vedo (in ordine crescente di complessità):
- 8 integrazioni (inc. Sottrazioni)
- 3 moltiplicazioni
- 1 reciproca-radice quadrata ??li>
Come questi si relazionano tra loro dipende fortemente dalla famiglia di CPU.
Altri suggerimenti
Prova a prendere il codice assembly intermedio o exe decompilare.
Poi contare tutte le operazioni a virgola mobile (in codice assembly x86 cominciano con prefisso F
come FSIN
).
io reputo 12 più uno sqrt (che è probabile che utilizza il metodo di Newton, che è un anello), ma che dipende dal tipo di dati di alcune variabili che non è stato specificato, e il risultato della compilazione (che può aggiungere di più, o ottimizzare alcune operazioni).
Io conto ogni +, /, -., Oppure * dove l'espressione contiene almeno una variabile in virgola mobile, così indici dell'array e invariante di ciclo non contano, e questi sono interi operazioni
Provare a utilizzare una libreria di misurazione delle prestazioni come PAPI, danno astrazioni a contatori hardware che sarebbe la vostra migliore migliore per misurare il flop. PAPI_FLOPS.