Come estensione della risposta di Moyner , il chip on sqrt
è di solito una rsqrt
radice quadrata reciproca che calcola . Quindi se nel tuo codice utilizzerai solo1/r(se stai facendo dinamica molecolare, lo sei), puoi calcolaredirettamente e salvare te stesso la divisione. Il motivo per cuiviene calcolato inveceche la sua iterazione di Newton non ha divisioni, solo aggiunte e moltiplicazioni.a → 1 / a--√1 / rr = rsqrt(r2)
rsqrt
sqrt
Come nota a margine, anche le divisioni vengono calcolate iterativamente e sono quasi lente come rsqrt
nell'hardware. Se stai cercando efficienza, stai meglio cercando di rimuovere le divisioni superflue.
Alcune architetture più moderne come le architetture POWER di IBM non forniscono di rsqrt
per sé, ma una stima accurata di alcuni bit, ad esempio FRSQRTE . Quando un utente chiama rsqrt
, questo genera una stima e quindi una o due (quante quante sono necessarie) iterazioni dell'algoritmo di Newton o Goldschmidt utilizzando regolari moltiplicazioni e aggiunte. Il vantaggio di questo approccio è che le fasi di iterazione possono essere pipeline e interfogliate con altre istruzioni senza bloccare la FPU (per una panoramica molto bella di questo concetto, anche se su architetture più vecchie, vedere la tesi di dottorato di Rolf Strebel ).
Per i potenziali di interazione, l' sqrt
operazione può essere completamente evitata utilizzando un interpolante polinomiale della potenziale funzione, ma il mio lavoro (implementato in mdcore
) in quest'area mostra che, almeno su architetture di tipo x86, l' sqrt
istruzione è abbastanza veloce.
Aggiornare
Dal momento che questa risposta sembra ricevere un po 'di attenzione, vorrei anche affrontare la seconda parte della tua domanda, vale a dire vale davvero la pena provare a migliorare / eliminare operazioni di base come sqrt
?
Nel contesto delle simulazioni di dinamica molecolare o di qualsiasi simulazione basata su particelle con interazioni limitate al cutoff, c'è molto da guadagnare da algoritmi migliori per la ricerca dei vicini. Se usi elenchi di celle o qualcosa di simile per trovare vicini o creare un elenco di Verlet , calcolerai un gran numero di distanze spurie a coppie. Nel caso ingenuo, solo il 16% delle coppie di particelle ispezionate si troverà effettivamente entro la distanza di taglio reciproca. Sebbene non venga calcolata alcuna interazione per tali coppie, l'accesso ai dati delle particelle e il calcolo della distanza spuria a coppie comporta un costo elevato.
Il mio lavoro in quest'area ( qui , qui e qui ), così come quello di altri (ad esempio qui ), mostra come questi calcoli spuri possano essere evitati. Questi algoritmi per la ricerca del vicino superano persino gli elenchi di Verlet, come descritto qui .
Il punto che voglio sottolineare è che, sebbene possano esserci alcuni miglioramenti da ottenere dalla migliore conoscenza / sfruttamento dell'architettura hardware sottostante, ci sono anche vantaggi potenzialmente maggiori nel ripensare gli algoritmi di livello superiore.
rsqrtps
e AVXvrsqrtps
sono stime, ottengono i primi da 11 a 12 bit corretti e si dovrebbe perfezionare con una iterazione di Newton o due se si desidera una maggiore precisione. Queste sono le istruzioni 5/1 e 7/1 (latenza / throughput inverso) su Sandy Bridge (consultare i documenti Intel o le tabelle di istruzioni della nebbia di Agner che sono paragonabili alla moltiplicazione. Al contrario, la precisione completa(v)sqrtps
(o doppia precisione(v)sqrtpd
) richiede 10-43 / 10-43 (vedere le tabelle delle istruzioni per i dettagli)