2016-04-06 23 views
5

Cercherò di essere il più chiaro possibile con la mia domanda (non facile ... non è chiaro anche per me). Supponiamo di avere un set di istruzioni IF ... THEN con più operandi, ad esempioVelocità di esecuzione delle istruzioni condizionali rispetto alle funzioni matematiche

IF ((a==0) && (b==1) && (c==1)) THEN x=1 
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2- 

e così via

che potrei sostituire tutti quei FI con una sola funzione matematica come x = a * n1 + b * n2 + c * n3 (questo è solo per darti un'idea, in realtà è più complesso, ma anche gli IF e gli operandi sono molti di più)

La funzione proviene da una rete neurale artificiale precedentemente addestrata.

La mia sensazione istintiva è che quando si tratta di esecuzione, la funzione dovrebbe richiedere molto meno tempo dei FI, ma è solo una sensazione istintiva che deriva dal mio vecchio background in assemblea dove ci hanno insegnato che un'istruzione condizionale prende piede più tempo di uno aritmetico.

Puoi confermare questo? magari fornirmi anche qualche link dove potrei trovare una spiegazione?

Grazie in anticipo ragazzi!

+0

Credo che il tuo istinto è giusto. Ho seguito alcune domande di ottimizzazione qui su SO su risultati sorprendenti dall'eliminazione di filiali. –

+0

https://en.wikipedia.org/wiki/Branch_predictor e gli articoli a cui rimanda forniranno un inizio. I guadagni relativi dipendono dalla complessità della funzione e dai possibili rami ma, con i processori moderni, i predittori di pipeline e diramazioni sono spesso rilevanti. – Peter

+2

Forse dovresti controllare prima che il tuo compilatore [non possa già farlo] (http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing-this-bit -test) prima di fubar il tuo programma. E naturalmente * sempre * verifica prima che sia effettivamente * possibile * fare la differenza, utilizzare un profiler. Il motto del programmatore è di misurare tre volte, tagliare una volta. –

risposta

4

La sensazione di intestino è corretta.

Il problema è che i processori moderni hanno una pipeline e nella pipeline le prossime istruzioni x vengono caricate sequenzialmente pronte per l'esecuzione. Se si dispone di una diramazione, un'istruzione if, il processore non sa quale percorso di codice verrà eseguito successivamente, quindi supporrà di utilizzare il predittore di diramazione , ma se ha torto deve lanciare fuori tutta la pipeline e ricominciare il ramo corretto.

I predittori di ramificazioni nei processori moderni sono abbastanza buoni, ma se si dispone di qualcosa che ha una probabilità 50/50 di andare in un modo o nell'altro, si avranno un sacco di stalli di gasdotti.

Questo è il motivo per cui eliminare le affermazioni se sono buone, specialmente nei cicli stretti.

Questo sembra avere qualche buona spiegazione: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

+0

Pensaci per la tua risposta Verificherò! – Maxyone

Problemi correlati