Come si può assicurare il codice viene eseguito senza la variabilità nel tempo di esecuzione a causa della cache?

StackOverflow https://stackoverflow.com/questions/69049

Domanda

In un'applicazione embedded (scritto in C, su un processore a 32 bit) con hard real-vincoli di tempo, il tempo di esecuzione di codice critico (appositamente interrupt) deve essere costante.

Come si fa a garantire che la variabilità nel tempo non si è presentato in esecuzione del codice, in particolare a causa del processore cache (sia L1, L2 o L3)?

Nota che abbiamo a che fare con il comportamento della cache a causa della enorme effetti sulla velocità di esecuzione (a volte più di 100:1, control'accesso a RAM).La variabilità introdotta a causa della specifica architettura del processore sono in nessun posto vicino la grandezza della cache.

È stato utile?

Soluzione

Se si può mettere le mani sull'hardware, o lavorare con qualcuno che può, è possibile disattivare la cache.Alcune Cpu hanno un pin che, se collegata a terra, invece di potere (o forse un altro modo), consente di disattivare tutte le cache interne.Che darà la prevedibilità, ma non la velocità!

In mancanza di questo, forse in certi luoghi il software di codice può essere scritto volutamente riempire la cache di spazzatura, in modo che tutto ciò che accade può essere garantita per essere un cache miss.Fatto a destra, che può dare prevedibilità, e forse potrebbe essere fatto solo in determinati luoghi, in modo da la velocità può essere migliore di totalmente disabilitazione della cache.

Infine, se la velocità non importa - l'attenta progettazione del software e dei dati, come se il vecchio giorno di programmazione per un antico 8-bit CPU - tieni abbastanza piccolo per tutti, per adattarsi cache L1.Io sono sempre stupito di come on-board cache in questi giorni sono più grandi di tutti di RAM su un minicomputer indietro (mumble decennio).Ma questo sarà un lavoro duro e richiede intelligenza.Buona fortuna!

Altri suggerimenti

Due possibilità:

Disabilitare la cache del tutto.L'applicazione verrà eseguito più lento, ma senza alcuna variabilità.

Pre-caricare il codice nella cache e "bloccare".La maggior parte dei processori forniscono un meccanismo per fare questo.

Sembra che stai parlando di un processore x86 famiglia che non è costruito con sistemi in tempo reale in mente, quindi non c'è alcuna garanzia reale per la costante di tempo di esecuzione (CPU può riordinare micro-istruzioni, c'è un branch prediction e istruzioni di prefetch queue che viene svuotata ogni volta quando la CPU a torto prevede salti condizionali...)

Questa risposta ti suono sprezzante, ma è destinato a far pensare:

Solo eseguire il codice una sola volta.

Il motivo per cui dico che è perché tanto sarà variabile e si potrebbe anche non avere il controllo su di esso.E qual è la vostra definizione di tempo?Supponiamo che il sistema operativo decide di mettere il vostro processo nella coda di attesa.

Infine, dispone di imprevedibilità dovuta per le prestazioni della cache, la latenza di memoria, I/O del disco, e così via.Tutti questi si riducono a una cosa;a volte ci vuole tempo per ottenere le informazioni nel processore, in cui il codice può utilizzare.Compreso il tempo necessario per recuperare/decodificare il codice stesso.

Inoltre, quanto la varianza è accettabile per voi?Potrebbe essere che stai bene con 40 millisecondi, o stai bene con 10 nanosecondi.

A seconda del dominio di applicazione, si può ulteriormente appena maschera di sopra o al di nascondere la varianza.Computer grafica di persone sono state rendering a schermo spento buffer per gli anni a nascondere la varianza del tempo di rendering di ogni fotogramma.

La soluzione tradizionale è sufficiente rimuovere come molti noti a tasso variabile cose possibili.Caricare i file in RAM, per riscaldare la cache ed evitare IO.

Se si fanno tutte le chiamate di funzione critica di codice 'inline', e di ridurre il numero di variabili, in modo che si può lasciare che loro hanno il 'registro' tipo.Questo dovrebbe migliorare il tempo di esecuzione del programma.(Probabilmente è necessario compilare, in modo speciale, dal momento che i compilatori di questi giorni tendono a ignorare la "registrazione" tag)

Sto assumendo che tu abbia abbastanza memoria per non causare errori di pagina quando si tenta di caricare qualcosa dalla memoria.Gli errori di pagina può prendere un sacco di tempo.

Si potrebbe anche dare un'occhiata al codice assembly generato, per vedere se ci sono un sacco di rami e di memoria esteso che potrebbe cambiare il codice in esecuzione.

Se un interrupt accade in esecuzione di codice in esso richiederà più tempo.Hai interrupt/eccezioni abilitato?

Preallocare di memoria e assicurarsi che interrompe non influiscono sulla cache (impossibile, a destra).

/Allan

Capire il tuo peggior caso di runtime per le operazioni complesse e utilizzare i timer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top