QueryPerformanceCounter PMC oder TCS?



  • Hi,..

    Jochen schrieb:

    Hi Gary Chanson,

    Display the quote

    GetTickCount does the following on XP-SP1:

    mov edx, 7FFE0000h
    mov eax, [edx]
    mul dword ptr [edx+4]
    shrd eax, edx, 18h
    retn
    

    Display the quote

    GetSystemTimeAsFileTime does the following on XP-SP1:

    Mark1: mov eax, ds:7FFE0018h
    mov edx, ds:7FFE0014h
    cmp eax, ds:7FFE001Ch
    jnz short Mark1
    mov ecx, [esp+arg_0]
    mov [ecx], edx
    mov [ecx+4], eax
    retn 4
    

    And no: it is not a better choice...
    In the normal case GetTickCount and GetSystem/LocalTime uses the same
    interrupt, and therfor it has the same resolution.

    It depends on the requirements of the "timestamp" what you choose as
    timestamp-function.

    1. If you use GetSystem/LocalTime you face the problem that sometimes the
    time might be changed forward or backward (daylight saving / time adjustment
    with Time-Server)

    2. If you use GetTickCount, you face the problem that it will overflow after
    49.7 days after starting the computer

    3. If you want to measure short intervals, you should consider to use
    QueryPerformanceCounter/Frequency

    Greetings
    Jochen

    My blog about Win32 and .NET
    http://blog.kalmbachnet.de/

    QueryPerformanceCounter ruft hingegen:

    _NtQueryPerformanceCounter@8:
    mov         eax,0A5h 
    mov         edx,7FFE0300h 
    call        dword ptr [edx] 
    ret         8    
    nop
    

    auf. Da ich die SW-Interrupts von MS nicht so kenne ist meine Frage ob der
    Performance Monitor Counter oder der Timer Stamp Counter eigentlich abgefragt
    wird,... und wenn der Performance Monitor Counter aufgerufen wird, was ist der
    essentielle unterschied zwischen diesem und dem TCS???
    (Der TCS wird ja nach dem Reset des Systems auch neu initialisiert....)

    Seid alle gegrüßt und habt dank



  • zeusosc schrieb:

    und wenn der Performance Monitor Counter aufgerufen wird, was ist der
    essentielle unterschied zwischen diesem und dem TCS???

    du meinst mit TCS den timestamp counter?
    Der Unterschied ist die Präzision: TSC +- 1ms,QPC -+100ns (zumindest in der Theorie)
    Beider Timer werden wohl über den PIT bzw. auf neuern Computern (2006+) den HPET gesteuert/implementiert.



  • Hi zeusosc,

    GetTickCount() und GetSystemTimeAsFileTime() greifen (in der unteren Ebene auf der Hardware-Layer) auf den Timer des ehemaligen 8250-Bausteins zu, dieser befindet sich heute in einem der Chipsatz- oder Peripherie-ICs.
    Größenordnung im Millisekunden (ms) Bereich.

    QueryPerformanceCounter() greift auf den TSC time stamp counter zu, der sich intern in der CPU (ab Pentium-Serie) befindet. Dieser wird mit dem Befehl "RDTSC" ausgelesen.
    Größenordnung im Mikro- bzw. Nanosekunden (µs bzw. ns) Bereich, ist also deutlich feiner aufgelöst.

    Siehe auch KB 172338 "How To Use QueryPerformanceCounter to Time Code":
    http://support.microsoft.com/kb/172338

    ABER:
    QPC bzw. TSC ist unzuverlässig geworden, seitdem es Dual- und Mehrkernprozessoren und/oder trickreiche Energiesparmodi in den CPUs gibt!
    Im Internet gibt es genug Quellen dafür.

    Der obige Timer (auf Basis des Timer-Bausteins 8250) hat zwar "grobe" Auflösung im ms-Bereich, ist dafür aber absolut zuverlässig, auch timeGetTime() nutzt diesen Timer.

    HTH,
    Martin



  • Mmacher schrieb:

    QueryPerformanceCounter() greift auf den TSC time stamp counter zu, der sich intern in der CPU (ab Pentium-Serie) befindet. Dieser wird mit dem Befehl "RDTSC" ausgelesen.

    das kann so nicht stimmen: es gibt ja die Funktion QueryPerformanceFrequency().





  • PIT__ schrieb:

    Mmacher schrieb:

    QueryPerformanceCounter() greift auf den TSC time stamp counter zu, der sich intern in der CPU (ab Pentium-Serie) befindet. Dieser wird mit dem Befehl "RDTSC" ausgelesen.

    das kann so nicht stimmen: es gibt ja die Funktion QueryPerformanceFrequency().

    Was ist das für ein Blödsinn? Was kann da nicht stimmen? 😮

    Es ist sehr wohl richtig was ich da geschrieben habe.
    Ich habe ja nicht behauptet, daß QueryPerformanceCounter() die einzige Funktion wäre, die auf TSC zugreifen kann.

    Auch beim Millisekunden-Timer gibt es jede Menge Funktionen, die auf 8250-Timer zugreifen können, und die ich nicht erwähnt habe.
    Aber das ist nicht der Sinn der Sache.



  • QPC verwendet normalerweise den ACPI/PM Timer afaik. Der TSC ist generell eine äußerst schlechte Idee auf einer multicore CPU...



  • Mmacher schrieb:

    Was ist das für ein Blödsinn? Was kann da nicht stimmen? 😮

    QueryPerformanceFrequency() gibt die Frequenz des PIT/HPET Zählers wieder - welche Frequenz sollte diese Funktion den bei rdtsc wiedergeben? Sicherlich nicht die aktuell Prozessor Geschwindigkeit oder die des Systembus bei APIC (das hätte sich wohl auch herumgesprochen wen es dem so wäre)



  • Ach leude,.. ihr seid die geilsten,... thx 😉



  • Hi,

    zwei Fragen hätte ich noch:

    a) Ab welcher Generation wird RDTSCP (read TSC and Processor ID) unterstützt
    b) Welcher Mnemonic gibt die Performance Frequency aus?

    grüße



  • zeusosc schrieb:

    a) Ab welcher Generation wird RDTSCP (read TSC and Processor ID) unterstützt

    Laut Wikipedia seit dem i586. Aber du willst das sowieso nicht benutzen.

    zeusosc schrieb:

    b) Welcher Mnemonic gibt die Performance Frequency aus?

    Mir scheint du verwechselst da was. QueryPerformanceFrequency mapped nicht einfach auf irgendeine ASM Instruction...



  • @ dot:

    QueryPerformanceCounter und QueryPerformanceFrequency mappen beide auf __imp_NtQueryPerformanceCounter.

    NTSTATUS NtQueryPerformanceCounter(
    __out PLARGE_INTEGER PerformanceCounter,
    __out_opt PLARGE_INTEGER PerformanceFrequency
    );

    Gibt es deine Instruction die PerformanceFrequency in asm direkt aus der CPU zu ermitteln? (Sollte doch eigentlich oder?)

    grüße



  • zeusosc schrieb:

    QueryPerformanceCounter und QueryPerformanceFrequency mappen beide auf __imp_NtQueryPerformanceCounter.

    Ja, aber was hat das mit RDTSC zu tun?

    zeusosc schrieb:

    Gibt es deine Instruction die PerformanceFrequency in asm direkt aus der CPU zu ermitteln? (Sollte doch eigentlich oder?)

    Dazu müsstest du erstmal überhaupt definieren was genau diese PerformanceFrequency deiner Meinung nach sein soll.



  • naja,..
    nach http://archive.gamedev.net/reference/programming/features/timing/
    greift QPC entweder auf PIT/PMT oder halt TSC zu, TSC->RDTSC,...
    und ich will sozusagen die Aktualisierungsfrequenz des TSC um den quotienten von Counterdifferenz und Frequenz in eine Zeit umzurechnen....

    grüüße und dank



  • Verwend doch einfach QueryPerformanceCounter(). Den TSC würd ich besser nicht zur Zeitmessung verwenden. Das war früher mal vielleicht ein gangbarer Weg, aber in Zeiten von Multiprozessorsystemen und Dynamic Frequency Scaling ist das eher keine gute Idee.

    Was genau willst du denn eigentlich anstellen mit der Zeit?



  • Ich möchte die Laufzeit eines Threads 0,5µs genau messen. 🙂
    Eine Implementation mittles QPC/QPF habe ich schon,....

    Grüüße



  • zeusosc schrieb:

    Ich möchte die Laufzeit eines Threads 0,5µs genau messen. 🙂

    Das wird in dieser Genauigkeit wohl zumindest wahnsinnig aufwändig bis praktisch unmöglich. Abgesehen davon gibts das was du willst wohl schon fertig, nennt sich Profiler 😉



  • Mit der genauigkeit sollte es nach genannten Link kein problem geben, das Reaktionsvermögen des Tasks/threads schon eher, welche je nach LAST und Priorisierung latenzen bis zum nächsten QPC Call erzeugen.

    Immerhin sind 0,5µs 2Mhz,...

    Profiler??? bitte Link

    grüßße



  • Eben, du laufst ja nicht allein auf der Maschine, d.h. du misst zumindest ab und zu mit sehr hoher Wahrscheinlichkeit mal alles was sonst noch drankommt mit, und die ganzen Kontextswitches allein brauchen schon ganz sicher weit mehr als 0,5µs. Da bewegen wir uns eher im ms Bereich...

    http://en.wikipedia.org/wiki/Profiling_(computer_programming)
    http://developer.amd.com/tools/CodeAnalyst/Pages/default.aspx



  • (thx, link schaue ich mir nachher an)

    Also: Der Counter muss auf 0,5µs genau sein,... nicht der Call zum Auslesen dessen,... das ist mit QPC/QPF ja schon gewährleistet.

    Mich interessiert dennoch wie ich aus der CPU prozessorspezifisch einen PMC und dessen Frequenz auslesen kann...

    grüße und bis nachher


Log in to reply