Qual è il costo computazionale di


26

Uno dei principali problemi che dobbiamo affrontare nelle simulazioni molecolari è il calcolo delle forze dipendenti dalla distanza. Se possiamo limitare le funzioni di forza e distanza per avere anche poteri della distanza di separazione , allora possiamo semplicemente calcolare il quadrato della distanza e non dovremo preoccuparci di . Se ci sono poteri dispari, tuttavia, allora dobbiamo occuparci di .rr2=rrrr=r2

La mia domanda è: quanto costa il calcolo come implementato nelle librerie di linguaggi comuni (C / C ++, Fortran, Python), ecc.? Esistono davvero molti miglioramenti delle prestazioni regolando manualmente il codice per architetture specifiche?X

Risposte:


39

Come estensione della risposta di Moyner , il chip on sqrtè di solito una rsqrtradice 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.un'1/un'1/rr = rsqrt(r2)rsqrtsqrt

Come nota a margine, anche le divisioni vengono calcolate iterativamente e sono quasi lente come rsqrtnell'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 rsqrtper 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' sqrtoperazione 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' sqrtistruzione è 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.


6
Anche SSE rsqrtpse AVX vrsqrtpssono 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)
Jed Brown,

@JedBrown: grazie per averlo sottolineato! Avevo dimenticato che SSE e le sue estensioni forniscono anche questo.
Pedro,

16

La radice quadrata è implementata nell'hardware sulla maggior parte dei processori, ovvero ci sono istruzioni di assemblaggio specifiche e le prestazioni dovrebbero essere comparabili nella maggior parte dei linguaggi perché è molto difficile confondere l'implementazione. Probabilmente non sarai mai in grado di battere l'istruzione FSQRT, poiché è stata progettata da alcuni progettisti hardware intelligenti.

Il modo in cui viene implementato nell'hardware può variare, ma è probabilmente una sorta di iterazione a virgola fissa, ad esempio il metodo di Newton-Raphson che esegue un numero specifico di iterazioni fino a quando non viene calcolato il numero di cifre richieste. I metodi iterativi nell'hardware sono in genere molto più lenti rispetto ad altre operazioni, poiché è necessario completare diversi cicli prima che il risultato sia pronto.

Ci sono anche alcune istruzioni SIMD per lo streaming che possono essere utilizzate sui registri XMM per calcoli vettoriali veloci disponibili qui . Questi registri sono abbastanza piccoli, ma se hai un numero noto di coordinate (diciamo, un sistema di coordinate cartesiane tridimensionali) possono essere un po 'più veloci.

Se la tua lingua è abbastanza bassa, puoi sempre digitare a una precisione inferiore o utilizzare un numero di precisione inferiore per le tue coordinate. La precisione singola è spesso più che sufficiente e da quello che ricordo sarà più veloce quando si calcolano le radici quadrate poiché le iterazioni possono essere terminate prima.

Dovrebbe essere abbastanza facile fare il benchmark di diverse lingue: basta scrivere una lunga serie di numeri casuali su un file, caricarlo usando lingue diverse e quindi cronometrare le radici quadrate.


0

Ci possono essere miglioramenti delle prestazioni, ma prima si dovrebbe profilare per sapere che calcolare il reciproco di sqrt è il collo di bottiglia (e non, diciamo, caricare le posizioni e salvare le forze).

Il progetto GROMACS MD è nato dall'idea di sfruttare i dettagli del formato IEEE in virgola mobile per seminare uno schema di iterazione di Newton-Raphson per calcolare un'approssimazione accettabile al reciproco della radice quadrata (vedi Appendice B.3 di http: / /www.gromacs.org/Documentation/Manual ), ma non ci sono CPU HPC in uso in cui GROMACS utilizza ancora questa idea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.