2010-07-01 10 views
11

Ho un'applicazione che funziona con poche CPU computazionali, ma principalmente accessi alla memoria (allocando oggetti e spostandoli, c'è qualche codice numerico o aritmetico).Come verificare se l'app è legata alla CPU o legata alla memoria?

Come posso misurare la parte del tempo che sto spendendo in latenze di accesso alla memoria (a causa di errori di cache), con la CPU inattiva?

Devo notare che l'app è in esecuzione su un guest Hyper-V; Non sono sicuro che porrà qualche difficoltà, ma potrebbe.

risposta

2

Si può sempre profile l'applicazione per vedere dove trascorre la maggior parte del tempo.

In questo modo puoi imparare molto sul comportamento della tua applicazione e sui modelli di accesso ai dati.

Se si sta usando Linux, hanno una vasta gamma di strumenti disponibili per la profilazione, come:

EDIT:

Per una misurazione più precisa delle prestazioni del processore e degli accessi alla memoria, è possibile provare anche lo AMD CodeAnalyst Performance Analyzer. Here sono istruzioni su come usarlo con i processori Intel, anche se non l'ho provato da solo.

Un altro strumento che potrebbe anche essere utile è lo Intel Performance Tuning Utility.

+0

Vedete, ho già profilato l'applicazione. Ha un profilo delle prestazioni ragionevolmente piatto con il tempo impiegato da varie funzioni di accesso alla memoria come memset, memmove ecc. (In realtà si tratta di un'applicazione .NET in esecuzione su Windows e queste funzioni vengono chiamate dal CLR durante la costruzione degli oggetti). Mi piacerebbe sapere se il loro tempo è dominato dalla CPU o dal bus di memoria. – jkff

+1

Si potrebbe provare ** AMD CodeAnalyst Performance Analyzer **: http://developer.amd.com/cpu/codeanalyst/Pages/default.aspx o http://www.virtualdub.org/blog/pivot/entry.php ? id = 288 –

2

A meno che non si abbia una latenza incorporata nel sistema, basta eseguire l'applicazione per un po 'di tempo su una macchina dedicata e controllare i contatori della CPU. Se l'app utilizza il 100% del core della CPU a cui può accedere, è vincolato alla CPU. Altrimenti, trascorre del tempo su altre cose come allocazioni di memoria e I/O.

+2

Quindi, le latenze di accesso alla memoria non sono incluse nei contatori delle prestazioni di utilizzo della CPU? – jkff

+1

Non penso che siano specificatamente * esclusi *, ma quel tipo di granularità è difficile da definire. Il tuo processo ottiene la CPU per un periodo di tempo fisso, ma l'attesa sui carichi della cache conta ancora come "utilizzo" della CPU, dal momento che il tuo processo non è stato sfrattato. Non so che è possibile ottenere davvero numeri duri per il tempo di attesa della memoria senza spiare il bus. – TMN

+1

Con 'Callgrind' è possibile ottenere i contatori per mancanze della cache' L1' e 'L2'. Aggrega questi dati con le informazioni di profilazione e ottieni una stima del livello di efficacia dei modelli di accesso ai dati per la tua applicazione. –

Problemi correlati