Precarica i valori o meno su Raspberry Pi

1

Dì che vuoi ruotare qualcosa di 360 passi 100 volte. Ora hai una scelta per pre-calcolare i valori 360 sin e cos una volta e poi usa i valori memorizzati 100 volte, oppure puoi calcolare sin e cos ogni volta.

Per quanto ne so sulle moderne CPU, è meglio calcolare ogni volta sin e cos perché la CPU è molto più veloce dell'accesso alla memoria. Tuttavia, su una CPU più lenta come quella usata su un RPi (non sulla versione 2), ciò rimarrà comunque valido? o è abbastanza lento che i valori di pre-calcolo sono migliori? Un Raspberry Pi ha un processore single core da 700 MHz.

    
posta DaedalusAlpha 17.08.2015 - 10:25
fonte

3 risposte

3

As far as I understand on modern CPUs you're better off just calculating sin and cos each time because the CPU is many times faster than memory access anyway.

Certo, l'accesso alla memoria principale costa molti cicli di CPU, in cui una CPU sarebbe inattiva in attesa di dati.

Ma ciò ignora completamente che le CPU moderne hanno cache di memoria (alcune hanno 3 livelli di cache sul die, comunemente indicati come L1, L2 e L3). Questo accesso alla memoria è molto più rapido dell'accesso alla memoria principale (sebbene L1 sia più veloce di L2 che è più veloce di L3).

Se il tuo programma è progettato abbastanza bene e con la localizzazione della cache in mente, una variabile locale calcolata (il risultato dei tuoi calcoli sin e cos, per esempio) sarà prelevata dalla cache e non dalla memoria principale (o potrebbe anche risiedere in un Registro CPU). Questo sarà più veloce del ricalcolo.

Per vedere quale è più veloce, devi provare entrambi gli approcci, in uno scenario reale (quindi, utilizzando la tua applicazione effettiva) e cronometrare.

    
risposta data 17.08.2015 - 10:41
fonte
3

Ho eseguito alcuni test sul mio RPi e ho raggiunto queste conclusioni:

  • Facendo un ciclo di 100 volte su un LUT float con dimensione 360 (cioè 100 rotazioni complete con risoluzione 1 o 360 * 100 ricerche sin e 360 * 100 cos), la LUT è di ca. 10-20 volte più veloce del calcolo di sinf e cosf direttamente nel ciclo.

  • L'uso di una LUT doppia con le stesse dimensioni rende la LUT ca. 40 volte più veloce del calcolo di sin e cos direttamente nel ciclo.

Alcune cose da notare:

  • Il LUT è abbastanza piccolo da stare nella cache L1 16k del RPi, se presente dovevano usare LUT più grandi che potrebbero non finire nella cache L1 e nel il risultato potrebbe essere radicalmente diverso.
  • Ho usato solo un piccolo calcolo segnaposto nel ciclo per impedire al compilatore di ottimizzarlo. Con un ciclo interno più complicato la cache L1 potrebbe essere utilizzata.
  • Dato che questo è sin e cos è in realtà sufficiente creare ad esempio un LUT sin e usarlo anche per i valori cos (con un offset di 90 gradi), risparmiando un po 'di memoria.
risposta data 18.08.2015 - 10:41
fonte
0

La maggior parte delle lingue moderne eseguirà ricerche di tabelle anziché calcolare i valori di sin e cos. Se il valore è compreso tra due valori di tabella, farà la media dei due insieme (media ponderata).

Se non sbaglio, lo stesso dovrebbe valere per la chiamata di sin / cos in un programma raspberry pi, anche se sta ancora tecnicamente eseguendo una ricerca tabella che altrimenti potresti evitare pre-calcolando in un array.

La mia ipotesi è che il pre-calcolo dei valori di rotazione da usare una volta non sarebbe più veloce e si userebbe un po 'di memoria. Se devi eseguire un'altra rotazione, la differenza potrebbe essere marginale. Comunque il mio consiglio sarebbe di provarlo per essere sicuro.

    
risposta data 17.08.2015 - 10:41
fonte

Leggi altre domande sui tag