Ho letto che il sovraccarico di trasferimento tra CPU e GPU è un grosso collo di bottiglia nel raggiungimento di elevate prestazioni nelle applicazioni GPU / CPU. Perché è così?
La tua domanda ha due sensi:
- Perché questo (il trasferimento) è il collo di bottiglia?
- Quali sono le ragioni fisiche per questo?
Nel primo senso, è perché tutto il resto sulla tua macchina si muove molto più velocemente:
Mentre questo grafico è per CPU e memoria, grafici simili sono validi per la GPU. Il risultato è che se si desidera ottenere buone prestazioni, è necessario sfruttare al massimo ogni carico di memoria possibile.
È possibile tracciare questo con il modello roofline:
L'asse x mostra quante volte viene utilizzato ogni byte quando viene caricato dalla memoria. L'asse y è la prestazione in operazioni al secondo. Le linee diagonali sul lato sinistro sono regioni in cui la velocità della memoria limita il calcolo.
In quella regione puoi ottenere prestazioni migliori usando una memoria più veloce (come la memoria locale della GPU o le cache L3, L2 o L1 della CPU), in modo che una linea diagonale più alta ti limiti, o aumentando l'intensità aritmetica, quindi passa alla giusto. Le linee piatte nella parte superiore sono limiti sulla velocità di calcolo non elaborata una volta caricata la memoria. Può esserci una linea per operazioni diritte in virgola mobile, SSE2, AVX, ecc. In questo caso, il diagramma mostra che alcuni kernel profonde-learning riutilizzare i propri dati molto e può fare pieno uso di tutti gli operatori matematici speciali in un GPU, quindi l'unico modo per farli è più veloce di costruire un nuovo dispositivo: il TPU .
La tua seconda domanda: perché l'autobus è il collo di bottiglia? Ci sono una serie di ragioni tecnologiche, ma ignorale. I chip di Intel si stanno avvicinando a 8 nm tra i transistor. Le GPU sono da qualche parte in quel campo da baseball. Il bus, d'altra parte, è facilmente misurabile in pollici: 25 milioni di volte più lontano.
Supponendo un processore da 3 GHz, sono necessari circa 0,3 n per eseguire un'operazione.
Ci vogliono 0,25 n per un po 'per spostarsi su un bus da 3 pollici. Poiché ogni bit inviato sul bus richiede almeno 1 ciclo per l'invio e 1 ciclo per la ricezione, un trasferimento di bit completo richiede circa 0,9 ns. (Questo ignora un po 'di sovraccarico aggiuntivo sui messaggi che viene catturato da modelli come LogP .) Moltiplicalo per 1 MB e ottieni circa 1 ms per un trasferimento di dati. Nello stesso momento in cui stavi facendo quel trasferimento, avresti potuto fare un milione di altre operazioni. Quindi la fisica afferma che il bus è un limitatore fondamentale delle prestazioni.