2009-04-24 11 views
9

Vorrei utilizzare l'High Performance Event Timer (HPET) per uno strumento di profilatura che consente di eseguire rapidamente misurazioni di altissima precisione. timeGetTime non fornisce una risoluzione sufficiente a 1 ms e QueryPerformanceCounter è molto più lento per lettura di quanto vorrei. Mi sono imbattuto nell'HPET mentre cercavo il problema, ma non riesco a vedere alcun esempio su come raggiungerlo.HPET è direttamente accessibile in Windows?

Così posso usarlo direttamente (l'assemblaggio va bene), o devo fare affidamento sugli strumenti di sincronizzazione multimediale/ad alte prestazioni già integrati nell'API Win32?

+1

Mi piacerebbe usarlo anche, come immagino di subire lo stesso problema nel mio profiler. – leppie

+0

Questo sembra correlato: http://msdn.microsoft.com/en-us/magazine/cc163996.aspx –

+0

Come ulteriore aggiornamento: RDTSC e 'QueryPerformanceCounter' non sono sicuri da usare quando il sistema ha una frequenza base non costante (overclocking all'interno del sistema). Windows non riesce a regolare la frequenza QPC in quei casi che portano a tempi di inclinazione. In questi casi, HPET e ACPI rimangono le uniche alternative per un timer affidabile. ** Pertanto, questa domanda rimane aperta e senza risposta. ** – Mysticial

risposta

-1

Ho trovato this info mentre scavo, e sembra che possa essere il modo più conveniente. Lo proverò quando avrò il coraggio di scavare nel montaggio. :)

UPDATE

Ho provato questo con il mio profiler. anche se un po 'più veloce, sembra che io abbia ancora tonnellate di overhead :((non mi sono preoccupato del tempismo perché non sembrava essere abbastanza vantaggioso)

+3

No! Non usare RDTSC, farà cose strane su macchine multicore. Ogni core con il proprio contatore può dare effetti come le funzioni che assumono ect negativo. I contatori Timestamp non sono sempre sincronizzati! Ci sono stato, fatto. –

+0

E dire che tieni traccia del thread? Come può influire sulla differenza? – leppie

+1

Tenere traccia del thread ti dirà solo che * potrebbe * essere un problema, non se * è * un problema o come risolverlo. Per usare RDTSC in sicurezza, * devi * collegare il thread a un core specifico. Non è possibile calcolare in modo sicuro la differenza RDTSC tra i core dallo spazio utente. –

1

Sono anche interessato a usare HPET, ma come Il modo in cui lo capisco, QueryPerformanceCounter e QueryPerformanceFrequency in realtà accedono al contatore e all'orologio per HPET, e funziona in Windows XP (vedi, ad esempio, http://www.geisswerks.com/ryan/FAQS/timing.html).

Quindi, per quanto riguarda il codice di temporizzazione, penso utilizzando QueryPerformanceCounter si ottiene effettivamente l'accesso al contatore che costituisce la base di HPET, e questo è tutto presente nel chipset (piuttosto che nel processore)

+2

Come ho capito, XP NON supporta HPET, quindi QueryPerformanceCounter sta attualmente utilizzando RDTSC. –

+0

Vedere https://en.wikipedia.org/wiki/High_Precision_Event_Timer#cite_note-7 (nota su XP SP3 in "Uso e compatibilità") per una spiegazione completa. In breve, XP utilizza un "best effort" HPET _emulation_ con software e hardware diversi. –

Problemi correlati